我需要在嵌入式系统中生成安全的伪随机数。我可以使用现有的SHA2函数作为随机数生成器(n-随机数是SHA2(seed + n)),而不必移植某些RNG库吗?
我担心SHA2散列可能不是均匀分布的(偏向于某些位序列)。
发布于 2020-06-20 10:01:39
虽然SHA2 (SHA-256,SHA-512)最初的设计目标仅限于抗碰撞和(第一和第二)预图像抵抗,但它在计算上是否与固定长度的消息的随机预言区分开来。因此,就我们所知,增量\text{SHA2}(\text{seed}+n)是一个CSPRNG,它是一个足够大的随机秘密种子。如果我们生成2^k输出,而+是加法2,则需要\text{seed}的b+k位来保证b-bit的安全性。
为了增加保险,可以使用\text{HMAC-SHA2}(\text{key}\gets \text{seed},\text{message}\gets n),它只需要很少的额外代码。Mihir的NMAC和HMAC的新证明:无碰撞安全性给出了关于压缩函数较弱假设的安全性论证。主要的缺点是HMAC需要对每个输出的压缩函数进行更多的评估(对于一个简单的实现来说是四个,可能会减少到两个预计算)。
我会使用HMAC,使用SHA-512,而不是SHA-256作为b>120位安全性,或者/并截断输出或异或它的两个部分(这只能帮助安全性),只是为了安全方面的错误。
上述任何一种结构都有一个缺点,即如果恢复发电机的状态,可以以较低的成本找到早期的输出。
请注意,能够访问嵌入式系统的对手可能会尝试提取随机的秘密种子(使用JTAG端口、探测、侧通道攻击…)。,或者用已知值替换它(例如,删除剩余存储区域)。
此外,我要强调的是,很难使一个健壮的增量n面对那些可以在他们选择的任何时候切断电源的对手。
上述三段中的任何一段可能足以证明TRNG与密码增强(CSTRNG)有关的复杂性。
这一限制是必要的,因为它具有延长长度的性质。
\mathbin\|更多地注意到的是二次串联。在这种情况下,我们只需要一个b-bit种子。
安全级别为散列宽度的一半,或\text{seed}的宽度,以最低者为准。
https://crypto.stackexchange.com/questions/81455
复制相似问题