简介
本篇将继续跟随chipwhisperer-jupyter sca101的教程来学习,汉明重量和能量消耗之间的关系
开始
同样Lab 4_1 - Power and Hamming Weight Relationship有硬件和模拟之分,这里同样选择将HARDWARE的内容复制到MAIN中执行
这里根据提示只修改PLATFORM为"CWLITEXMEGA"(当然根据提示"CWLITEXMEGA"还可以修改CRYPTO_TARGET)
前面的代码作用依旧是编译目标板的固件并刷入,之间运行即可
接着代码是抓取1000条能量迹,同样运行即可
接着根据提示,复制前两篇用到的AES模型到此处执行即可
接下来看到如下提示,大意是:“回想一下,功耗与微控制器之间存在关系的原因是,设置数据需要消耗能量。我们还看到,设置的数据越多,平均功耗越大。事实上,能量消耗与设置为1的bit的个数(汉明重量)存在一定的联系。虽然汉明重量是一个非常简单的概念,但是它实际上不容易计算。但在python中有更简单的方式,将待计算的数转换为二进制的字符串,然后计算1的个数即可”
接着的代码是,制作一个256字节对应的汉明重量的表,后续可直接通过查表来获得汉明重量
接下来的提示,大意是"我们第一个问题是我们不知道SBox操作发生在哪?它应该发生在非常接近起点的位置(让我们猜测它发生在最开始的2000个样本中)。一个想法是我们可以根据汉明重量将能量迹分组然后给每组分配一个颜色。如果我们画出图,我们也许就可以找到一种模式。"
运行截图如下图所示:
接着可以看到如下提示信息,大意就是,从上图看不出什么来,那是因为SBox只是很小一部分,有许多噪声影响了观察,所以需要重新处理数据,先按汉明重量分组后求平均值,再将每组平均值减去总体的平均值,然后再重新画图
补全后代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24hw_groups=[[] for i in range(9)]
import numpy as np
bnum = 0
for tnum in range(len(trace_array)):
hw_of_byte = HW[aes_internal(textin_array[tnum][bnum], key[bnum])]
hw_groups[hw_of_byte].append(trace_array[tnum])
hw_averages = [np.mean(np.array(each), axis=0) for each in hw_groups]
avg_trace=np.mean(trace_array, axis=0)
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
from bokeh.palettes import brewer
output_notebook()
p = figure()
plot_start = 0
plot_end = 2000
xrange = range(len(trace_array[0]))[plot_start:plot_end]
color_mapper = brewer['PRGn'][9]
for hw in range(9):
p.line(xrange, (hw_averages[hw]-avg_trace)[plot_start:plot_end], line_color=color_mapper[hw])重新画图结果如下图所示
根据如下提示,运行代码,可以找到图中差异最大的地方
接着有如下提示,大意是“现在可以知道SBox操作发生的地方了,用上面的sbox_loc来重新画图,要使用**
hw_averages[:,sbox_loc]
**来取值需要将hw_averages转换为numpy array”最终结果如下图所示,可以看到汉明重量与能量消耗呈现出线性关系
总结
- 学习了汉明重量与能耗之间的关系,通过画图知道两者是线性相关的关系