我了解到TRNG的输出几乎是不可能复制的,例如将硬币翻转100次以生成100位序列。但是,根据我的理解,CSPRNG会产生不可预测的输出。


如果它们都不是确定性的,它们不一样吗?它们不是都产生不可预测的输出吗?
我们不同时使用TRNG和CSPRNG来产生会话密钥吗?
我们(我们吗)可以使用TRNG来产生CSPRNG吗?


评论

RNG何时是CSPRNG,CSRNG或TRNG?可能会有帮助。

RNG何时可能是CSPRNG,CSRNG或TRNG的可能重复项? (由于链接的Q是我在2017年提出的要求,因此我只是避免投票。)

@ e-sushi我认为我们的问题之间存在显着差异。但是,现在阅读您的文章及其答案后,我会更好地理解随机生成器的整个概念。

@ RedBook1最后,这才是最重要的。 ;)

#1 楼

真正的随机数发生器使用一种物理现象来输出离散值(位或整数),而该现象尚不能完全确定。例如,该现象可能是掷骰子,热噪声,放射性物质的分解……在检测到此现象之后,可以进行调节阶段,以将输出转换为(至少接近)理想的随机位序列。调节通常是TRNG不可或缺的一部分。

原型调节阶段是冯·诺依曼去偏置器:它将输入的值分组(例如,骰子值,时钟比较器的二进制输出,计数事件之间的时钟周期…)成对,并根据对中的第一个元素是否小于,等于或大于第二个元素,输出0,为零或1。如果输入由独立值组成,则输出(如果有)将是独立的随机位,对于0和1,概率为50%;也就是说,真正统一的独立随机比特(以下简称为理想随机性)。除非另有说明,否则TRNG可能会在一定程度上不完善:可以预期统计测试会将其输出与理想区别


密码学安全的伪随机数生成器是一种确定性(因此为伪)计算方法,可将输入(通常为短吞吐量或低吞吐量,并且除非另有说明,否则为显式)转换为一个(通常任意长或/和高吞吐量)与理想随机性无法区分并具有加密确定性的位序列,用于计算有限的对手不知道输入,假定为秘密且未重用。

在密码上下文中,CSPRNG可以缩写为PRNG或PRG。但是在其他情况下,并非所有PRNG都是加密安全的。 Mersenne Twister是PRNG的一个示例,它在密码上并不安全。

密码安全随机数生成器(非伪)是没有显式输入的随机生成器,对于假定能够攻击CSRNG的多个实例并获得多个输出的计算边界对手,其输出与理想随机性没有区别,具有密码确定性序列(对手可以使用一个CSRNG攻击另一个;然后重新启动CSRNG,在某些攻击模型中,他/她可以尝试利用旁通道,在计算中注入错误或/和随时关闭电源)。 >
原型确定性CSRNG是由CSPRNG和未被重用的随机秘密种子构建的(也许在永久性记忆的帮助下重新通电)。基本上,这是不使用某种形式的TRNG来构建CSRNG的唯一方法。

原型非确定性CSRNG是从CSPRNG构建的,而TRNG在开始时将其输出用作CSPRNG的输入。每个序列(包括加电)。这个想法是,CSRNG的加密强度主要来自CSPRNG,跨多个序列和实例的不可预测性来自TRNG。

注意:结构更复杂,TRNG的输出影响CSRNG持续不断地运行,因此希望在CSPRNG状态遭到破坏后最终能够恢复安全性。 Unix / dev / urandom通常使用此策略。

TRNG可以是CSRNG。任何CSRNG都必须包含TRNG,或者必须在初始化阶段将其用作某个秘密值的来源(否则,了解CSRNG结构将可以预测其输出)。


众所周知,即使通过应用上述原理并使用良好的CSPRNG,也很难制作出良好的不确定性CSRNG。原因之一是在实践中,TRNG通常会自发地或在对抗性影响下失效(例如,对手可以通过使用某种液化气的蒸发将设备置于冷态来降低热噪声,或者将受控事件远程馈送到崩解传感器中) )。如果未检测到,则TRNG的输出可以变得高度可预测,并且PRNG的知识将可以预测其输出。因此,实际的非确定性CSRNG必须测试其TRNG,并在其无法正常运行时在某种程度上阻止任何输出。

