
随着世界为量子计算机的到来做好准备,后量子密码学(PQC) 成为安全通信的下一前沿。然而,虽然PQC方案承诺可以抵抗量子攻击,但它们也为更加_平凡_,但同样具有破坏性的威胁打开了新门:侧信道攻击(SCA)。
正如最近的研究和行业见解所指出的(参见 Secure-IC 博客, IACR ePrint),PQC算法中不断增加的复杂性和新颖的数学结构通常会加大泄漏的风险,攻击者可以利用这一点。现代攻击者现在将机器学习与SCA结合使用,甚至通过利用物理层信息来攻击量子计算机本身。
在这本全面的指南中,我们将帮助您了解:
无论您是安全入门者还是寻求代码示例和真实建议的加密工程师,这篇文章将引导您从基础到高级主题,涵盖您需要的所有内容以保护后量子密码学的未来。
后量子密码学(PQC) 是指被认为可以抵抗经典计算机和量子计算机攻击的密码学算法。最著名的经典公钥方案——如RSA,DSA,ECDSA——将在足够强大的量子计算机上被Shor算法破解。
与RSA中的相对简单的模指数运算不同,PQC算法通常依赖于复杂的代数结构、大规模矩阵乘法或大规模随机输入。这种额外的复杂性通常会转化为更多而不是更少的侧信道泄漏机会。
侧信道攻击 是指任何不通过破解密码系统基本数学原理而是通过利用其物理实现泄漏信息的攻击。这可以包括时间、功耗、电磁(EM)辐射、声音/振动、缓存使用或甚至光辐射。
时间攻击
功率分析
电磁分析
缓存和微架构攻击
声学/辐射攻击
与AES或RSA等经典密码学相比,PQC方案还没有经过现实世界的考验:
// 假设的非安全NTT操作时间,说明潜在的时间SCA向量
uint64_t tic = rdtsc();
ntt(poly); // 正向数论变换
invntt(poly); // 逆向操作
uint64_t toc = rdtsc();
printf("操作用了 %lu 个周期。\n", toc - tic);
如果ntt()或invntt()的时间取决于秘密数据(例如,由于非固定时间的循环边界),攻击者可以收集此类信息并统计推断密钥位。
随着侧信道轨迹变得更为丰富且嘈杂,攻击者越来越多地应用机器学习(ML)来自动化和增强攻击——尤其是针对后量子实现的攻击。
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
# 加载轨迹和标签(例如,从示波器数据)
traces = np.load("traces.npy") # traces.shape = (num_samples, trace_length)
labels = np.load("labels.npy") # 例如,每条轨迹的秘密比特值
# 数据分割
X_train, X_test, y_train, y_test = train_test_split(traces, labels, test_size=0.2)
# 简单神经网络进行分类
mlp = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=500)
mlp.fit(X_train, y_train)
print(f"测试准确性: {mlp.score(X_test, y_test)}")
实际攻击使用更复杂的方法,但这说明了主要流程。
量子计算机本身是否vulnerable于侧信道攻击? 最近的研究(arXiv:2304.03315)表明是的,即使在基于云的量子计算机中。
想要检查侧信道泄漏或测量您的PQC实施的抗性?工程师使用开源工具、硬件探针和脚本的混合来完成。
perf或自定义时间脚本。# 示例:多次重复执行一个二进制文件以进行分析
for i in {1..1000}; do
./kyber_keygen >> timings.txt
done
valgrind,cachegrind或自定义Flush+Reload脚本。gcc -O2 flush_reload.c -o flush_reload
sudo ./flush_reload ./target_binary
假设我们已经测量了操作时间,我们可以快速解析它们。
# 计算文本文件中时间数据的平均值、最小值、最大值
awk '{sum+=$1; if(min==""){min=max=$1}; if($1>max)max=$1; if($1<min)min=$1} END {print "平均值: "sum/NR, "最小值: "min, "最大值: "max}' timings.txt
import numpy as np
data = np.loadtxt("timings.txt")
print(f"平均: {np.mean(data)} 周期")
print(f"标准差: {np.std(data)}")
import matplotlib.pyplot as plt
traces = np.load("traces.npy") # (样本数, 点数)
for i in range(3): # 绘制3个随机轨迹
plt.plot(traces[i])
plt.show()
目标是发现与秘密信息相关的变异(时间或功率)。
如何在PQC实施中缓解侧信道攻击? 一个结合硬件、软件和协议级的“纵深防御”方法是必不可少的。
所有的算术运算、内存访问和代码流都必须与秘密数据无关。
// 安全,固定时间交换使用位操作
void cswap(int cond, uint32_t *a, uint32_t *b) {
uint32_t mask = -cond; // 如果cond==1,则全为1,如果cond==0,则为0
uint32_t temp = mask & (*a ^ *b);
*a ^= temp;
*b ^= temp;
}
注意: 许多编译器优化可以破坏固定时间代码;始终通过实际的硬件分析验证!
掩码: 将秘密拆分成多个份额,所有操作都在掩码数据上进行。
盲化: 向计算中添加随机噪声/数据,使每次运行对攻击者来说看起来不同。
在硬件层面上,将噪声注入功率或EM信号以减少SCA信号/噪声比。
在后量子过渡中,新的密码学防护也打开了新的攻击矢量。侧信道攻击,尤其是利用机器学习强化的,将越来越多地成为针对后量子加密的武器——除非您早期、经常且在每一层构建防御。
通过实施严格性、透明性和持续测试来实现安全性是不能忽视的。无论你是在开发软件、硬件还是协调基于云的量子系统,理解和缓解SCA风险是确保你的密码系统在量子时代长期可行性的核心要求。
早做准备,安全构建,持续测试——因为在后量子的世界里,侧信道永不眠。