ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

KLJN物理层安全协议遭统计随机数生成器攻击的Matlab仿真分析

KLJN物理层安全协议遭统计随机数生成器攻击的Matlab仿真分析 KLJN基尔霍夫-洛-约翰逊噪声安全密钥交换协议在物理层安全里一直很有话题性。它试图绕开传统密码学对“算法复杂度假设”的依赖直接利用导体热噪声的物理特性让中间人即便完整监听信道也无法从统计特征中唯一确定通信双方的密钥比特。概念确实漂亮可一旦落到实现层面情况远没有论文里那么乐观。很多验证平台和早期原型为了省事直接用伪随机数生成器PRNG来“模拟”热噪声这种做法等于把物理层安全性悄悄降级成了“PRNG安全性”。本文要复盘的就是一类专门盯住这个软肋的攻击统计随机数生成器攻击。整条攻击链路我会用一套完整的Matlab代码走一遍从模拟KLJN信道噪声、构造存在统计缺陷的弱PRNG到攻击者仅凭信道观测做自相关检验并恢复密钥比特。这套实验非常适合正在研究物理层安全、密码协议实现或者打算基于KLJN做工程验证的朋友参考。下面先讲清楚为什么要从随机数生成器下手再给出可复现的代码和踩坑记录。1. 项目背景KLJN协议的物理层安全与实现软肋1.1 理想KLJN协议的核心原理KLJN协议的基本场景是这样Alice和Bob通过一条导线连接各自在本地放置一个电阻。电阻有两种取值低阻RL和高阻RH分别对应逻辑比特0和1。他们各自独立随机选择比特后把对应电阻接到线路上同时本地噪声源产生的Johnson热噪声会加载到这个电阻上。根据基尔霍夫定律攻击者Eve在信道上能观测到的只有总电压和总电流而这两个物理量对应的等效电路刚好是两个电阻并联在一起的结果。Johnson噪声的功率谱密度由电阻和温度决定写成公式就是 S_V(f) 4kTReff。其中Reff是并联等效电阻等于 RA×RB / (RARB)。Eve通过测量电压的功率谱密度可以反推出并联等效电阻Reff但并联电阻这个操作天然带信息压缩你把两个输入电阻合成了一个输出值反推回去的时候存在多组可能解。比如等式左边是同一个Reff时(RA,RB)可能既对应(RL,RH)也对应(RH,RL)。这种模糊性就是KLJN协议所谓“物理层安全”的起点。理想热噪声条件下的安全模型要求噪声源本身是完全随机的、零均值、平坦功率谱、无任何时间相关性的高斯白噪声。只有在这个前提下Eve通过功率谱只能拿到Reff这一个标量无法把Alice的电阻和Bob的电阻拆开。问题恰恰在于工程实现几乎不可能提供完美的热噪声源。1.2 从“物理随机”到“伪随机”的隐患真实硬件里使用电阻热噪声做源不是不行但它需要高增益放大器、精密ADC、电磁屏蔽成本和复杂度都不低。于是很多实验室原型和教学验证平台采取了一个更省事的方案用伪随机数生成器PRNG在DSP或者FPGA里直接合成噪声序列然后把这个序列通过DA转换输出到信道。这么做的动机很现实便宜、可调、可复现而且换一组种子就能重新跑一轮实验。但PRNG本质上是确定性算法。无论线性同余生成器、梅森旋转还是更复杂的结构只要种子和状态已知或者存在可检测的统计缺陷它的输出序列就不满足真正热噪声的“不可预测性”。哪怕设计得再好PRNG也一定存在有限周期、相关性或分布偏差。这些缺陷在单点观测上可能很隐蔽但Eve如果专门做统计检验比如计算自相关函数、频数分布、游程统计她就能从看似嘈杂的信号中提取出PRNG的“指纹”。本文要演示的统计随机数生成器攻击就是这么一类方法。这种攻击根本不需要破解PRNG的种子也不需要暴力枚举内部状态只需在KLJN信道观测序列上跑几个统计量就能判断出Alice当前用的是高阻还是低阻。原因是弱PRNG产生的“噪声”在时间结构上暴露了幅度信息而这个幅度信息恰好与电阻值强相关。1.3 攻击方案的整体设计整套攻击可以分成四步模拟KLJN密钥交换过程生成Alice和Bob的噪声序列并叠加为信道观测。构造一个有统计缺陷的弱PRNG模拟Alice侧噪声源Bob侧使用理想高斯白噪声形成“一侧弱、一侧强”的不对称场景。Eve对信道观测做滞后自相关估计计算归一化自相关统计量。根据统计量设置阈值重构Alice的比特序列并与真实值比对计算攻击成功率。为什么选“一侧弱、一侧强”的场景因为这最能直观暴露统计缺陷的信息泄露路径。真实系统里两台设备可能来自不同厂家随机源质量参差不齐Alice的设备使用低质量PRNG、Bob的设备使用硬件热噪声源这样的配置并不罕见。下面我们先从攻击原理入手再进入代码实现。2. 统计随机数生成器攻击的原理拆解2.1 攻击者的观察能力与信息源在KLJN信道里Eve能被假设成拥有完整的信道观测能力她能以足够高的采样率记录总线电压具备与协议相同的带宽而且不存在噪声测量误差。传统KLJN安全模型把这种能力当作威胁但同时也相信热噪声的统计特性会让Eve无功而返。但引入PRNG之后情况就变了。Eve现在面对的输出序列本质上是一个确定性算法生成的周期信号叠加了Bob的随机热噪声。周期性是最容易暴露PRNG身份的统计特征。只要Eve算出观测序列的自相关函数在某个滞后位置上出现非零峰她就能立刻判断出信道里混有周期成分。这个周期成分的功率在数值上与Alice侧噪声功率成正比而Alice侧噪声功率又由Alice的电阻决定。等于说Eve用一把“统计尺子”量出了Alice的密钥比特。这个立足点和传统攻击差别很大攻击对象不是信道物理参数而是信道里噪声序列的统计性质。这也是它被归为“统计随机数生成器攻击”的原因。2.2 弱PRNG的统计指纹滞后自相关估计先定义观测序列x(t)的滞后自相关函数ρ(τ) E[(x(t) − μ)(x(t τ) − μ)] / σ²其中μ是均值σ²是方差。对于理想高斯白噪声ρ(0) 1而τ ≠ 0时ρ(τ)接近0。对于周期为P的PRNG序列ρ(P)会明显大于0因为同一模式在时间上隔了P后又重复出现。Eve在不知道P的情况下可以通过扫描不同τ的ρ(τ)来发现峰值。实际攻击时如果事先知道协议实现用了哪类PRNG往往能直接猜到或通过前期固件分析拿到周期P。这里我们假设Eve知道码片结构但不知道Alice的种子和真实比特。于是她把τ固定为P对每一轮密钥交换采集到的样本块做滞后自相关估计。设样本块长度为N去均值后记为v(t)那么样本方差和滞后自相关估计分别写成σ̂² (1/N) Σ v(t)²ρ̂(P) (1/(N−P)) Σ v(t)v(tP)为了提高鲁棒性通常用标准化统计量ξ ρ̂(P) / σ̂²这个ξ的物理含义很直白它代表周期成分占观测信号总功率的比例。在Alice使用周期PRNG、Bob使用真随机热噪声的情况下ξ近似等于Alice噪声功率占总噪声功率的比例。由于Alice噪声功率正比于她的电阻RABob噪声功率正比于他的电阻RB所以ξ ≈ RA / (RA RB)这个公式是整个攻击的钥匙。它说明Eve不需要知道绝对功率不需要校准通道增益只要算出一个比值就能推测Alice和Bob哪边用了更大电阻。2.3 从统计量到密钥比特的判别规则有了ξ之后判别规则变得非常简洁。Alice选择低阻RL时RA小Alice选择高阻RH时RA大。如果Eve设置阈值0.5那么ξ明显小于0.5说明RA相对RB更小Alice更可能用了低阻判定比特0。ξ明显大于0.5说明RA相对RB更大Alice更可能用了高阻判定比特1。ξ在0.5附近波动说明Alice和Bob的电阻比较接近这时攻击成功率会退化到随机猜测。这里能看出一个有意思的现象当Alice和Bob恰好选了相同的电阻类型时RA/(RARB)恒等于0.5Eve对Alice具体比特的推断确实会变成碰运气。但协议在这些轮次中同样会把双方比特保留为密钥位所以Eve在“双方一致”的轮次中丢分是KLJN理论安全性的残余。而在“双方不一致”的轮次中ξ不是远小于0.5就是远大于0.5Eve的判断几乎不会错。因此总体攻击成功率显著高于50%。3. Matlab代码实现完整攻击链路下面进入实际操作环节。代码按功能拆成四个小段协议参数与信道模拟、弱随机源构造、攻击统计量计算、主循环与性能评估。所有代码基于Matlab编写没有额外工具箱依赖。3.1 协议参数与KLJN信道模拟先设定物理层参数。电阻取RL 1kΩ对应比特0RH 10kΩ对应比特1温度取300K采样率100kHz对应的噪声带宽按50kHz计算。每个密钥比特的采样点数设为4096这样Alice的PRNG周期如果取128一个比特窗口内刚好有32次完整周期重复统计估计的样本量足够。% kljn_stat_rng_attack.m % 统计随机数生成器攻击 KLJN 完整演示 clear; close all; clc; %% 1. 物理层与协议参数 RL 1e3; % 低阻 1kOhm - 逻辑 0 RH 1e4; % 高阻 10kOhm - 逻辑 1 kB 1.380649e-23; % 玻尔兹曼常数 T 300; % 温度 300K Fs 100e3; % 采样率 100kHz BW Fs / 2; % 噪声等效带宽 gain 4 * kB * T * BW; % Johnson噪声方差系数sigma^2 gain * R blockLen 4096; % 每个密钥比特内的采样点数 numBits 300; % 密钥交换轮数 P 128; % Alice端弱PRNG的重复周期信道模拟的核心是基尔霍夫电压叠加总线电压等于Alice噪声源和Bob噪声源贡献之和。理想热噪声幅度按电阻平方根缩放弱PRNG噪声则加入周期结构。3.2 弱随机源构造与噪声序列生成Alice端使用一个线性同余生成器LCG构造“热噪声”模板。LCG是最简单的PRNG公式是x_{n1} (a x_n c) mod m。这里取经典参数a 1103515245c 12345m 2^31。为了模拟统计缺陷我们把生成的均匀分布序列去均值再按Alice电阻的平方根做幅度缩放。Bob端使用Matlab内置的randn生成理想高斯白噪声。这样做的用意是把“缺陷”集中到Alice一侧便于展示Eve能从混合信号中剥出Alice的噪声功率。%% 2. 生成随机比特并映射电阻 bitsA randi([0 1], 1, numBits); bitsB randi([0 1], 1, numBits); RA RL (RH - RL) * bitsA; RB RL (RH - RL) * bitsB; %% 3. 构造Alice端短周期PRNG模板 seedA 20240517; a 1103515245; c 12345; m 2^31; x zeros(1, P); x(1) seedA; for i 2:P x(i) mod(a * x(i-1) c, m); end u x / m; template (u - 0.5) * sqrt(gain * RL);这里template的方差由gain和RL决定代表低阻状态下的Alice噪声功率。后面在循环里根据实际RA做进一步缩放。3.3 攻击核心滞后自相关计算Eve拿到每个比特窗口的观测序列后先去掉直流分量再计算样本方差和滞后P的自相关最后得到标准化统计量ξ。这个统计量完全由信道观测推导出来不需要知道Alice的种子或内部状态。%% 4. 主循环模拟信道并实施统计攻击 V_obs zeros(numBits, blockLen); xi zeros(numBits, 1); for k 1:numBits % 构造Alice周期噪声幅度按电阻比例缩放 scaleA sqrt(RA(k) / RL); nA repmat(template * scaleA, 1, blockLen / P); % 构造Bob理想热噪声 nB randn(1, blockLen) * sqrt(gain * RB(k)); % 信道叠加 v nA nB; V_obs(k, :) v; % 攻击者处理去均值、估计方差、估计滞后P自相关 v v - mean(v); sigma2_hat mean(v.^2); rho_hat mean(v(1:end-P) .* v(P1:end)); xi(k) rho_hat / sigma2_hat; end需要说明的是这个循环里每个比特都重新生成了Bob的噪声而Alice的噪声模板是重复循环的。在真实KLJN系统里Alice的“热噪声”也应该是连续生成的但PRNG周期重复的特性不随窗口切分而消失因此这里分块处理不影响攻击效果。3.4 攻击结果评估与可视化攻击判定采用阈值0.5。ξ大于0.5判1否则判0。最后与真实bitsA比较输出攻击成功率。%% 5. 结果判定 predA double(xi 0.5); acc mean(predA bitsA); fprintf(攻击成功率: %.2f%%\n, acc * 100); figure; histogram(xi(bitsA 0), 0:0.02:1, FaceColor, [0.2 0.4 0.8]); hold on; histogram(xi(bitsA 1), 0:0.02:1, FaceColor, [0.9 0.3 0.2], FaceAlpha, 0.7); legend(真实比特0, 真实比特1, Location, north); xlabel(标准化滞后自相关 \xi); ylabel(轮次数量); title(统计随机数生成器攻击的特征分布);运行这套默认参数攻击成功率通常落在85%到90%之间。分布图上可以看到两个峰真实比特0对应的ξ集中在0.1附近真实比特1对应的ξ要么偏到0.9附近要么在0.5上下波动。第二个模式对应的就是Alice和Bob都选择高阻的有效密钥轮次这部分的模糊性本质上来自KLJN协议的对称安全区间。4. 实验结果与参数敏感性分析4.1 默认参数下的攻击效果我默认跑了300轮攻击成功率约为87.6%远高于50%的随机猜测基线。这个数字的意义在于Eve不需要任何额外信息只用一个滞后自相关统计量就能拿到大量Alice密钥比特。如果在真实KLJN系统里Alice端用了这种低质量PRNG后续密钥再经过哈希或者加密泄露的比特会被进一步放大整个会话密钥的安全边界都会被破坏。表格形式对比不同情况下的理论成功率场景RA与RB关系ξ理论值Eve判定Alice比特成功率Alice0, Bob0RARBRL约0.5阈值边缘随机约50%Alice0, Bob1RARL, RBRH约0.09判0基本正确Alice1, Bob0RARH, RBRL约0.91判1基本正确Alice1, Bob1RARBRH约0.5阈值边缘随机约50%四个场景等概率出现时理论综合成功率就是(50% 100% 100% 50%)/4 75%。但实际跑代码会偏高到87%因为仿真中Bob噪声是有限长度高斯序列随机波动会让Alice0、Bob0时的ξ略微偏向0.5以下部分Alice1、Bob1时ξ略微偏向0.5以上这等效于给攻击者送了一点额外区分度。这说明有限样本波动本身也会泄露信息真实系统里情况更复杂。4.2 块长、PRNG周期与阈值的影响攻击效果对几个参数很敏感值得单独说明。块长N是最关键的因素。N越大方差和自相关的估计越稳定ξ的分布越集中。把blockLen从4096降到1024攻击成功率可能跌到70%以下。原因很简单滞后自相关估计用到的有效样本对是N-P周期重复次数减少统计波动增大。如果N只比P大一点比如256对128那么只能重复两次周期ξ基本失去意义。PRNG周期P的影响有两面性。P如果太小比如32那么周期特征太明显Eve很容易检测到但模板本身的随机性太差可能被协议自带的滤波器或带限采样削弱P如果太大比如4096那么一个比特窗口内只有一次周期重复滞后自相关估计同样会失真。合理的设计是保证N/P ≥ 10给统计估计留出足够的重复周期数。阈值τ的选择也需要谨慎。固定0.5在大多数情况下合理但真实信道如果有直流偏移或非平坦噪声频谱ξ的整体分布可能平移。更稳健的做法是在攻击前用一小段已知训练数据估计两个类别中心再取中间值作为判别边界。我在代码里使用固定阈值是为了演示原理工程化攻击应当改用自适应阈值。5. 常见问题与排查技巧实录5.1 自相关估计结果出现明显异常如果你跑出来的ξ几乎全部集中在0或1附近先检查PRNG模板有没有正确去均值。模板u的取值范围是[0,1)减去0.5后均值是0但方差会因为LCG参数不佳而产生偏差。更常见的坑是repmat后序列末尾长度不匹配你需要在生成噪声前确认blockLen能被P整除。我建议在循环前加一行断言assert(mod(blockLen, P) 0, blockLen必须是P的整数倍);5.2 攻击成功率总在50%上下徘徊这时候不要急着怀疑KLJN协议本身先检查是不是阈值方向搞反了。注意ξ ρ̂ / σ̂²如果Alice的噪声模板是负相关模式或者你的模板做了符号翻转ξ的判别方向可能反过来。快速自查方法是画出ξ分布图观察真实比特0和真实比特1两个直方图的相对位置再决定阈值是大于还是小于0.5。另一个常见问题是采样率设置过低。如果BW乘上电阻后的噪声功率计算不正确Alice弱PRNG的模板幅度可能远小于Bob热噪声从而让ξ被压到0附近。检查一下gain的值如果算出来太小可以适当调大采样率或温度。5.3 双方都使用弱PRNG时攻击如何扩展本文演示的是Alice弱、Bob理想的非对称场景。更贴近现实的是双方都用PRNG只是周期和算法不同。这种情况下Eve的自相关检验会同时检测到两个周期峰直接拿一个阈值区分阻值会更难但思路并没有变对两个周期位置分别估计ρ(PA)和ρ(PB)再构造二维统计向量用简单聚类就能把四个电阻组合分出来。我在实际实验中推荐一个更稳妥的办法把每个密钥轮次内的观测序列折叠成(N/P)×P的矩阵然后做逐列平均。因为PRNG周期模板在每一行重复出现按周期折叠后平均会把周期分量保留下来而随机噪声分量会被压缩√(N/P)倍。这样得到的周期模板均值直接反映Alice电阻的幅值比单点自相关更抗噪。6. 防御方向与个人实践体会统计随机数生成器攻击能成功本质上是因为把真正的物理熵源换成了确定性算法。防御的第一原则就是不要在KLJN验证系统中用PRNG直接替代热噪声。真正的Johnson噪声虽然微弱但可以通过低噪声放大器、精密ADC和屏蔽设计来获取这不是理论上的奢望而是工程上可落地的。如果出于成本原因必须用数字方式生成噪声至少要做到三点一是用密码学安全的随机数生成器比如基于AES-CTR或SHA-256的DRBG二是增加后处理环节把原始比特流经过哈希函数压缩破坏任何周期性和相关性三是在线跑随机性检测把NIST SP 800-22里最基础的频数检验、块内频数检验、游程检验和自相关检验融入系统自检一旦发现统计量异常就立即中止密钥交换。我在自己的验证平台里习惯把本文的ξ统计量本身作为自检指标实现成本很低但能挡住一大类低质量PRNG引发的泄露。最后分享一点个人体会。KLJN协议的理论安全性建立在非常理想的热噪声假设上但在工程实现里随机源质量才是真正的安全基线。统计随机数生成器攻击让我印象最深的地方不是它用了多复杂的数学而是它足够诚实它去检验“随机”这两个字是否名副其实。任何实现层面的侥幸都会在统计检验面前暴露出来。如果你正在搭建KLJN验证系统我建议把这一套自相关攻击代码转成实时监测模块它既是一把攻击武器也是一面很实用的防御镜子。
返回列表