Мой первый пост здесь, так что терпите меня. Я должен изменить данную программу, чтобы Цезарь-шифр сделал ключ из трех цифр в отличие от предыдущего 1. Код, который у меня есть:
/** Class for doing the encryption and decryption using the Caesar Cipher. */
public class CaesarCipher {
protected char[] encoder = new char[26]; // Encryption Array
protected char[] decoder = new char[26]; // Decryption Array
protected int[] r_array = new int[3];
/** Constructor that initializes the encryption and decryption arrays. */
public CaesarCipher(int rotation) { // function begins by changing input rotation into an array of digits
String number = String.valueOf(rotation);
for(int i = 0; i < number.length(); i++) {
int r = Character.digit(number.charAt(i), 10);
r_array[i] = r; // input changed to array
}
//TODO: fix three digit decryption
for (int k = 0; k < 26; k+=3) {
// Origianlly there was one for loop with a k++ that cycled through the rotation directly, as oppose to r_array.
encoder[k] = (char) ('A' + (k + r_array[0]) % 26);
decoder[k] = (char) ('A' + (k - r_array[0] + 26) % 26);
}
for (int k = 1; k < 26; k+=3) {
encoder[k] = (char) ('A' + (k + r_array[1]) % 26);
decoder[k] = (char) ('A' + (k - r_array[1] + 26) % 26);
}
for (int k = 2; k < 26; k+=3) {
encoder[k] = (char) ('A' + (k + r_array[2]) % 26);
decoder[k] = (char) ('A' + (k - r_array[2] + 26) % 26);
}
}
/** Returns String representing encrypted message. */
public String encrypt(String message) {
return transform(message, encoder); // use encoder array
}
/** Returns decrypted message given encrypted secret. */
public String decrypt(String secret) {
return transform(secret, decoder); // use decoder array
}
/** Returns transformation of original String using given code. */
private String transform(String original, char[] code) {
char[] msg = original.toCharArray();
for (int k=0; k < msg.length; k++) {
if (Character.isUpperCase(msg[k])) {
int j = msg[k] - 'A';
msg[k] = code[j];
}
if (Character.isLowerCase(msg[k])) {
int j = msg[k] - 'a';
msg[k] = code[j];
}
}
return new String(msg);
}
}
Тогда был отдельный класс для основного.
public class CipherDriver {
/** Simple main method for testing the Caesar cipher */
public static void main(String[] args) {
/** Uses user input to create new message */ // Added for practice
Scanner input_1 = new Scanner(System.in);
System.out.println("\nEnter desired message or enter 'DEFAULT' to use default message: ");
String input_m = input_1.nextLine();
String d_string = "DEFAULT";
if (input_m.equals(d_string)) { // builds a default message
input_m = "CAESAR HAS NAMED SOMETHING AFTER HIMSELF, AGAIN.";
}
System.out.println("Encoding message... \n");
/** Uses user input to assign new encryption key */
Scanner input_2 = new Scanner(System.in);
System.out.println("Enter three digit rotation to generate cipher: ");
int rotation = input_2.nextInt();
System.out.println("Generating cipher code... \n");
CaesarCipher cipher = new CaesarCipher(rotation);
String message = input_m;
/** Uses user input to determine whether the user wishes to encrypt or decrypt the message */
Scanner input_3 = new Scanner(System.in);
System.out.println("1. Encrypt \n2. Decrypt \n3. Encrypt then Decrypt \n " +
"\nEnter number for desired function: ");
int option = input_3.nextInt();
if (option == 1) {
System.out.println("Encrypting message... ");
System.out.println("Message: " + message);
System.out.println("Encryption code = " + new String(cipher.encoder));
String coded = cipher.encrypt(message);
System.out.println("Encrypted secret: " + coded);
}
if (option == 2) {
System.out.println("Decrypting message... ");
System.out.println("Secret: " + message);
System.out.println("Decryption code = " + new String(cipher.decoder));
String answer = cipher.decrypt(message);
System.out.println("Decrypted message: " + answer); //should print plaintext again
}
if (option == 3) {
System.out.println("\nMessage: " + message);
System.out.println("\nEncrypting message... \n");
System.out.println("Encryption code = " + new String(cipher.encoder));
String coded = cipher.encrypt(message);
System.out.println("Encrypted secret: " + coded);
System.out.println("\nDecrypting message... \n");
System.out.println("Decryption code = " + new String(cipher.decoder));
String answer = cipher.decrypt(coded);
System.out.println("Decrypted message: " + answer); //should print plaintext again
}
}
}
Выводы, которые я получал, были, ну, в общем-то, неправильными.
Enter desired message or enter 'DEFAULT' to use default message:
DEFAULT
Encoding message...
Enter three digit rotation to generate cipher:
123
Generating cipher code...
1. Encrypt
2. Decrypt
3. Encrypt then Decrypt
Enter number for desired function:
3
Message: CAESAR HAS NAMED SOMETHING AFTER HIMSELF, AGAIN.
Encrypting message...
Encryption code = BDFEGIHJLKMONPRQSUTVXWYAZB
Encrypted secret: FBGTBU JBT PBNGE TRNGVJLPH BIVGU JLNTGOI, BHBLP.
Decrypting message...
Decryption code = ZZZCCCFFFIIILLLOOORRRUUUXX
Decrypted message: CZFRZR IZR OZLFC ROLFUIIOF ZFUFR IILRFLF, ZFZIO.
Как я могу заставить программу правильно использовать клавишу git из трех клавиш?