Обращение оператора модуля для дешифрования

#java #arrays #oop #encryption

#java #массивы #ооп #шифрование

Вопрос:

Для школы у меня есть задание зашифровать четырехзначное целое число по следующим требованиям.

Компания хочет передавать данные по телефону, но они обеспокоены тем, что их телефоны могут прослушиваться. Все их данные передаются в виде четырехзначных целых чисел. Они попросили вас написать метод, который будет шифровать их данные, чтобы их можно было передавать более надежно. Ваш метод должен считывать четырехзначное целое число и шифровать его следующим образом: Замените каждую цифру на (сумма этой цифры плюс 7) по модулю 10. Затем поменяйте местами вторую цифру с четвертой. Затем выведите зашифрованное целое число. Напишите отдельный метод, который вводит зашифрованное четырехзначное целое число и расшифровывает его для формирования исходного числа.

Шифрование четырехзначного числа не было такой проблемой, я преобразовал его в строку, затем в char массив, а затем отдельно зашифровал числа в соответствии с их потребностями.

Метод, который я сделал, выглядит следующим образом:

 public int encrypt4DigitNumber(int number) throws Exception {
    String numberAsString = String.valueOf(number);
    if (numberAsString.length() != 4) {
        throw new Exception("The digit has to be 4 digits long");
    }
    int[] numbers = new int[4];

    char[] numbersAsChars = numberAsString.toCharArray();
    for (int index = 0; index < numbersAsChars.length; index  ) {
        int currentNumber = Character.getNumericValue(numbersAsChars[index]);
        int numberToReplace = (currentNumber   7) % 10;

        numbers[index] = numberToReplace;
    }

    int second = numbers[1];
    int fourth = numbers[3];

    numbers[1] = fourth;
    numbers[3] = second;

    StringBuilder encryptedNumberStringBuilder = new StringBuilder();
    for (int encryptedNumber : numbers) {
        encryptedNumberStringBuilder.append(encryptedNumber);
    }

    String encryptedNumberString = encryptedNumberStringBuilder.toString();
    return Integer.parseInt(encryptedNumberString);
}
  

Проблема возникла, когда мне пришлось расшифровать зашифрованный четырехзначный код.

Я знаю, что мне пришлось поменять местами 2 элемента массива и добавить 7 к каждому числу в массиве.

То, что я не знал, как сделать, это отменить оператор модуля, единственное, что я могу придумать, это умножить текущее число на 10, но это не сработает.

После некоторых исследований мне нужно где-то найти остатки от модуля, но я абсолютно не представляю, как это сделать. Нужно ли мне также возвращать их в функции encrypt и передавать их в функцию decrypt ?

Может ли кто-нибудь объяснить процесс изменения оператора модуля?

Ответ №1:

Если вы зашифруете число от 0 до 9 (= mod 10) со смещением 7, вы, конечно, можете вычесть смещение из каждой цифры во время расшифровки и обернуть вокруг, если число отрицательное, но это не очень приятно:

 int numberToReplace = currentNumber - 7;
if (numberToReplace < 0) {
    numberToReplace  = 10;
}
  

Если смещение шифрования равно 7, то смещение дешифрования будет равно 3 (10 — 7). Вы могли бы просто добавить 3 к каждой цифре и применить mod 10, чтобы расшифровать их.

 int numberToReplace = (currentNumber   3) % 10;
  

Комментарии:

1. Я не понимаю, какую сумму вы используете, что вы подразумеваете под смещением 7?

2. В вашем коде есть только один 7, и это то, что я имею в виду: (currentNumber 7) % 10; . Сумма 7 и 3 компенсирует друг друга, если у нас есть модуль 10.

Ответ №2:

Давайте посмотрим, что на самом деле делают (i 7) % 10:

 0 = 7
1 = 8
2 = 9
3 = 0
4 = 1
5 = 2
6 = 3
7 = 4
8 = 5
9 = 6
  

Как вы можете видеть, здесь определенно есть вполне очевидная закономерность. Итак, чтобы расшифровать нашу исходную цифру обратно, мы должны сделать

 (i   3) % 10
  

Комментарии:

1. Как вы даже… что?… Как это вообще работает? Откуда берется это 3?

2. @Bas если вы добавляете 7 к своей цифре и принимаете результат по модулю 10, то для получения исходного числа вам нужно добавить (10 — 7) к новому числу и снова принять модуль 10. Вы можете думать об этом как (7 3) % 10 == 0 (без сдвига), поэтому, добавив 3, вы получите свой исходный номер обратно