2. 评估标准体系:AIS-31标准详解(Class P1/P2要求)、NIST SP 800-22/90B标准、FIPS 140-3对RNG的要求、Common Criteria认证
做硬件随机数发生器这么多年,我最大的感触就是:没有标准,你做的RNG就是一堆没人信的比特流。客户问你怎么证明你的熵源够好?你说“我觉得挺随机的”——没人会买账。
所以这一章,咱们把主流的评估标准捋一遍。我按自己的理解,把它们分成两类:一类是组件级测试(盯着RNG本身测),另一类是系统级认证(把RNG放到整个产品里看)。
核心观点:AIS-31和NIST SP 800-22是“体检报告”,FIPS 140-3和Common Criteria是“毕业证书”。前者告诉你RNG有没有病,后者告诉别人你的产品值得信赖。
2.1 AIS-31标准:德国人的严谨
AIS-31是德国联邦信息安全局(BSI)出的标准。说实话,这是我见过最较真的RNG评估标准。我在一个安全芯片项目里被它折腾过整整三个月——但事后回头看,那些测试确实把问题都揪出来了。
AIS-31把RNG分成两个等级:Class P1和Class P2。P1是基础级,P2是高级。区别在哪?我直接给你画个表:
| 对比项 | Class P1(基础级) | Class P2(高级) |
|---|---|---|
| 适用场景 | 一般安全应用 | 高安全需求(如加密密钥生成) |
| 测试项目数 | 6项统计测试 | 9项统计测试 + 物理熵源评估 |
| 熵源要求 | 不强制评估物理熵源 | 必须评估物理噪声源 |
| 在线测试 | 可选 | 强制(T0/T1/T2三级) |
| 失败容忍度 | 允许一定比例的失败 | 几乎零容忍 |
P1要求:六项统计测试
P1说白了就是“你的RNG看起来像随机数吗”。它包含六项统计测试:
- 单比特频数测试——0和1的数量不能差太多
- 块内频数测试——每m个比特里,0和1的比例要均衡
- 游程测试——连续的0或1不能太长
- 块内最长游程测试——每个块里最长的连续串不能离谱
- 二元矩阵秩测试——检查比特之间的线性相关性
- 非重叠模板匹配测试——找特定模式出现的次数是否异常
嗯,这里要注意:P1测试只针对后处理后的输出。也就是说,你拿一个很烂的熵源,只要后处理算法够强,也能过P1。但这样安全吗?不,所以有了P2。
P2要求:从源头抓起
P2比P1多了三样东西:
- 物理噪声源评估——你得证明你的熵源(比如环形振荡器抖动、热噪声)确实有足够的物理随机性
- 在线测试(T0/T1/T2)——芯片运行时实时监测RNG状态,一旦发现异常立刻报警
- 更严格的统计测试——多了三项:离散傅里叶变换测试、重叠模板匹配测试、通用统计测试
我的经验:做P2认证时,最难的不是统计测试,而是物理熵源建模。你得用数学证明你的噪声源满足熵率要求。我曾经在一个项目里,因为环形振荡器的相位噪声模型不够精确,被BSI打回来三次。最后我们不得不重新设计测试芯片,专门提取噪声参数。
2.2 NIST SP 800-22:业界最常用的“体检套餐”
NIST SP 800-22,全称是“A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications”。名字很长,但说白了就是一套15项的统计测试工具包。
我个人习惯把NIST测试分成三组:
- 频率类测试(3项)——检查比特分布是否均匀
- 模式类测试(8项)——检查是否存在异常模式
- 相关性类测试(4项)——检查比特之间是否独立
每个测试都会输出一个P-value。如果P-value > 0.01,就算通过。但注意:一次通过不代表永远通过。NIST建议你至少跑1000组序列,每组100万比特,然后看通过率。
避坑指南:我曾经见过一个团队,他们的RNG跑NIST测试全部通过,但上线后第三天就出问题了。为什么?因为他们只测了理想条件下的输出。温度一变、电压一抖,熵源特性就变了。所以我现在做测试,一定加温度循环和电压扫描。
2.3 NIST SP 800-90B:熵源评估的“硬骨头”
800-90B跟800-22不一样。800-22是测输出好不好,800-90B是测熵源本身有多好。说白了,它要回答一个问题:你的噪声源每比特到底能提供多少熵?
800-90B的评估流程大致如下:
- 采集原始数据——直接从熵源采样,不经过后处理
- IID测试——判断数据是否独立同分布
- 熵估计——用10种不同的方法估算最小熵
- 健康测试——设计在线监测机制
这里有个坑:很多团队拿后处理后的数据去做800-90B评估,结果熵值虚高。记住,800-90B要的是原始熵源数据,不是最终输出。
2.4 FIPS 140-3:美国政府的“入场券”
FIPS 140-3是美国国家标准与技术研究院(NIST)发布的加密模块安全标准。它对RNG的要求,说白了就是一句话:你的RNG必须符合NIST SP 800-90A/B/C。
具体来说,FIPS 140-3要求:
- DRBG(确定性随机比特生成器)必须使用NIST批准的算法(如CTR_DRBG、HMAC_DRBG、HASH_DRBG)
- 熵源必须通过800-90B评估
- 健康测试必须在每次上电时执行,运行中也要周期性执行
- 种子生命周期管理——种子必须安全生成、存储、更新
关键点:FIPS 140-3不要求你的物理熵源有多强,但它要求你的整个RNG链路(熵源→健康测试→DRBG→输出)是完整且可审计的。我见过一些产品,物理熵源做得很好,但DRBG实现有bug,结果FIPS认证没过。
2.5 Common Criteria认证:全球互认的“安全护照”
Common Criteria(CC)跟前面几个标准不一样。它不是专门针对RNG的,而是整个产品的安全评估框架。RNG只是其中的一个评估对象(TOE的一部分)。
CC认证里跟RNG相关的部分,主要是安全功能要求(SFR)中的FCS_RNG类。它定义了:
- FCS_RNG.1——随机数生成的基本要求(质量、熵源、测试)
- FCS_RNG.2——随机数生成的增强要求(物理不可克隆功能等)
做CC认证时,评估师会要求你提供:
- RNG的设计文档(包括熵源原理、后处理算法)
- 测试报告(AIS-31或NIST测试结果)
- 源代码审计(特别是DRBG实现)
- 侧信道攻击防护措施
我的建议:如果你的产品目标是欧洲市场,优先做AIS-31 P2认证。如果目标是北美市场,优先做FIPS 140-3。如果两个市场都要,那就做好心理准备——两套标准都要过,而且它们的测试要求不完全重叠。
2.6 知识体系总览
下面这张图是我自己整理的评估标准体系框架,帮你理清它们之间的关系:
这张图你看懂了吗?左边是组件级测试,右边是系统级认证。实际项目中,我通常建议先过组件级测试(AIS-31或NIST),再做系统级认证(FIPS或CC)。因为组件级测试能帮你尽早发现RNG本身的问题,避免到系统级认证时才发现,那时候改起来成本就高了。
2.7 我的选择建议
最后,给你一个实际的选择路径:
- 做消费级产品(如智能卡、物联网设备):过AIS-31 P1就够了,成本低、周期短
- 做安全芯片(如TPM、HSM):必须过AIS-31 P2 + FIPS 140-3 Level 2以上
- 做军用/政府项目:Common Criteria EAL4+是标配,RNG部分至少AIS-31 P2
- 做开源项目:至少跑一遍NIST SP 800-22,把测试报告公开,这是建立信任的基础
最后提醒一句:标准是死的,RNG是活的。不要为了过标准而“优化”你的测试数据。我见过有人为了过NIST测试,在后处理里加了一个“如果测试失败就重采样”的逻辑——这完全违背了随机性的本质。记住,标准是用来发现问题的,不是用来掩盖问题的。