【密码学原理】伪随机数的产生

大量的基于密码学的网络安全算法和协议都使用二进制随机数:

  • 密钥分发和相互认证方案
  • 会话密钥的产生
  • RSA公钥加密算法中密钥的产生
  • 对称流密码加密的位流的产生

对随机数序列产生提出的两个要求:随机性和不可预测性。

  • 随机性:分布均匀,系列中的位分布应该是均匀的;独立性,序列中任何子序列不能由其他子序列推导出。
  • 不可预测性:随机数不仅要做到序列统计随机,还有随机数序列不可预测。 

TRNG,PRNG,PRF

TPNG为真随机数发生器,PRNG为伪随机数发生器,PRF为伪随机函数。

真随机数发生器把一个很随机的源作为输入,这个源称为熵源,熵源是从计算机的物理环境抽取的,可能包括键盘敲击时间模式,磁盘的电活动,鼠标移动,系统时间的瞬时值等。源或源的组合作为算法的输入,产生随机的二元输出,也许仅仅是把模拟信号源转换为二元输出。

PRNG取一个固定值作为种子,作为输入,用一个确定性的算法产生位输出序列,不限长位流。输入位流仅仅由输入值决定,所以知道算法和种子的攻击者可以重现整个位流。不限长位流同样用于对称流密码的输入。

PRF用于会产生固定长度的伪随机位串,对称加密密钥和时变值就是种子。通常PRF的输入为种子和上下文相关的特定值(如ID)。

对PRNG的要求

当PRNG或者PRF用于密码学应用时,基本要求就是不知道种子的攻击者不能决定伪随机数。对PRNG和PRF输出保密性的要求,就是要求随机性、不可预测性和种子特定性。

随机性:对PRNG来说就是要生成的位流尽管是确定性的,但是显示是随机的。没有 单个的测试可以判断一个PRNG生成的数据具有随机性,只能进行一系列测试,根据NIST SP800-22规定,这些测试应该满足:

  • 均匀性:在产生随机或伪随机位序列的任何点,0或1出现的量大约相等。
  • 可伸缩性:用于序列测试的任何测试也可以用于从序列中抽取的子序列的测试。如果序列是随机的,那么任何从中抽取的子序列也应该是随机的。
  • 一致性:对于所有初始值(种子),发生器的行为必须具有一致性。基于单个种子产生的输出测试,或者基于单个物理源输出的测试,都不充分。

下列有三种测试:

  • 频率测试:最基本的测试,任何测试工具集都必须包含。判断序列中0和1的个数是否和真随机序列的期望值大约相同。
  • 游程测试:测试的焦点是序列中游程的总量。游程指相同位构成的不间断序列,其前后的位取与游程位不同的值。判断各种长度的0和1游程的数量是否符合随机序列的期望值。
  • Maurer通用统计测试:测试的重点是匹配模式间的位数,测试序列是否能大幅度压缩而不损失信息,能大幅度压缩的序列被认为是非随机的。

不可预测性:随机数位流具有两种不可预测性

  • 向前不可预测性:不知道种子,不够知道序列中前面多少位,无法预测序列中的下一位。
  • 向后不可预测性:从产生的任何值都不能推断出种子值。那么种子和该种子产生的任意值之间应该没有相关性,序列的每个元素应该显得像独立随机事件的结果。

用于随机性测试的测试集也提供不可预测性测试。

种子的要求:作为种子必须是安全的,PRNG是确定性算法,如果攻击者能推导出种子,那么就能决定输出。

一种产生PRNG的方式如图,种子由TRNG产生。

TRNG可以产生真随机数,但是并没有直接用TRNG,而是用PENG,这是为什么呢?

在流密码中,发送者需要生成与明文等长的密钥流,并把密钥流和密文安全发送给接收者,这是不现实的。如果是用PRNG的话,发送者只需要设法将密钥安全的发送给接收者即可。

在PRF中,也希望用TRNG产生种子,然后用PRF的输出作为密钥。TRNG可能会产生不平衡的二元序列,PRF具有使TRNG的输出更随机化的效果,消除不平衡性。

此外,用于产生真随机数的机制在速率上可能跟不上需要。

伪随机数发生器

线性同余发生器

BBS发生器

使用分组密码的伪随机数产生

ANSI X9.17伪随机数发生器

猜你喜欢

转载自blog.csdn.net/m0_50984266/article/details/108904352