Implementing and solving vigenere and beaufort ciphers