我在新的SHA-3标准中注意到它有一个可变的输出大小。知道较长的输出明显更好(更高的熵),理论上输出大小的下限是什么?我的散列输出可以是8位长吗?我知道在大多数情况下,这是不安全的。
发布于 2015-08-16 15:28:05
SHA-3标准既旧又新.
这是“老”,因为选择SHA-3哈希函数的竞争始于2009年,我们知道自2012年以来,Keccak就赢了。
另一方面,考虑到FIPS-202是在2015年8月标准化的,SHA-3的标准化是相当新的。
如果要使用SHA-3,最短输出长度为224位(SHA3-224),SHA-3的最长输出长度为512位(SHA3-512)。
但是,FIPS-202: SHA-3标准:基于置换的散列和可扩展输出函数还定义了两个可扩展的输出函数(XOFs):SHAKE128和SHAKE256,它们都具有可变的输出长度。注意,由于填充的不同,SHA3 128-256与SHA3-256不一样。
抖动函数允许任意输出长度,只要Keccak支持它。由于Keccak是建立在海绵结构的基础上的,所以双长输出是没有问题的,但是通过简单的截断就可以得到任意的短输出。抖动函数接受以位为单位的摘要长度,不执行任何下限检查,这意味着1位是这些函数的最短输出。
发布于 2016-12-29 23:08:50
如果您查看FIPS 202 ( SHA-3标准文档),就会定义抖动可扩展输出函数(XOFs)如下(第20-21页):
SHAKE128(M, d) = KECCAK[256](M || 1111, d),
SHAKE256(M, d) = KECCAK[512](M || 1111, d)....where M是要散列的消息,d是所需的输出长度。KECCAK函数在第20页中定义:
KECCAK[c](N, d) = SPONGE[KECCAK-p[1600, 24], pad10*1, 1600–c](N, d).SPONGE算法在第18页中定义,它们指定d的值可以是任何非负整数。
因此,抖动函数允许的最短输出大小实际上是0位。
本文件第23页中的表4概述了各种SHA功能的安全级别。对于抖动,以输出大小d作为参数的公式给出了安全性级别。例如,对于SHAKE128:
min(d/2, 128)位;min(d, 128)位。min(d, 128)比特。应用这些公式,当d = 0获得这些安全级别时(对于SHAKE128和SHAKE256):
n-bit安全级别意味着攻击者只能在2^n尝试中获得成功。因此,0位安全级别意味着攻击者成功的次数不超过2^0。为了证明这一点,下面是对0位输出长度SHAKE256的成功碰撞攻击:
SHAKE256(0x00, 0) = SHAKE256(0xff, 0)所以数学计算得很好,零长度的抖动输出和听起来一样安全。
知道更长的输出明显更好(高熵) ...
正如其他答案所指出的那样,更长的时间并不一定意味着更好。我上面提到的公式( FIPS 202第23页)给出了一个精确的答案:
发布于 2015-12-06 13:40:41
Keccak函数的内部状态为1600位,一度高达4800位。不管输出大小如何,内部状态是决定安全性的因素,而不是压缩到的长度。
https://security.stackexchange.com/questions/96946
复制相似问题