23、随机数

随机数背景

随机数是密码学中重要的概念,它用途广泛,在密钥分发和认证、会话密钥以及流加密中都有应用。随机数分为真随机数和伪随机数。真随机数是通过将外界物理环境的不可预测的熵源转换成对应的二进制位流得到的,真随机数生成器(TRNG)负责这个转换的过程。伪随机数是将一个固定的值(或者叫种子)应用于一个确定的随机数生成算法而得到的二进制位流。有两种不同的伪随机数生成工具,一种是伪随机数生成器(PRNG),它生成不限长度的位序列,另一种叫为随机函数(PRF),它生成固定长度的位序列。TRNG和PRNG的主要区别在于PRNG效率更高,它可以完全是软件算法实现,也可以使用硬件实现,而TRNG需要对真实的不可预测的物理过程进行采用,所以它需要硬件的支持。

随机数可以用于各种目的,例如生成数据加密密钥、模拟和建模复杂现象以及从更大的数据集中选择随机样本。它们在美学上也被使用过,例如在文学和音乐中,当然在游戏和赌博中也很流行。当讨论单数时,随机数是从一组可能的值中抽取出来的,每个值都是等可能的;当讨论随机数序列时,每个被绘制的数字必须在统计上独立于其他数字。

伪随机数与真随机数

随着计算机的出现,程序员认识到有必要在计算机程序中引入随机性,然而,令人惊讶的是,要让电脑偶然地做一些事情是很困难的。计算机盲目地听从指令,因此是完全可以预测的。使用计算机生成随机数的主要方法有两种:伪随机数生成器(PRNGs)和真随机数生成器(TRNGs)。这两种方法有不同的特点,各有利弊。

TRNG 真随机数产生器:将随机的源作为输入,称为熵源;

PRNG 伪随机数产生器:将种子作为输入,使用确定算法产生位输出序列,输出仅和种子有关,用于产生不限长位流的算法;

PRF 伪随机函数:产生固定长度的伪随机串。

伪随机数

Pseudo-Random Number Generators (PRNGs)

PRNG的生成步骤

  • 将一个称为种子(seed)的固定值作为输入

  • 使用确定性算法产生一系列输出比特

  • 当产生额外的输出比特时,算法的一些结果作为输入通过反馈路径被反馈.

注意的重要一点是,输出比特流仅由输入值决定,因此知道算法和种子的对手可以复制整个比特流。

PRNG与PRF

伪随机数生成器(PRNG):PRNG是指用于产生开放式比特序列的算法。开放式比特序列的一个常见应用是作为对称流密码的输入;

伪随机函数(PRF):PRF用于产生某个固定长度的伪随机比特串。例如对称加密密钥。通常,PRF将一个种子加上一些特定于上下文的值(context-specificvalues)作为输入,例如用户ID或应用程序ID。

除了产生的比特数之外,PRNG和PRF之间没有区别。这两种应用中都可以使用相同的算法。两者都需要种子,并且都必须表现出随机性和不可预测性。此外,PRNG应用还可以使用上下文特定的输入。

伪随机数介绍

确定性算法能够产生经受得住随机性检测的序列,序列并非统计随机,称之为伪随机数。正如“伪随机数”这个词所暗示的那样,伪随机数并不是你所期望的那种随机数字,至少在你用来掷骰子或买彩票的时候不是这样,从本质上说,PRNGs是一种算法,它使用数学公式或简单的预计算表来生成随机出现的数字序列。线性同余法是PRNG的一个很好的例子。对伪随机数理论进行了大量的研究,而生成伪随机数的现代算法非常好,以至于这些数字看起来完全是随机的。

如果将计算机生成的随机数与骰子掷出的点数进行比较,就很容易理解PRNGs和TRNGs之间的基本区别。因为PRNGs通过使用数学公式或预先计算的列表生成随机数,所以使用一个对应于某人多次滚动骰子并写下结果。每当你想要一个骰子,你就会得到名单上的下一个。实际上,这些数字看起来是随机的,但实际上它们是预先确定的。TRNGs的工作原理是让一台电脑实际滚动骰子——或者,更常见的是,使用一些比骰子更容易连接到电脑的物理现象。

