Чтобы сдвинуться в противоположном направлении, сдвиньте дальше в текущем направлении. Визуализируйте 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!