我正在编写一个适用于<!> quot; streams <!>“的XXTEA加密算法的实现,即可以像:crypt mykey <!> lt; myfile <!> gt;输出

其中一个必要条件是它根本无权访问该文件(它只读取固定大小的块直到找到EOF)。算法需要数据字节是4的倍数,因此需要添加填充。

对于纯文本,一个好的解决方案是使用NULL填充,并且在解密时只是忽略NULL,但是相同的策略不能用于二进制流(可以包含嵌入的NULL)。

我已经阅读了常见的解决方案,比如填充缺少字符的数量(如果它错过3个字符,然后在最后添加3个,3个,3个等),但我想知道:这是一个更优雅的解决方案?

有帮助吗?

解决方案

阅读问题看起来安全问题看起来没有实际意义。简单地说,你有一个api,它需要4个字节的倍数作为输入,你不会总是这样。

如果无法保证二进制流不关心,那么在任何二进制流上最多添加3个字节是危险的。将0添加到exe文件的末尾并不重要,因为exe文件具有指定所有剩余位的相关大小的头。将0添加到pcx文件的末尾会破坏它,因为pcx文件具有从文件末尾开始特定字节数的标头。

所以你真的别无选择 - 没有选择你可以使用的魔术填充字节,保证在二进制流结束时不会自然发生:你必须总是追加至少一个描述所用填充字节的附加双字信息。

其他提示

阅读: http://msdn.microsoft的.com / EN-US /库/ system.security.cryptography.paddingmode.aspx

它有一个常见的填充方法列表,例如:

PKCS7 - PKCS#7填充字符串由一系列字节组成,每个字节都等于添加的填充字节总数。

ANSIX923填充字符串由长度之前填充零的字节序列组成。

ISO10126填充字符串由长度之前的随机数据组成。

示例:

原始数据:01 01 01 01 01

PKCS#7:01 01 01 01 01 03 03 03

ANSIX923 01 01 01 01 01 00 00 03

ISO10126:01 01 01 01 01 CD A9 03

阅读密文窃取。它可以说比明文填充更优雅。另外,我建议使用大于4字节的块大小 - 64位可能是最低限度。

严格地说,自己动手加密是一个危险的想法;很难打败整个加密社区尝试过但未能破解的算法。玩得开心,并考虑阅读这个,或至少阅读Schneier的内容<! >“相关阅读<!>”;部分。

实际上我希望一个好的流密码根本不需要填充。 RC4例如不需要填充,并且是非常强的流密码。但是,如果攻击者可以将不同的所选数据提供给加密例程(始终使用相同的密钥),并且还可以访问加密数据,则可能会受到攻击。选择正确的输入数据并分析输出数据可用于恢复加密密钥,而无需暴力攻击;但除此之外,RC4非常安全。

如果需要填充,则不是流密码恕我直言。好像你填充4字节的倍数或16字节的倍数,有什么巨大的区别?如果填充为16字节的倍数,则可以使用几乎任何分组密码。实际上你的密码是块密码,它只适用于4字节块。它是系统中的流密码,其中每个<!>符号<!>是4字节(例如,当加密UTF-32文本时,在这种情况下,数据肯定是4的倍数,因此永远不会有任何填充)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top