2016-10-01 2 views
1

я был назначен в моем классе AP Java расшифровать следующее: umzDlBF8aFixXOR дешифрование два открытых текст строки

со следующим ключом: oE2dpffzEiFD

Единственной проблемой, я Дон» я знаю, как сделать XOR для их расшифровки. Я получил, насколько превращая их в бинарный код:

ключ: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

шифротекста: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

, но я не знаю, что с этим делать. Если бы вы могли помочь мне с этим, это было бы здорово! Код тоже был бы хорош, но не нужен.

Спасибо, миллион!

+0

Подумайте об этом: если «зашифровать» = ключ XST открытого текста, то не будет «дешифровать» = ключ шифрования Ciphertext XOR? – paulsm4

+0

Хмм .. Я не уверен, что орфографическая ошибка - шутка, но я уверен, что открытый текст - «GiFeMeaPenny» - «Дай мне копейку». –

+0

"строки с открытым текстом", что представляют собой строки открытого текста? –

ответ

0

Оператор XOR обладает тем свойством, что T XOR K XOR K == T, поэтому, если вы хотите зашифровать открытый текст T ключом K, вы примените операцию C = T XOR K и чтобы расшифровать текст вам просто нужно снова применить ту же операцию (T = C XOR K). Вы можете применить операцию XOR к каждому байту в открытом тексте, используя цикл for или функциональную карту программирования.

EDIT: в случае, если вам это нужно, оператор XOR в языках программирования представлен символ "^", поэтому A^B означает XOR B.

EDIT2: простое доказательство того, что T XOR K XOR K = = T, просто так что вы не должны принимать его, как магия:

  • K XOR K явно равен 0
  • T XOR 0 явно равна T
  • Поскольку оператор XOR ассоциативно вместе с двоичными числами , мы можем написать T XOR K XOR K как T XOR (K XOR K) == T XOR 0 == T
0

Вам не нужно превращать их в двоичные. XOR - побитовая операция, поэтому вы можете XOR два байта вместе, и это будет как XORing каждый бит одного байта с соответствующим битом другого байта.

Просто напишите цикл от нуля до (и исключая) длину шифрования, в котором вы читаете каждый символ из шифра, XOR с соответствующим символом из ключа и добавляете результат в StringBuilder. Затем вызовите .toString() на StringBuilder, чтобы получить результат.

Если ваш компилятор жалуется, что он не может XOR символов, затем отливали каждый char к byte, выполнить операцию XOR между байтами, а затем бросили результат в char.

Класс String имеет метод charAt(), который позволяет получить символ из определенного индекса в строке. В качестве альтернативы вы можете начать с получения содержимого каждой строки в виде массива символов. (Для этого есть другая функция.)

В качестве бонуса вы можете сделать так, чтобы ключ не был такой же длины, как и шифр.Вы можете поддерживать отдельный указатель, адресующий символы шифра, и когда этот индекс достигает длины шифрования, вы можете установить его обратно на ноль, тем самым начнув читать шифр с самого начала.

0

Как отмечали другие, «xor» - прекрасный механизм шифрования, поскольку шифрование и дешифрование - это точно такая же операция. Если вы используете каждую часть ключа только один раз, вы можете использовать самый безопасный алгоритм шифрования.

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

Проблема, с которой вы сталкиваетесь, - как вы переходите от символов к значению, которое вы хотите зашифровать. Вы можете взять значения символов Юникода, но вы получите фиктивные результаты с помощью зашифрованного текста и ключа. Проблема с использованием Unicode as-is заключается в том, что после шифрования/дешифрования вы можете получать непечатаемые символы, что обычно не является проблемой, но в примерах учебников трудно печатать непечатаемые символы.

Чтобы расшифровать текст, я сделал предположение, что перевод символов работает так.

  • A - Z => 0 - 25
  • a - z => 26 - 51
  • 0 - 9 => 52 - 61

(мне не нужно угадывать что 62/63 было бы просто пространством и точкой, было бы хорошим догадкой).

Используя это предположение и xor, я беру ваш зашифрованный текст umzDlBF8aFix и ваш ключ oE2dpffzEiFD и заканчивая открытым текстом GiFeMeaPenny.

Поскольку это можно прочитать на английском языке - «Дайте мне пенни» - похоже, что допущения выше правдоподобны.