Программа шифрования / дешифрования не работает должным образом - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать программу, которая принимает символы со значениями ascii от 32 до 126 и сдвигает их на 9 пробелов для их шифрования.Тогда я хочу расшифровать это.Он успешно расшифровывает большинство значений, но последний набор не делает.Вот мой код ниже:

public static void main(String[] args) {

    final int SIZE = 95; // total # of ascii vals being used
    int[] availableChars = new int[SIZE];
    int[] ePhrase = new int[SIZE];
    int[] dePhrase = new int[SIZE];

    for(int i = 0; i < SIZE; i++){
        availableChars[i] = (i + 32);
    }

    for(int i = 0; i < SIZE; i++){
        ePhrase[i] = encrypt(availableChars[i] - 32);
    }

    for(int i = 0; i < SIZE; i++){
        dePhrase[i] = decrypt(ePhrase[i] - 32);
    }
    System.out.print("\n");

    for(int i = 0; i < SIZE; i++){
        System.out.print(i + " ");
    }
    System.out.print("\n");

    for(int i = 0; i < SIZE; i++){
        System.out.print((char)availableChars[i] + " ");
        if(i >= 10){
            System.out.print(" ");
        }
    }

    System.out.print("\n");

    for(int i = 0; i < SIZE; i++){
        System.out.print((char)ePhrase[i] + " ");
        if(i >= 10){
            System.out.print(" ");
        }
    }   

    System.out.print("\n");

    for(int i = 0; i < SIZE; i++){
        System.out.print((char)dePhrase[i] + " ");
        if(i >= 10){
            System.out.print(" ");
        }
    }

}

public static int encrypt(int val){
    return ((val + 9) % 94) + 32;
}

public static int decrypt(int val){
    return ((val - 9) % 94) + 32;
}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Помимо двух незначительных проблем, ваш алгоритм в порядке.Первый недостаток заключается в том, что операция по модулю должна учитывать все символы алфавита, а это 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 в зашифрованном тексте.

0 голосов
/ 20 февраля 2019

Я вижу, что здесь происходит несколько вещей.

Первое, что SIZE - это 95, но затем вы моддируете с 94. Это приведет к отображению двух разных символов открытого текста втот же зашифрованный символ.

Чтобы понять проблему с decrypt, представьте себе, что происходит, когда закодированный символ, скажем, 37. Вы вычитаете 32 перед вызовом decrypt, давая 5. (Почему бы не сделать это вdecrypt?) Затем вы вычитаете 9, давая -4.Далее мод 94 дает еще -4.Затем вы добавляете 32, что дает 28, что находится за пределами вашего допустимого диапазона.

Что вы должны сделать вместо вычитания 9, это добавить 85, что составляет 94 (ваше число, которое я считаю неправильным, но давайте продолжим)минус 9. Вместо -4 у вас теперь 90. Затем вы мод 94 (еще 90) и добавляете 32, чтобы получить 122, что находится в пределах вашего допустимого диапазона.

...