在NIST SP 800-90A第10.1节(即基于哈希函数)中定义的两个确定性随机位生成器中,哪一个在加密方面更强?


Hash-DRBG(第10.1节) .1)
HMAC-DRBG(第10.1.2节)

在这两者之间是否还有其他标准可供选择?

#1 楼

简短的答案:HMAC-DRBG强而不弱。 Hash-DRBG更快。

根据这些NIST幻灯片中的第42页。我们对NIST SP 800-90中使用HMAC的DRBG进行了积极的安全性分析,加上2017年以来的安全证明(假设HMAC是PRF)。
..如果使用的哈希函数$ H $与随机函数没有区别,则哈希DRBG似乎是安全的。对于生成的第一个序列,这甚至是微不足道的,它们是$ H(V),H(V + 1),H(V + 2),\ dots $,其中$ V $源自种子材料。

但是,Hash-DRBG在经过一层$ H $之后,会以一种已知的,简单的,几乎线性的方式公开从秘密种子$ V $派生的几个值。相比之下,HMAC-DRBG的输出是HMAC结果,其从秘密$ K $派生而来经过两层$ H $。这是有理由相信,假设$ H $处于疲软状态,HMAC-DRBG比Hash-DRBG对状态恢复的弹性更大。

基于同样的思路,HMAC-DRBG的安全性源自于HMAC的构造,此结构具有安全性证明,可对$ H $进行较弱的假设,并且即使基础哈希函数屈服,也具有保持强大的历史记录:HMAC-MD5始终如一的AFAIK,尽管可以实时获取MD5冲突,并且存在理论上的图像前攻击; HMAC-MD4已损坏,但最佳的攻击依旧需要2 ^ 77的哈希值。

评论


$ \ begingroup $
准确地说:HMAC-DRBG不比Hash-DRBG弱。我们没有迹象表明Hash-DRBG在任何方面都很弱,并且您不能严格做到这一点。但是,我们有充分的理由相信HMAC-DRBG不能比Hash-DRBG弱(对HMAC-DRBG的攻击可能对Hash-DRBG也同样有效)。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011年12月2日,12:49

#2 楼

为了补充fgrieu的简短答案,这里是两个RNG算法集的概述。

Hash-DRBG

Hash-DRBG的状态由值$ V $组成。 (每次请求新位时都会更新),相同大小的常量$ C $(仅在重新生成生成器时更新),以及计数器$ c $来跟踪何时需要下一次重新生成。 >
通过连接$ H(V),H(V + 1),H(V + 2),\ dots $直到产生足够的位,只有$ V $可直接用于生成新位。

每次生成新位后,均将常量,计数器和该值的哈希版本添加到该值以生成新值:

$$ V _ {\ text {new}} = V + H(\ text {0x03} || V)+ C + c $$

然后$ c $加1。

您还可以向生成器提供其他输入,在这种情况下,将在生成输出之前执行另一个$ V _ {\ text {new}} = H(\ text {0x02} || V || A)$的哈希调用。 br />
用于初始播种和播种的广告aptable-output-size版本$ H $的$ \ tilde H $(在10.4.1节中定义)用于为$ V $和$ C $生成足够的位。

Hash- DRBG依靠$ V $和$ C $保密。对于$ V $,这是哈希函数的原像电阻(因为$ V $被哈希以生成输出),而$ C $可以很容易地从两个(或者三个,如果计数器值未知)派生连续的$ V $值(直接添加)。

由此可以预测以下输出,直到应用程序添加不可预测的附加数据或重新填充状态。 >
(当然,我们还需要$ H $的输出是伪随机的,即没有可检测的模式。)

初始化:$ H $的值是通过哈希创建的“种子材料”和常量$ C $,然后通过对$ V $(带有$ 0 $的前缀字节)进行哈希处理(都产生440位)。

HMAC-DRBG

在HMAC-DRBG中,状态由键$ K $,值$ V $和计数器c组成(以跟踪何时需要种子-它本身并不用于生成种子)。
<实际的随机位生成使用

$$ V:= HMAC(K,V)$$

循环并连接这些新的$ V值$,直到生成足够的输出。

此后,调用更新函数,该函数通过两次HMAC计算来更改键和值:

$$ \ begin {align * }
K _ {\ text {new}}&= HMAC(K _ {\ text {old}},V _ {\ text {old}} || \ text {0x00})\\
V_ { \ text {new}}&= HMAC(K _ {\ text {new}},V _ {\ text {old}})
\ end {align *} $$

更新可以或者也可以使用总共四个这样的调用来合并应用程序提供的其他数据$ A $:

$$ \ begin {align *}
K _ {\ text {tmp}}&= HMAC(K _ {\ text {old}},V _ {\ text {old}} || \ text {0x00} || A)\\
V _ {\ text {tmp}}&= HMAC(K_ { \ text {tmp}},V _ {\ text {old}})\\
K _ {\ text {new}}&= HMAC(K _ {\ text { tmp}},V _ {\ text {tmp}} || \ text {0x01} || A)\\
V _ {\ text {new}}&= HMAC(K _ {\ text {new}},V _ {\ text {tmp}})\ end {align *} $$

(如果将附加输入赋给了generate函数,则将在生成更多输出之前和之后调用update。)这也将用于播种和重新播种,其中附加数据包含熵输入(可能还有任何应用程序) HMAC-DRBG的安全性取决于密钥$ K $保持秘密($ V $的中间值直接作为伪随机位输出),即依赖于密钥$ R $的抵抗性。 HMAC。

如果知道$ K $的值,则可以导出以下所有值,直到应用程序添加不可预测的附加数据或发生重新播种为止。

但是除了这个最坏的情况之外,哈希函数的输出中可能还存在其他弱点,这些弱点使HMAC的输出成为非随机的(即显示模式)。理想情况下,我们希望HMAC输出是输入的伪随机函数。

初始化:HMAC_DRBG_Instantiate_algorithm函数在先调用Update之前将$ K $设置为0,将$ V $设置为$ 0x01010101 \ dots01 $。

摘要

人们可以看到,HMAC-DRBG的混洗比Hash-DRBG ...和HMAC多本身甚至包含两个哈希调用。因此HMAC-DRBG肯定较慢。

但是,由于HMAC的任何可能的弱点都将来自底层哈希函数的弱点,因此HMAC不能比哈希更弱...但是它可能更强大(即哈希函数的某些弱点不会转移到相应的HMAC)。到目前为止,这两种构造都没有弱点。

评论


$ \ begingroup $
是否有有关$ V $初始值的信息?
$ \ endgroup $
–克里斯·史密斯(Chris Smith)
2012年6月10日17:53

$ \ begingroup $
@ChrisSmith:我的回答并不是要作为替代的规范和实施指南,而只是从密码学角度进行概述。为此,初始值根本不重要。但是我再次查看了标准并添加了附录D中的相关信息。
$ \ endgroup $
–PaŭloEbermann
2012年6月10日19:52