#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, вы получите свой исходный номер обратно