Метод шифрования Цезаря с пробелами - PullRequest
0 голосов
/ 09 мая 2019

Я работаю над программой cesar cipher, так как мой последний проект в java I. У меня есть метод шифрования, который обрабатывает строчные и прописные буквы.Однако я попал в стену, пытаясь настроить алгоритм для работы коэффициента сдвига в противоположном направлении, чтобы расшифровать текст, уже проходящий через программу.

Другая проблема заключается в том, что я не могу заставить программу работать с пробелами, игнорируя их или зашифровывая их.Пока он только шифрует первое слово и игнорирует остальные.Здесь мой метод шифрования до сих пор, с сообщением, переданным из main () в качестве параметра.

//Caesar Cipher
public class EncryptionClass1 { 
     protected static String encryptedMessageString;

    public static String setEncryptedMessage(String message) { 
        StringBuffer encryptedMessageBuffer = new StringBuffer();
        char newCharacter;
        int shiftFactor = 1;
        int i;

             //for length of secret message
          for (i = 0; i<message.length(); i++) { 
            //uppercase encoder
            if (Character.isUpperCase(message.charAt(i))) { 
                newCharacter = (char)(((int)message.charAt(i) - 
                                  shiftFactor - 65) % 26 + 65); 
                encryptedMessageBuffer.append(newCharacter);          
            }//if close 

            //lowercase encoder
            else { 
                newCharacter = (char)(((int)message.charAt(i) - 
                                  shiftFactor - 97) % 26 + 97); 
                encryptedMessageBuffer.append(newCharacter); 
            }//else close 

          }//for close 
        //convert StringBuffer to string 
        encryptedMessageString = encryptedMessageBuffer.toString();
        return encryptedMessageString;  

    }//setEncryptedMessage close  
}//EncryptionClass1 close 

Для расшифровки, я полагаю, что мне нужно настроить только некоторые операции для метода шифрования,но я не могу точно определить, что.

что касается пробелов, пример ввода и вывода должен быть следующим:

Input: “my secret message”
Output: rp dbxbbf rbddtfb

1 Ответ

0 голосов
/ 09 мая 2019

Чтобы сдвинуться в противоположном направлении, сдвиньте дальше в текущем направлении. Визуализируйте 26 букв алфавита на круговой шкале 360 °. Если шифрование должно вращать (сдвигать) набор на 5 букв вправо, вы обычно думаете о дешифровании как вращение набора на 5 букв влево. Но вы также можете повернуть циферблат на 21 (26 - 5) букв вправо. Таким образом, если шифрование сдвигается shiftFactor вверх, то дешифрование сдвигается 26 - shiftFactor вверх. Сдвигая только вверх, операция % 26 будет корректно оборачивать сдвиг.

Поскольку зашифрованное сообщение всегда точно такой же длины, что и исходное сообщение, и вы заменяете только одну букву за раз, код будет проще, если вы просто работаете с char[] из исходного сообщения. Если вы сделаете это, просто пропустите символы в массиве, которые не являются буквами ASCII.

Вместо использования магических чисел 65 и 97 используйте их значения char, чтобы сделать код более читабельным.

Все вышеперечисленное означает, что ваш код может быть написан так:

private static final int SHIFT_FACTOR = 5;

public static String encryptMessage(String message) {
    return applyShift(message, SHIFT_FACTOR);
}

public static String decryptMessage(String message) {
    return applyShift(message, 26 - SHIFT_FACTOR);
}

private static String applyShift(String message, int shiftFactor) {
    char[] chars = message.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        if (c >= 'A' && c <= 'Z')
            chars[i] = (char) ((c - 'A' + shiftFactor) % 26 + 'A');
        else if (c >= 'a' && c <= 'z')
            chars[i] = (char) ((c - 'a' + shiftFactor) % 26 + 'a');
    }
    return new String(chars);
}

Тест

public static void main(String[] args) {
    test("my secret message");
    test("Hello World!");
}
private static void test(String message) {
    String encrypted = encryptMessage(message);
    System.out.println("Input    : " + message);
    System.out.println("Encrypted: " + encrypted);
    System.out.println("Decrypted: " + decryptMessage(encrypted));
    System.out.println();
}

выход

Input    : my secret message
Encrypted: rd xjhwjy rjxxflj
Decrypted: my secret message

Input    : Hello World!
Encrypted: Mjqqt Btwqi!
Decrypted: Hello World!
...