哪些统计数据可用于识别伪随机数据?

信息安全 随机的 统计数据
2021-08-27 17:02:27

我正在研究一些试图识别内容似乎是“随机”的文件的代码。因此,我正在寻找可用于识别这种随机性的统计方法。

到目前为止,我已经实现了以下内容:

  • 样本的香农熵(即-∑ p(x i ) log 2 p(x i )在样本X上)
  • 逐字节样本方差(0.0 是满分)
  • 按位均值(0.5 为满分)
  • 按位均值分布在每个字节的 0 到 7 位(寻找任何显着差异)
  • 0x20 ≤ b ≤ 0x7E 范围内的字节百分比(37.11% 是满分)
  • 位对计数(即检查 00、01、10、11 的相等计数)
  • 重复字节距离(即寻找xx, x*x, x**x, x***x, ... 模式)

这些似乎给出了统一“随机性”的合理度量,因为通过连接两个 SHA512 哈希生成的 128 个字节可以很容易地与 ASCII 文本或可执行文件区分开来,只需查看统计数据即可。

但是,我想知道是否还有其他我应该研究的强有力指标可能表明样本数据是由加密 PRNG 生成的。

更新:绝对清楚,我并不是要测试 PRNG 作为加密随机源的质量。我试图区分非随机文件(例如可执行文件、JPEG、档案等)和随机文件(例如 TrueCrypt 密钥文件)。到目前为止,我的测试要么被用作识别明显非随机数据(例如 ASCII 文本)和以某种方式不均匀分布的数据的方法。我正在寻找其他方法来测试这一点。

2个回答

AES 比赛期间,组织机构 (NIST) 对提交的 15 个分组密码的输出进行了广泛的统计测试,并采用了被认为是此类测试的黄金标准的Diehard 测试当然,他们什么也没找到。当时密码学家的评论是,这些测试在密码算法的背景下有点荒谬(当然是非官方评论:让事件的主持人难堪是不礼貌的);有人管理公共关系对公共关系有好处,但没有任何值得注意的地方。

这说明了统计随机性(例如为物理系统的大型模拟提供动力所需)与不可预测性(安全所需)之间的区别。例如考虑以下PRNG

  • 将计数器设置为 128 位种子。
  • 要生成 PRNG 的下一个 128 位,请将计数器加 1,然后使用 AES 和全零密钥加密该值,产生 128 位。

此 PRNG 将成功通过 Diehard 套件的所有测试;就测试而言,它在统计上是“完美的”(在生成大约 2 71位后,可能可以检测到与纯 alea 的偏离,即超过 2 亿 TB)。但是,出于安全性考虑,这很糟糕,因为一旦观察到 128 位输出(使用 AES 和全零密钥解密这 128 位:这将为您提供当前计数器值),预测未来输出是微不足道的。

摘要:加密安全的PRNG产生的输出与随机性无法区分;不仅通过统计测试,而且由确切知道可能使用的特定 PRNG 算法的人进行。如果您有一个统计工具可以显示给定的字节序列来自 PRNG,那么您不仅证明了 PRNG 在密码学上不安全,而且还证明它非常糟糕。从 Diehard 测试的角度来看,甚至Dave 的哈希也是“随机的”。

简而言之,您的工具不会捕捉到由一些专业知识生成的随机性,但它也不会捕捉到来自完全业余爱好者的大多数非随机性。使用这些工具,您的目标不是“应该比使用自制方案更了解的非密码学家”,而是“不应该被允许触摸键盘的黑猩猩”。

注意:好的隐写术工具在将数据填充到传输介质之前对其进行加密,以避免被统计工具检测到。加密还应该产生与随机性无法区分的位。

http://www.fourmilab.ch/random/使用以下

  • 卡方检验
  • 算术平均值
  • 蒙特卡罗 Pi 估计
  • 串行相关系数

您可能还想添加“不可压缩性”(这也意味着您可能需要识别压缩文件以消除它们)。Dan D 的DiehardDieharder)建议看起来是一个非常彻底的解决方案。编辑: Dieharder严格针对测试 PRNG,而不是其输出的快照,绝对不适合小数据样本。)

您的任务与统计文件雕刻和加密数据取证搜索中涉及的一些问题有相同之处:数据集越小,就越难确定它是否“随机”。