最近后台有不少朋友在问,第九届密码数学挑战赛那篇文章里的某些细节能不能讲清楚一点,比如实验环境是怎么搭的、数据怎么选的、降噪处理用的具体方法是什么等等。
其实最初发这篇文章的时候,我们刚做完比赛,还处在那种“终于交了稿”的状态,很多过程是照着实验记录顺手整理的,没想着写得多细。现在距离那场比赛也过去一阵了,刚好最近第十届挑战赛报名临近,看到有很多同学在准备,也确实有不少人来问,就想着把那篇文章重新整理一下。
这次没有大改,只是把原来没讲清楚的部分补了一下。比如实验时用的硬件规格、降噪是怎么做的(我们用的是基于明文类别的均值滤波),以及一些中间数据的补全,还有部分图表也统一格式重新排了版。虽然是同一个题目,但这版的内容比原来更完整、也更容易复现。
如果你已经读过之前的版本,可以直接跳到你关心的部分看看有没有更新;如果你是第一次看到,希望这篇补充过的内容能对你有点帮助。不管你是准备比赛,还是单纯对侧信道分析感兴趣,都欢迎来交流。
给定采集得到关于 AES 密码芯片运行过程中的泄露样本与对应的明文信息,该泄露样本对应于 AES密码芯片执行第一轮第一个 S盒输出值。该 AES密码芯片信息泄露无法使用汉明重量模型准确刻画其信息泄露特征。问题:基于给定泄露样本与对应明文信息编写能能量分析攻击代码恢复 AES 密码芯片所使用密钥第一字节值。提示:该问题主要考察参赛人员利用统计工具准确挖掘给定数据的信息特征的能力,参赛人员可以借助概率密度函数、相关系数、互信息、KS 检测等统计工具或深度学习领域 CNN自动识别工具实现特征提取与密钥恢复的目标。
题目给了六组三对数据,分别对应低中高噪的plain和leakage。其中:
Plain:在AES加密过程中,"plain"通常指的是明文数据,即在加密之前原始的、未经加密的数据。在侧信道攻击中,攻击者的目标是尝试从加密过程中的物理或电磁泄漏中恢复出明文信息。
Leakage:在侧信道攻击中,"leakage"指的是加密设备在执行加密操作时无意中泄露的信息。这种泄露可能包括功耗、电磁辐射、计算时间等,它们可以被攻击者用来推断加密密钥或明文数据。“Leakage"可以进一步细分为不同的级别,如"high”、“medium"和"low”。
因本人知识背景局限性,只针对AES侧信道攻击恢复明文的方法做CPA攻击、DPA攻击、互信息代码演示,以求恢复明文信息。
赛题数据可通过全国高校密码数学挑战赛官方网站获取。
CPA攻击,全称为Correlation Power Analysis(相关功耗分析),是一种侧信道攻击技术,主要用于分析加密设备在执行加密算法时的功耗模式。通过测量设备在处理不同数据时的功耗变化,攻击者可以推断出加密密钥或其他敏感信息。
1 | import numpy as np |
使用互信息进行能量分析攻击
互信息(Mutual Information)是一种衡量两个随机变量之间相互依赖程度的统计量。在侧信道分析中,我们可以使用互信息来衡量假设密钥和泄漏样本之间的关系,从而恢复密钥。
密钥恢复:在具体实施过程中,攻击者基于初始密钥的每一个可能值,使用选择函数计算相应的中间值,并将泄漏信息和中间值进行离散化处理。然后计算不同密钥猜测下泄漏信息和中间值之间的互信息。互信息值最大的密钥猜测即为攻击者推断的真实密钥。
1 | import numpy as np |
实验运行环境如下:
Windows 10
Pycharm 2024.1
Intel Core i7-9700
RAM:16G
ROM:512G
初步实验时,我们首先对CPA、DPA、MIA和PDF分三种方式都进行了尝试,经过证明4种方式在不考虑选取条数的情况下都可以成功攻击出密钥,对于每种方法,我们选取不同的条数分别进行若干次,下面是我们分别从能量迹使用数量、破解密钥速度分析实验结果。首先是对于低噪声破解不同的方法选取不同的条数进行1000时的成功率(表格中第一个数据为成功率,第二个数据为平均一次攻击的时间):
表1 低噪下不同的方法选取不同的条数实验结果
| CPA | DPA(随机选取 m*n 条) | MIA | ||
|---|---|---|---|---|
| m=90 | 85.90% | 57.30% | 2.30% | 0.80% |
| n=3 | 0.1860 秒 | 0.0307 秒 | 0.6193 秒 | 0.3004 秒 |
| m=91 | 85.30% | 55.80% | 2.30% | 1.10% |
| n=3 | 0.1846 秒 | 0.0302 秒 | 0.6270 秒 | 0.6093 秒 |
| m=92 | 87.70% | 55.70% | 3.30% | 1.20% |
| n=3 | 0.1869 秒 | 0.0308 秒 | 0.6365 秒 | 0.4806 秒 |
| m=93 | 90.20% | 58.60% | 3.70% | 1.20% |
| n=3 | 0.1870 秒 | 0.0309 秒 | 0.6299 秒 | 0.5702 秒 |
表2 中噪下不同的方法选取不同的条数实验结果
| CPA | DPA(随机选取 m*n 条) | MIA | ||
|---|---|---|---|---|
| m=110 | 81.20% | 53.70% | 1.30% | 0.30% |
| n=4 | 0.2016 秒 | 0.0462 秒 | 0.8261 秒 | 4.2723 秒 |
| m=120 | 86.60% | 58.80% | 1.60% | 0.30% |
| n=4 | 0.2029 秒 | 0.0496 秒 | 0.9163 秒 | 4.8732 秒 |
| m=130 | 89.60% | 62.50% | 1.80% | 0.040% |
| n=4 | 0.2093 秒 | 0.0524 秒 | 0.9075 秒 | 5.1960 秒 |
| m=140 | 91.50% | 62.50% | 1.80% | 0.50% |
| n=4 | 0.2141 秒 | 0.0540 秒 | 0.9851 秒 | 5.3591 秒 |
表3 高噪下不同的方法选取不同的条数实验结果
| CPA | DPA(随机选取 m*n 条) | MIA | ||
|---|---|---|---|---|
| m=160 | 86.50% | 46.60% | 1.50% | 0.40% |
| n=10 | 0.2910 秒 | 0.1371 秒 | 2.2840 秒 | 10.9931 秒 |
| m=170 | 87.20% | 48.40% | 1.50% | 0.50% |
| n=10 | 0.3009 秒 | 0.1447 秒 | 2.5422 秒 | 13.3591 秒 |
| m=175 | 89.00% | 52.20% | 1.60% | 0.50% |
| n=10 | 0.3058 秒 | 0.1484 秒 | 2.8413 秒 | 15.6790 秒 |
| m=180 | 90.70% | 52.80% | 1.70% | 0.60% |
| n=10 | 0.3068 秒 | 0.1543 秒 | 3.6823 秒 | 16.3692 秒 |
| m=190 | 93.30% | 56.60% | 1.80% | 0.50% |
| n=10 | 0.3166 秒 | 0.1596 秒 | 3.9538 秒 | 17.5860 秒 |
从中我们可以发现,采用这种数据处理方法之后,CPA的实现效果在四种方法中达到最好,因此对于CPA我们还进行了多次数据尝试,具体结果如下图所示:
表 4 固定 n=2 时 CPA 所得成功率
| m | n | num | 成功率 |
|---|---|---|---|
| 130 | 2 | 260 | 86.6 |
| 135 | 2 | 270 | 86.7 |
| 140 | 2 | 280 | 89.2 |
| 145 | 2 | 290 | 90.3 |
| 150 | 2 | 300 | 90.4 |
| 155 | 2 | 310 | 91.6 |
表 5 固定 n=3 时 CPA 所得成功率
| m | n | num | 成功率 |
|---|---|---|---|
| 90 | 3 | 270 | 85.9 |
| 95 | 3 | 285 | 88.1 |
| 100 | 3 | 300 | 90.1 |
| 105 | 3 | 315 | 90.1 |
| 115 | 3 | 345 | 95 |
表 6 固定 n=4 时 CPA 所得成功率
| m | n | num | 成功率 |
|---|---|---|---|
| 70 | 4 | 280 | 82.7 |
| 74 | 4 | 296 | 85.9 |
| 76 | 4 | 304 | 87 |
| 78 | 4 | 312 | 89.6 |
| 80 | 4 | 320 | 90.5 |
| 82 | 4 | 328 | 90.9 |
表 7 固定 n=5 时 CPA 所得成功率
| m | n | num | 成功率 |
|---|---|---|---|
| 60 | 5 | 300 | 85.4 |
| 65 | 5 | 325 | 88.8 |
| 67 | 5 | 335 | 89 |
| 68 | 5 | 340 | 90.8 |
| 70 | 5 | 350 | 91.7 |