我正在写一个XXTEA加密算法的实现,它在“流”上工作,即可以像这样使用: crypt mykey < myfile >输出。
其中一个必要条件是它根本没有访问文件的权限(在找到EOF之前,它只读取固定大小的块)。该算法要求数据字节数是4的倍数,因此需要增加一个填充。
对于纯文本,一个很好的解决方案是用NULL填充,在解密时只需忽略NULL,但同样的策略不能用于二进制流(可以包含嵌入的NULL)。
我读过常见的解决方案,比如填充缺少的字符数(如果缺少3个字符,则在末尾添加3,3,3)等等,但我想知道:有没有更优雅的解决方案?
发布于 2008-10-14 15:54:52
阅读这个问题,它看起来安全方面是没有意义的。简单地说,您有一个api,它需要4字节的倍数作为输入,但您并不总是这样。
如果你不能保证二进制流不关心,那么在二进制流上追加3个字节是很危险的。将0附加到exe文件的末尾并不重要,因为exe文件具有指定所有剩余位的相关大小的头。将0附加到pcx文件的末尾会破坏它,因为pcx文件有一个从文件末尾开始的特定字节数的头。
所以实际上你别无选择--你没有可以使用的魔术填充字节的选择,这些字节保证永远不会自然地出现在二进制流的末尾:你必须总是附加至少一个描述所使用的填充字节的额外的dword信息。
发布于 2008-10-03 23:44:52
阅读:http://msdn.microsoft.com/en-us/library/system.security.cryptography.paddingmode.aspx
它有一个常见填充方法的列表,例如:
PKCS7 - PKCS #7填充字符串由一个字节序列组成,每个字节都等于添加的填充字节总数。
ANSIX923填充字符串由长度前用零填充的字节序列组成。
ISO10126填充字符串由长度之前的随机数据组成。
示例:
原始数据: 01 01 01
PKCS #7: 01 01 01 03 03 03
ANSIX923 01 01 01 00 00 03
ISO10126: 01 01 01 CD A9 03
发布于 2008-10-03 23:52:44
阅读ciphertext stealing上的内容。它可以说比纯文本填充要优雅得多。另外,我建议使用大于4字节的块大小-- 64位可能是最小的。
严格地说,do密码术是一个危险的想法;很难击败整个密码界已经尝试过但失败了的算法。享受乐趣,并考虑阅读this,或者至少阅读Schneier的“相关阅读”部分的内容。
https://stackoverflow.com/questions/169334
复制相似问题