Помимо двух незначительных проблем, ваш алгоритм в порядке.Первый недостаток заключается в том, что операция по модулю должна учитывать все символы алфавита, а это 95 вместо 94, как уже объяснил Уиллис в своем ответе.
Вторая проблема заключается в том, что вы используете неправильный оператор по модулю.При расшифровке термин (val - 9)
может стать отрицательным.Однако для отрицательных чисел математическое определение операции по модулю отличается от определения во многих языках программирования (включая Java).В алгоритме Цезаря-Шифра математический модуль-оператор упоминается и, следовательно, должен использоваться в реализации.См. Также: Шифрование / дешифрование строки с использованием аффинного шифра с использованием исходной таблицы ASCII 128
Математический оператор по модулю можно определить в терминах Java-оператора по модулю %
какследует:
private static int mod(int a, int b) {
return ((a % b) + b) % b;
}
В качестве альтернативы можно использовать метод int Math.floorMod(int a, int b)
.См. Также: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Math.html#floorMod(int,int)
Для использования этого mod
-оператора (а также правильного делителя 95
) замените в своем encrypt
-методе
return ((val + 9) % 94) + 32;
на
return mod(val + 9, 95) + 32;
и в вашем decrypt
-методе
return ((val - 9) % 94) + 32;
с
return mod(val - 9, 95) + 32;
Тогда вывод будет:
0 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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ! " # $ % & ' (
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
Теперь,совпадения в простом и дешифрованном тексте, и все символы в простом тексте смещены на 9 в зашифрованном тексте.