В настоящее время я пишу очень маленькую 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, которые я не могу прочитать и отображается как?
Я уже некоторое время отбиваюсь от этой стены, любая помощь приветствуется.
Приветствия.