在用 C 语言编写了一个基本的基于 LFSR 的流密码加密模块之后,我在通常的文本文件上进行了尝试,然后在 Windows 中的 .exe 文件上进行了尝试。但是,在将其解密后,文件没有运行,给出了一些关于 16 位的错误。显然在解密时出现了一些错误。或者是否制作了文件,以便如果我篡改它们的二进制代码,它们就会损坏?
我正在检查我的文本文件程序,希望能找到我的任何错误。但是,问题是有人尝试在可执行文件上运行您自己的加密程序吗?他们对此有任何明显的答案吗?
在用 C 语言编写了一个基本的基于 LFSR 的流密码加密模块之后,我在通常的文本文件上进行了尝试,然后在 Windows 中的 .exe 文件上进行了尝试。但是,在将其解密后,文件没有运行,给出了一些关于 16 位的错误。显然在解密时出现了一些错误。或者是否制作了文件,以便如果我篡改它们的二进制代码,它们就会损坏?
我正在检查我的文本文件程序,希望能找到我的任何错误。但是,问题是有人尝试在可执行文件上运行您自己的加密程序吗?他们对此有任何明显的答案吗?
可执行文件没有什么特别之处。它们显然是二进制文件,因此包含00
字节和大于 127 的字节。只要您的算法是二进制安全的,它就应该可以工作。
使用十六进制编辑器比较原始文件和解密文件。看看他们有什么不同。
您得到的错误意味着您没有正确解密可执行文件头,因此解密错误一定已经影响了文件的前几个字节。
显然在解密时出现了一些错误。exe 是一个包'o 字节,就像任何其他文件一样,没有魔法。您很可能会遇到无法在文本文件中获得的字节值。像零一样。
解密过程应该是其加密的逆过程。换句话说,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
首先对内存中的字符串执行此操作,以便您可以将算法与文件处理代码隔离开来。一旦证明算法正确反转,您就可以对文件执行相同的操作;正如其他人所说,您很可能在处理二进制文件时遇到问题,这是一个常见的问题。