Add autokey cipher (#5569)

This commit is contained in:
Benjamin Burstein
2024-10-06 01:37:56 -04:00
committed by GitHub
parent f34fe4d840
commit 07cb6c46a8
2 changed files with 91 additions and 0 deletions

View File

@ -0,0 +1,55 @@
package com.thealgorithms.ciphers;
/**
* The Autokey Cipher is an interesting and historically significant encryption method,
* as it improves upon the classic Vigenère Cipher by using the plaintext itself to
* extend the key. This makes it harder to break using frequency analysis, as it
* doesnt rely solely on a repeated key.
* https://en.wikipedia.org/wiki/Autokey_cipher
*
* @author bennybebo
*/
public class Autokey {
// Encrypts the plaintext using the Autokey cipher
public String encrypt(String plaintext, String keyword) {
plaintext = plaintext.toUpperCase().replaceAll("[^A-Z]", ""); // Sanitize input
keyword = keyword.toUpperCase();
StringBuilder extendedKey = new StringBuilder(keyword);
extendedKey.append(plaintext); // Extend key with plaintext
StringBuilder ciphertext = new StringBuilder();
for (int i = 0; i < plaintext.length(); i++) {
char plainChar = plaintext.charAt(i);
char keyChar = extendedKey.charAt(i);
int encryptedChar = (plainChar - 'A' + keyChar - 'A') % 26 + 'A';
ciphertext.append((char) encryptedChar);
}
return ciphertext.toString();
}
// Decrypts the ciphertext using the Autokey cipher
public String decrypt(String ciphertext, String keyword) {
ciphertext = ciphertext.toUpperCase().replaceAll("[^A-Z]", ""); // Sanitize input
keyword = keyword.toUpperCase();
StringBuilder plaintext = new StringBuilder();
StringBuilder extendedKey = new StringBuilder(keyword);
for (int i = 0; i < ciphertext.length(); i++) {
char cipherChar = ciphertext.charAt(i);
char keyChar = extendedKey.charAt(i);
int decryptedChar = (cipherChar - 'A' - (keyChar - 'A') + 26) % 26 + 'A';
plaintext.append((char) decryptedChar);
extendedKey.append((char) decryptedChar); // Extend key with each decrypted char
}
return plaintext.toString();
}
}