PRNGs是高效的,这意味着它们可以在短时间内生成许多数字,并且是确定性的,这意味着如果序列中的起始点已知,一个给定的数字序列可以在稍后的日期被复制。PRNGs通常也是周期性的,这意味着序列最终会自己重复。虽然周期性从来都不是一个理想的特征,但现代PRNGs的周期太长,以至于在大多数实际情况下都可以忽略它。

这些特性使prng适用于需要许多数字的应用程序,并且在这些应用程序中,相同的序列可以很容易地重播。这种应用程序的常见示例是模拟和建模应用程序。prng不适用于那些数据不可预测的应用程序,比如数据加密和赌博。

伪随机数算法

伪随机数生成器可以使用专门的算法生成伪随机数,例如:线性同余和BBS。

  • 线性同余

  • BBS

真随机数

True Random Number Generators (TRNGs)

TRNG的生成步骤

  • 将真随机数源(熵源entropy source)或源的组合用作产生随机二进制输出算法的输入

  • 可能只是简单地将模拟源转换为二进制输出,也可能涉及额外的处理以克服源中的任何偏差。

  • 输出随机比特流

真随机数介绍

本质上,熵源是从计算机的物理环境中提取的,可以包括诸如击键计时模式、磁盘电活动、鼠标移动和系统时钟的瞬时值等内容

与PRNGs相比,TRNGs从物理现象中提取随机性并将其引入计算机。你可以把它想象成一个连接到电脑上的骰子,但通常人们使用的是一种物理现象,它比连接电脑更容易。物理现象可以很简单,比如鼠标移动的细微变化或者按键之间的时间长短。然而,在实践中,您必须小心选择哪个源。

然而,有许多其他的方法可以让你的计算机具有真正的随机性。放射性物质是一种很好的物理现象,辐射源衰变的时间点是完全不可预测的,它们很容易被检测出来并输入计算机,避免了操作系统中的任何缓冲机制。瑞士Fourmilab的HotBits服务是使用这种技术的随机数生成器的一个很好的例子。另一种合适的物理现象是大气噪声,用普通收音机很容易就能接收到。这是RANDOM所使用的方法。你也可以使用来自办公室或实验室的背景噪音,但你必须注意模式,你电脑里的风扇可能会造成背景噪音,因为风扇是一个旋转装置,它产生的噪音很可能不会像大气噪音那样随机。

无论使用哪种物理现象,生成真实随机数的过程都涉及到识别数据中不可预测的微小变化。

两者对比

TRNGs的特点与PRNGs有很大的不同。首先,与PRNGs相比,TRNGs通常效率很低,生成数字的时间要长得多。它们也是不确定性的,这意味着一个给定的数字序列不能被复制,尽管同样的序列当然可能偶然发生几次。TRNGs没有周期。

随机数的特点

  • 随机性

  • 分布均匀性:0 00和1 11出现的概率大致相等;

  • 独立性:任何子序列不能由其他序列推导;

  • 一致性:对于任何种子,发生器的行为具有一致性;

  • 可伸缩性:任何序列的子序列也可通过随机性测试;

  • 不可预测性:敌手不能从先前的随机数推导出后面的随机数;

  • 前向不可预测性:已知以前位数不可预知下一位;

  • 后项不可预测性:从任何随机序列都不能推断出种子值;

  • 不可重现性:真伪随机数

种子的要求:种子本身必须为随机数或伪随机数,例如由TRNG产生。

随机数应用

  • 密钥分发和相互认证方案;

  • 会话密钥的产生;

  • RSA公钥加密算法中密钥的产生;

  • 对称流密码的位流产生。

猜你喜欢

转载自blog.csdn.net/weixin_42369053/article/details/129725166