深入理解HTTPS系列-密码学篇-随机数(一)

334 阅读4分钟

简介

随机数是指在一定范围内、以随机或不可预测的方式所产生的数字或数值。它是计算机科学中的一个重要概念,在许多应用领域都有广泛的应用,比如密码学、仿真、游戏、随机抽样等。随机数的产生通常需要依靠随机数生成器,它是一个能够以一定的概率产生一系列随机数的算法或器件。在实际应用中,生成的随机数应当具有高度的均匀性和独立性,以满足不同的应用需求

  • 高度的均匀性:表示生成的随机数在整个可能值范围内出现的概率是均匀的,即每个可能的值出现的概率相等。例如,生成一个从1到6的随机数,每个数字出现的概率应该是1/6。
  • 独立性:表示生成的随机数之间彼此独立,即前一个随机数的出现不会影响到下一个随机

随机数生成器类型

  • 伪随机数生成器(PRNG):这是一种利用特定算法生成伪随机数序列的生成器。由于其依赖于固定的算法,因此生成的随机数序列并非真正随机。伪随机数生成器广泛用于计算机科学领域的模拟和仿真中。还有一种密码学伪随机数生成器(CPRNG)也属于PRNG的一种。
  • 真随机数生成器(TRNG):这是一种利用物理随机现象生成随机数的生成器,如使用随机事件的时间间隔、热噪声、量子随机等来生成随机数。硬件随机数生成器通常能够产生高质量的真随机数,但由于其硬件成本较高,因此应用场景有限

随机数生成器工作原理

  • PRNG:是一种从确定的算法获得随机数的方法。它从一个初始的随机数种子seed开始,通过数学运算逐步生成一系列看起来像随机数的数列。这也就是为什么我们在程序中使用随机数算法时,如果不设定一个不同的初始化seed(一般使用时间戳),则每次运行得到随机的都是相同的结果。 一般采用的随机算法有线性同余法和梅森旋转法,感兴趣的可以去了解下。
  • TRNG:原理是基于物理过程中的随机性或者热燥声,这种噪声是由电子器件的随机运动和电流波动引起的。热噪声的随机性使得它们能够产生真正的随机数。

Linux中的随机数生成器

  • /dev/urandom:产生伪随机数, 它是Linux 操作系统中一个特殊的设备文件,用于产生伪随机数。它通过对系统的物理状态,如鼠标和键盘输入、磁盘操作等硬件和软件信息进行分析来生成随机数。在真随机数池不足时,它会使用伪随机数算法生成随机数,也能够继续产生随机数,不会阻塞
  • /dev/random:产生真随机数,/dev/random会尽可能地使用来自硬件设备的真随机数池,比如鼠标的运动、键盘的输入、硬盘的读写等,产生高质量的真随机数。但是如果真随机数池耗尽了,/dev/random就会等待,直到有新的真随机数可用为止,因此会有阻塞的可能

golang随机数生成器包

  • math/rand:纯基于算法的PRNG,包其中的rngSource结构体就是核心随机算法实现,采用的是xorshift算法,即利用异或和移位组合实现。
  • crypto/rand:属于CPRNG(密码学安全随机数生成器)的实现,它是基于操作系统提供的随机数设备或者内核接口来产生随机数,有些可能是TRPG,也有可能是PRNG
    • Linux, FreeBSD, Dragonfly and Solaris系统:优先使用getrandom(2)系统调用,否则从/dev/urandom读取
    • OpenBSD and macOS:使用getentropy(2)系统调用
    • 其他类Unix系统:从/dev/urandom读取
    • windows系统:使用RtlGenRandomAPI

以上就是关于随机数的所有内容了