- Notifications
You must be signed in to change notification settings - Fork 19.9k
/
Copy pathAutokey.java
55 lines (42 loc) · 1.99 KB
/
Autokey.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
packagecom.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
* doesn’t rely solely on a repeated key.
* https://en.wikipedia.org/wiki/Autokey_cipher
*
* @author bennybebo
*/
publicclassAutokey {
// Encrypts the plaintext using the Autokey cipher
publicStringencrypt(Stringplaintext, Stringkeyword) {
plaintext = plaintext.toUpperCase().replaceAll("[^A-Z]", ""); // Sanitize input
keyword = keyword.toUpperCase();
StringBuilderextendedKey = newStringBuilder(keyword);
extendedKey.append(plaintext); // Extend key with plaintext
StringBuilderciphertext = newStringBuilder();
for (inti = 0; i < plaintext.length(); i++) {
charplainChar = plaintext.charAt(i);
charkeyChar = extendedKey.charAt(i);
intencryptedChar = (plainChar - 'A' + keyChar - 'A') % 26 + 'A';
ciphertext.append((char) encryptedChar);
}
returnciphertext.toString();
}
// Decrypts the ciphertext using the Autokey cipher
publicStringdecrypt(Stringciphertext, Stringkeyword) {
ciphertext = ciphertext.toUpperCase().replaceAll("[^A-Z]", ""); // Sanitize input
keyword = keyword.toUpperCase();
StringBuilderplaintext = newStringBuilder();
StringBuilderextendedKey = newStringBuilder(keyword);
for (inti = 0; i < ciphertext.length(); i++) {
charcipherChar = ciphertext.charAt(i);
charkeyChar = extendedKey.charAt(i);
intdecryptedChar = (cipherChar - 'A' - (keyChar - 'A') + 26) % 26 + 'A';
plaintext.append((char) decryptedChar);
extendedKey.append((char) decryptedChar); // Extend key with each decrypted char
}
returnplaintext.toString();
}
}