3. 熵源建模与数学基础:香农熵、最小熵、条件熵、马尔可夫链模型在熵源分析中的应用
做TRNG这么多年,我越来越觉得一个道理:没有数学模型撑腰的熵源,就像没有地基的房子。你测出来的随机数可能看起来挺随机,但一旦遇到懂行的攻击者,分分钟被拆穿。
这一章,我们就来聊聊熵源分析背后的数学工具。说白了,就是怎么用数字说话,证明你的熵源到底有多"乱"。
3.1 香农熵:信息论的老祖宗
香农熵,大家应该都不陌生。它是信息论里衡量不确定性的经典指标。公式长这样:
H(X) = - Σ P(xi) · log₂ P(xi)
其中P(xi)是第i个符号出现的概率。这个值越大,说明系统越不确定,信息量越大。
举个实际例子:假设你有一个理想的均匀随机数发生器,输出0和1的概率各50%。那么:
H = -[0.5·log₂(0.5) + 0.5·log₂(0.5)] = 1 bit
每个输出携带1比特信息。但如果发生器偏了,比如P(0)=0.9,P(1)=0.1:
H = -[0.9·log₂(0.9) + 0.1·log₂(0.1)] ≈ 0.469 bit
你看,熵值直接腰斩。这就是为什么我每次评估熵源,第一件事就是看概率分布是否均匀。
3.2 最小熵:密码学家的硬指标
密码学领域,大家更看重最小熵。为什么?因为它给出了最坏情况下的熵值下界。
公式很简单:
H∞(X) = -log₂(max P(xi))
说白了,就是看概率最大的那个符号,然后取负对数。还是刚才那个例子:
- 均匀分布:max P = 0.5,H∞ = 1 bit
- 偏斜分布:max P = 0.9,H∞ = -log₂(0.9) ≈ 0.152 bit
看到差距了吗?香农熵给了0.469比特,但最小熵只有0.152比特。在密码学里,我们按最小熵来设计安全参数,因为攻击者会利用你最弱的一环。
3.3 条件熵:捕捉时序依赖
刚才提到,香农熵假设符号独立。但现实中的物理熵源——比如环形振荡器抖动、热噪声采样——往往存在时序相关性。这时候就需要条件熵上场了。
条件熵衡量的是:已知前一个符号,后一个符号还有多少不确定性。
H(Y|X) = - Σ P(x,y) · log₂ P(y|x)
我举个例子你就明白了。假设你有一个熵源,输出序列是这样的规律:0后面总是跟1,1后面总是跟0。那么:
- 香农熵:看起来P(0)=P(1)=0.5,H=1 bit
- 条件熵:已知前一个值,后一个完全确定,H(Y|X)=0 bit
你看,香农熵完全被骗了,但条件熵一眼看穿。我在评估一个基于环形振荡器的TRNG时,就遇到过类似情况——振荡器频率有固定的偏置模式,导致相邻采样之间存在强相关性。如果不做条件熵分析,你会高估熵值好几倍。
3.4 马尔可夫链模型:给熵源建个"状态机"
条件熵只能看一步依赖。如果依赖关系更长呢?比如前两个比特共同影响下一个比特?这时候就需要马尔可夫链模型了。
马尔可夫链的核心思想是:系统的未来状态只依赖于当前状态,与过去无关(一阶马尔可夫假设)。对于熵源分析,我们把输出序列建模为状态转移过程。
比如一个二阶马尔可夫链(记忆长度=2):
- 状态空间:{00, 01, 10, 11},共4个状态
- 转移概率:P(下一个bit | 当前两个bit)
有了这个模型,我们可以计算每符号熵:
H_per_symbol = - Σ π(i) · Σ P(j|i) · log₂ P(j|i)
其中π(i)是状态的稳态分布,P(j|i)是转移概率。
下面这张图展示了一阶马尔可夫链在熵源分析中的工作流程:
3.5 实战:如何选择模型阶数
你可能会问:马尔可夫链的阶数k选多少合适?选小了,模型不够精确;选大了,参数太多,容易过拟合。
我一般用贝叶斯信息准则(BIC)来定阶:
BIC(k) = -2·ln(L̂) + k·ln(n)
其中L̂是最大似然值,n是样本数。BIC值越小,模型越好。实际操作中,我通常从k=0开始,逐步增加,直到BIC不再明显下降。
| 阶数 k | 状态数 | 参数数 | 适用场景 |
|---|---|---|---|
| 0 | 1 | 1 | 独立同分布熵源(理想情况) |
| 1 | 2 | 2 | 短时相关性(如振荡器抖动) |
| 2 | 4 | 4 | 中等长度模式(如偏置漂移) |
| 3 | 8 | 8 | 复杂时序依赖(需大量样本) |
3.6 四种熵度量对比
最后,我把这四种熵度量放在一起对比,方便你快速参考:
| 度量 | 公式 | 关注点 | 密码学用途 |
|---|---|---|---|
| 香农熵 | H = -ΣP·log₂P | 平均不确定性 | 信息论分析,理论上限 |
| 最小熵 | H∞ = -log₂(max P) | 最坏情况 | 安全参数设计,标准合规 |
| 条件熵 | H(Y|X) = -ΣP(x,y)·log₂P(y|x) | 时序依赖 | 发现相关性,评估去相关效果 |
| 马尔可夫熵 | H_per = -Σπ(i)·ΣP(j|i)·log₂P(j|i) | 长程依赖 | 精确建模,后处理设计依据 |
嗯,这一章的内容就到这里。这些数学工具看起来有点抽象,但你在实际项目中用上几次就会觉得——它们真的是评估熵源质量的"硬通货"。下次你拿到一个TRNG的测试数据,不妨先用香农熵扫一眼,再用最小熵压底线,最后用条件熵或马尔可夫链揪出隐藏的相关性。你会发现,熵源的真实面目,远比表面看起来要复杂得多。