另一方面,确定性CSRNG必须永久保持其状态秘密。由于可能会受到旁通道攻击,因此当对手物理访问时很难进行,事实证明,防范旁通道攻击的方法需要大量随机数!此外,对于完全确定性的RNG,有可以理解的预防措施。这加起来使完全确定性的CSRNG在现代高安全性密码设计中很少见。


术语总结:



TRNG不是确定性的。除非另有说明,否则这是其唯一定义的特征。
CSPRNG是确定性的,具有明确的输入(除非另有说明),并且具有密码确定性,如果输入,则计算出的对手将其输出与理想随机性区分开
CSRNG没有明确的输入,至少没有确定性,并且其输出在计算上与理想的随机性在计算上难以区分。它可以是确定性的,也可以不是确定性的。在前一种情况下,它是具有随机密钥的CSPRNG,该密钥不会被重用。在后一种情况下,它包括(也许是)TRNG。
在加密上下文中,PRNG或仅PRG与CSPRNG是同义词,而RNG可能与CSRNG是同义词(尤其是在另一种构造中使用RNG而不是讨论其特性时)。但是,在非加密上下文中,不要假设首字母缩略词PRNG有任何安全属性:在许多编程语言中,默认实现都不是加密安全的。



(TRNG和CSPRNG)都是不确定的,不是一样吗?它们不是都产生不可预测的输出吗?


CSPRNG是确定性的,而TRNG从来都不是;反之亦然。


我们不同时使用TRNG和CSPRNG来生成会话密钥吗?


通常我们使用通过共享初始化的CSPRNG机密和其他一些元素(例如随机数)来初始化会话密钥,因此无需秘密传输会话密钥。

如果我们将CSRNG或TRNG的输出用作会话密钥,则我们需要加密在一侧产生的值以将其传送到另一侧,这无法独立产生相同的会话密钥。此外,如果我们直接使用TRNG,则必须使用与CSRNG足够接近以至于无法猜测密钥的密钥(这是短密钥的问题)。

另一种做法是使用一个CSRNG或TRNG(通常每边一个)作为非对称密钥交换协议(例如Diffie-Hellman)的输入,以生成共享的秘密会话密钥。


我们可以(做我们?)使用TRNG生成CSPRNG吗?


否。但是我们经常使用TRNG和CSPRNG来生成CSRNG。

评论


$ \ begingroup $
是否没有很多在加密意义上完全不安全的PRNG?我不确定将CSPRNG和PRNG分组在一起是否是一个好主意,即使是总结一下。
$ \ endgroup $
–ilkkachu
18-10-29在13:43

$ \ begingroup $
我开始意识到TRNG设计的真正挑战是熵测量。这似乎仍然是一个悬而未决的问题。
$ \ endgroup $
–Paul Uszak
18-10-29在15:45

$ \ begingroup $
@Paul Uszak:按照我的定义,熵源不需要具有由位或离散值组成的输出,也不必是随机数生成器; TRNG输出必须是离散的。例如,一个放射源(甚至与在衰变时产生电脉冲的小物件一起)是一个熵源,而不是TRNG,因为它不输出位;用时钟对所述Gizmo的输出进行采样,您会得到一个TRNG(带有终端偏置和相关位)。反向偏置(齐纳)二极管也是如此,它是一个熵源,但其本身不传送位。
$ \ endgroup $
–fgrieu♦
18-10-29在16:53



$ \ begingroup $
@PaulUszak真正的挑战无非就是可靠性,它要求某些设计甚至使用冗余但相同的噪声源,并检查指示故障的相关性。近似熵测量本身非常容易,以至于有一定的标准,因此除了您的头脑之外,这不是一个公开的问题。请注意,此类测量旨在检查统计失败,而不是实际量化熵(这似乎是您经常误解的东西)。
$ \ endgroup $
–森林
18-10-29在22:30



$ \ begingroup $
@PaulUszak我相信SP 800-90B文档中将其描述为示例去偏音器。是的,它们必须非常简单(就像冯·诺依曼提取是如此简单),否则它将是增白剂,而不是去偏器,并且会使在其上进行的任何随机性测试无效。由于它是一种非常简单(如果不是最简单的)压缩技术,因此它可以用作去偏。
$ \ endgroup $
–森林
18-10-30在0:12



#2 楼

它们都是随机出现的,但是:TRNG是一种物理设备,会产生不确定的输出。您必须能够手持TRNG。
CSPRNG是一种数学算法,在初始状态相同的情况下,总是会产生相同的输出。是确定性的。