После шифрования исполняемый файл становится неисполняемым

Написав базовый модуль шифрования потокового шифра на основе LFSR на C, я попробовал его на обычных текстовых файлах, а затем на .exe-файле в Windows. Однако после расшифровки обратно файл не запускается, выдавая ошибку о том, что он 16-битный. Видимо какая-то ошибка в расшифровке. Или файлы сделаны так, что если я вмешиваюсь в их двоичный код, они становятся поврежденными?

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


person AruniRC    schedule 16.12.2011    source источник
comment
поскольку то, что вы сказали, подразумевает, что оно работает с текстовыми файлами, убедитесь, что вы открываете входные и выходные файлы в двоичном режиме (применяется в основном к окнам и dos, поскольку в Unix нет текстового режима)   -  person Dan D.    schedule 16.12.2011
comment
да, они открываются в бинарном режиме.   -  person AruniRC    schedule 17.12.2011


Ответы (3)


В исполняемых файлах нет ничего особенного. Очевидно, что это двоичные файлы, поэтому они содержат 00 байт и байт >127. Пока ваш алгоритм безопасен для двоичных файлов, он должен работать.

Сравните исходный файл и расшифрованный файл с помощью hex-редактора. Чтобы увидеть, чем они отличаются.

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

person CodesInChaos    schedule 16.12.2011

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

person Hans Passant    schedule 16.12.2011

Процесс дешифрования должен быть обратным его шифрованию. Другими словами, Decrypt(Encrypt(X)) == X для всех входов X, всех возможных длин, всех возможных значений байтов.

Я предлагаю вам создать тестовую систему, которая будет выполнять несколько попарных проверок с рандомизированными данными, чтобы вы могли убедиться, что эти два преобразования действительно компенсируют друг друга. Я имею в виду что-то вроде:

for length from 0 to 1000000:
 generate a string of that length with random contents
 encrypt it to a fresh memory buffer
 decrypt it to a fresh memory buffer
 compare the decrypted string with the original string     

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

person crazyscot    schedule 17.12.2011