Шифрование XOR в Java: потеря данных после дешифрования - PullRequest
1 голос
/ 10 октября 2010

В настоящее время я пишу очень маленькую Java-программу для реализации одноразовой панели, где сама панель (или клавиша) генерируется в виде последовательности байтов с использованием объекта SecureRandom, который высевается с использованием простой строки с алгоритм SHA-512.

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

Когда я пытаюсь зашифровать файл, программа считывает данные по 64 символа за раз (кроме конца файла, который обычно является нечетным числом) и генерирует 64 байта (или совпадающее количество) случайного псевдо байт. XOR выполняется между элементами обоих массивов, результирующий массив char , содержащий символы шифрования, записывается в файл, и процесс повторяется до тех пор, пока весь текст в файле не будет прочитан.

Теперь, поскольку Java обрабатывает все примитивы как числа со знаком (тип данных byte находится в диапазоне от -128 до 127, не 0 до 255), это означает, что операция XOR может ( и приводит к некоторым отрицательным значениям (от -128 до -1). Кажется, что Java не распознает эти значения как действительные ASCII, а просто пишет? (вопросительный знак) в файл для любых отрицательных значений. Когда дело доходит до чтения из файла для расшифровки зашифрованного текста, отрицательное значение, которое привело к? для записи в файл потерян, замените на 63, действительный код ASCII для вопросительного знака.

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

Я должен также упомянуть, что я пытался добавить 128 к каждому результату XOR шифрования, а затем вычесть его перед выполнением XOR дешифрования (чтобы поместить каждое значение в допустимый диапазон ASCII), но? проблема все еще обнаружена, потому что есть 31 код ASCII от 128 до 159, которые я не могу прочитать и отображается как?

Я уже некоторое время отбиваюсь от этой стены, любая помощь приветствуется. Приветствия.

Ответы [ 2 ]

1 голос
/ 10 октября 2010

Это очень запутано.Если вы обрабатываете массив символов, элементы имеют ширину 16 бит, они без знака, и не все значения являются действительными.Так что (а) у вас не может быть проблем со знаками или байтами, и (б) вам вообще не следует этого делать.Вы должны прочитать файл в байтовый массив, выполнить XOR и записать байтовый массив непосредственно в выходной файл.Нет читателей или писателей, нет символов, нет строк.

1 голос
/ 10 октября 2010

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

...