TRUG如何验证随机性

在之前的项目中,也有使用外购的TRNG模块产生随机数,一般只验证集成、可以产生数据,并未对产生数据的随机性进行评估。
那么如何评估TRNG产生数据的随机性?

我们无法“证明”一个物理世界或算法生成的序列是绝对随即的,但我们可以通过一系列严格的统计测试来证明它“不随机”,或者证明它“对于所有实际目的来说,表现的和随机一样”

验证随机数发生器RNG是否随机,通常分为两个层面

  • PRNG:伪随机数发生器
  • TRNG:真随机数发生器

核心思想:证伪而非证实

我们无法检查一个无限序列的每一个部分来证实其随机性。因此,科学的方法是:我们提出一个零假设:该序列是随机的”,然后,我们设计各种统计测试来尝试拒绝这个假设。如果序列在所有这些测试中都表现良好,无法被拒绝,我们就说“没有证据表明它不是随机的”,从而在实际应用中接受它


统计测试套件(针对PRNG、TRNG的输出)

这是最常用和标准化的方法。我们将RNG产生的一长串数字(比如几GB的数据)输入到专业的测试套件中。最著名的是NIST STS和Dieharder。

NIST Statistical Test Suite(STS)

由美国国家标准与技术研究院制定,是密码学领域的黄金标准之一。它包含15项测试,旨在检测序列中各种可能存在的非随机模式。

  • 频率测试: 检查0和1的数量是否大致相等。
  • 块内频率测试: 检查固定长度块内1的频率。
  • 游程测试: 检查连续相同比特(如111或00)的长度和数量是否符合随机预期。
  • 矩阵秩测试: 检查序列子矩阵的秩分布。
  • 离散傅里叶变换测试: 检测周期性的模式(即循环特性)。...等等。

结果解读: 测试会输出一个p-value。

  • p-value = 1 或 p-value = 0: 绝对是坏的,太完美或太糟糕都不正常。
  • p-value ≥ 0.01: 通常认为序列通过该项测试(没有证据拒绝随机性假设)。
  • p-value < 0.01: 序列在该项测试中失败,表明存在可检测的非随机性。
    一个良好的RNG应该在所有测试中,p-value均匀地分布在[0,1]区间。

Diehard / Dieharder Tests

这是一套更早但非常严苛的测试集合,包含许多“折磨性”测试。

  • 生日间隔测试: 检查随机日期之间的间隔分布。
  • 重叠排列测试: 检查5个数字的重叠序列的随机性。
  • 随机球测试: 模拟将球随机投入桶中。
  • 挤压测试: 尝试压缩序列——一个真正随机的序列是几乎无法被压缩的。

TestU01

  • 一个更新、更强大的库,提供了多种测试套件,包括“Crush”和“Big Crush”,它们会进行数百万次测试,能发现非常细微的相关性。

对于伪随机数发生器(PRNG)

PRNG是确定性算法,用一个“种子”生成看似随机的序列。它们的验证除了上述统计测试外,还包括:

  • 周期长度: 在序列开始重复之前,它能生成多长的数字序列。一个好的加密级PRNG周期极长(如2¹²⁸或更长),你永远用不完。
  • 初始状态预测难度: 给定部分输出,能否反向推导出种子或预测下一个数字?密码学安全的PRNG(CSPRNG)必须能抵抗这种攻击。
  • 可重现性: 使用相同的种子必须产生完全相同的序列。这在科学模拟中是优点,但在赌博或加密中是致命弱点。

对于真随机数发生器(TRNG)

TRNG基于不可预测的物理过程(如电子噪声、放射性衰变、光子行为)。它们的验证更侧重于:

  • 熵源评估: 直接测量物理源本身的随机性。例如,评估噪声信号的带宽和分布。
  • 健康测试: 在运行时持续监控熵源,确保它没有失效或退化。这是很多硬件安全模块(HSM)的强制要求。
  • 偏差校正: 物理源通常有偏差(比如产生1的概率是0.51,产生0的概率是0.49)。需要使用熵提取算法(如Von Neumann校正器或基于哈希的提取器)将有偏差的、非均匀的原始数据转化为无偏差的、均匀的随机比特。
posted @ 2025-11-23 18:18  刘朝锋  阅读(209)  评论(0)    收藏  举报