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比特。在密码学里,我们按最小熵来设计安全参数,因为攻击者会利用你最弱的一环。

重要结论:做TRNG校准时,最小熵才是你的安全底线。NIST SP 800-90B等标准都要求用最小熵来评估熵源。我建议你养成习惯:报告熵值时,同时给出香农熵和最小熵,但安全设计永远按最小熵走。

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时,就遇到过类似情况——振荡器频率有固定的偏置模式,导致相邻采样之间存在强相关性。如果不做条件熵分析,你会高估熵值好几倍。

避坑指南:我曾经接手过一个项目,前工程师只报告了香农熵0.98 bit/样本,看起来很不错。但我用条件熵一测,发现H(Y|X)只有0.3 bit。原因就是采样时钟和振荡器频率之间存在谐波关系,产生了周期性模式。后来我们调整了采样策略,才把条件熵提上来。所以记住:条件熵是发现时序依赖的照妖镜。

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)是转移概率。

下面这张图展示了一阶马尔可夫链在熵源分析中的工作流程:

马尔可夫链熵源分析流程 原始采样数据 x₁, x₂, x₃, ..., xₙ 状态划分 k阶记忆 → 2ᵏ状态 转移概率矩阵 P(j|i) 估计 稳态分布 π(i) 特征向量求解 每符号熵 H_per 加权条件熵求和 模型阶数验证 BIC / 似然比检验 阶数不足 → 增加k重新建模 输出:真实熵值估计 + 置信区间

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 复杂时序依赖(需大量样本)
我的建议:对于大多数硬件熵源,k=1或k=2就足够了。我曾经测试过一个基于热噪声的TRNG,k=1时BIC就收敛了,说明它基本是一阶马尔可夫过程。但另一个基于振荡器采样的TRNG,需要k=3才能充分建模——因为采样时钟的抖动存在更长的记忆效应。

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的测试数据,不妨先用香农熵扫一眼,再用最小熵压底线,最后用条件熵或马尔可夫链揪出隐藏的相关性。你会发现,熵源的真实面目,远比表面看起来要复杂得多。