Значение символа в Java-декомпиляторе — «01»

#java

#java

Вопрос:

Нам пришлось декомпилировать и расшифровать файл. При загрузке в декомпилятор java у меня возник вопрос.

Был финал string decryptionkey = "something" . И функция, которая выполняла цикл над пользовательским вводом, который проверял, является ли userresponse.charat(i) - '01' != decryptionkey.CharAt(i) . Мой вопрос в том, что - '01' делает? если ключом дешифрования является, например, ABCD, то логически ответ должен быть ABCD?

Я пробовал это, но безуспешно. Я что-то упускаю?

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

1. Вы указали символ в двойных кавычках, что не имеет смысла. Вы не можете вычесть строку. Если вы имеете в виду '001' , то это целочисленное значение 1. Код проверяет, являются ли два charAt символа смежными в лексикографии.

2. Вы должны показать, что происходит, когда символ равен `01′, иначе мы можем просто строить догадки.

3. Это восьмеричный символьный литерал для символа U 0001 или SOH (начало заголовка)

4. @khelwood исправил это. Я имею в виду userresponse.charat(i) — ’01’. Означает ли лексикография прилагательное, что, например, a = a в этом случае истинно?

Ответ №1:

Во-первых: вы неправильно взяли кавычки. Вам нужны одинарные кавычки, и опять же — отсутствие кавычек вообще сделало бы ситуацию намного понятнее.

Итак, либо вы делаете это:

 //userresponse.charat(i) - "01" //wrong syntax
userresponse.charat(i) - '01';
  

Или вы делаете это:

 //userresponse.charat(i) - "01" //wrong syntax
userresponse.charat(i) - 1;
  

С этим на ваш вопрос проще ответить. Он принимает символ из пользовательского ввода и вычитает единицу.

Это очень слабое шифрование. Каждая буква зашифрована до буквы, соответствующей ей в алфавите. Итак, «BCDE» зашифрован в «ABCD».

Первая буква в алфавите «A» является особенной: хотя она зашифрована таким же образом, буква, предшествующая «A», является не буквой, а «@». Таким образом, «ABCD» будет зашифрован в «@ABC». И чтобы сделать это еще более понятным, «EBCD» было бы зашифровано в «DABC».

 userresponse.charat(i) - '01' != ecryptionkey.CharAt(i)
  

Теперь это имеет больше смысла? Он выбирает букву в позиции i, затем «шифрует» ее и сравнивает с буквой в позиции i шифра «decryptionkey».

Если вы пройдетесь по всем буквам и все совпадут — пользователь действительно ввел тот же обычный текст, который использовался для создания шифра «decryptionkey». Другими словами, если одна буква не совпадает, пользователь получил неправильный обычный текст. Вот о чем «!=».

Давайте посмотрим на пример:

Допустим, пользователь вводит «BCD».

На первом шаге (i = 0) он просматривает первую букву «B» и вычитает 1, что дает «A». Теперь он сравнивает это ‘A’ с первой буквой в decryptionkey.

На втором шаге (i = 1) он будет смотреть на вторую букву, которая является ‘C’, и вычитает 1, что дает ‘B’, и сопоставит ее со второй буквой в decryptionkey.

На третьем шаге (i = 2) он будет смотреть на третью букву, которая является ‘D’, и вычитает 1, что дает ‘C’, и сопоставит ее с третьей буквой в decryptionkey.

Если одна буква не совпадает, она должна завершиться ошибкой (отсюда «!=» ).

Итак, на вопрос «если ключом дешифрования является, например, ABCD, то логически ответом должно быть ABCD?»

Нет! Если ключом дешифрования является, например, «ABCD», то логически ответом должно быть «BCDE»! Поскольку каждая буква ответа вычитается на единицу.

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

1. Спасибо, почти именно то, что мне было нужно. Но по какой-то причине ABC на самом деле BCD, я не знаю почему, ваше решение должно работать, но нет. Но дал мне достаточно подсказок, чтобы разобраться в этом.

2. нет, «BCD» шифруется в «ABC» -> если пользователь вводит «BCD», это соответствует шифру.