假设我有两个数组:
A=单个字节,为零。B=两个字节,都是零。
(即B以A开头,仅通过附加一个零字节来区别)
BLAKE2(A) != BLAKE2(B)
然而,根据我所能找到的很少的文档,零字节的BLAKE2 pads。
假设一个只有一个字节的数组和一个两个字节的数组都在单个块的大小之内,理论上它们的完全块长度零填充等价物是相同的。
因此,如果它没有用长度指示符填充输入,如果稀少文档中提到的终结标志要么是所有二进制1s,要么是所有二进制0,因为缺少的文档清楚地声明了(因此没有指明最终输入块中的哪个字节是填充的),那么BLAKE2如何能够为这两个输入生成不同的散列呢?
注意:它确实与这两个输入产生了不同的散列,这是一件非常好的事情,我正在编写一些依赖于BLAKE2属性的软件,但是如果我理解为什么/如何发生这种情况,我会更有信心。谢谢!
我试着标记这个BLAKE2,但是系统不允许我--显然标签还不存在。
发布于 2015-01-26 19:05:42
您是对的,填充的消息本身是不明确的。
但是Blake2压缩函数不只是将消息块和链接值作为输入。它还使用一个终结标志(标记最后一个块并防止长度扩展)和消息大小(以字节为单位)。
将大小传递给非最终块主要是为了防止某些多目标攻击。对于这些块,大小总是块大小的倍数。对于最后一个块,它是不同的:这里的size参数是消息的总大小(以字节为单位),它消除了映射到相同的零填充消息而仅在大小上不同的消息的歧义。该标志确保压缩以当前块结尾的消息和继续(因此具有相同大小参数)的消息具有不同的输入。
除了Nova已经引用的规范之外,阅读以下内容可能也很有趣:
https://crypto.stackexchange.com/questions/22601
复制相似问题