参考大佬文章,收益匪浅 因为这是课内实验,所以我并没有把所有代码都上传,参考的文章里代码很全。
实验目的
掌握AES算法能量迹构造;
掌握AES算法CPA攻击基本原理。
实验人数
每组1人
系统环境
Windows
实验原理
CPA是利用密码芯片的假设模型,预测其加解密时的功耗大小,然后和实际测量的功耗大小进行相关性分析推测密钥。CPA攻击通常采用汉明重量模型,所谓汉明权重就是一个码字中1码元的总数目,汉明权重越大,芯片运算时的功耗就越大。
实验内容
Readfile-student.py:AES 能耗波形文件读入与存储,“Save2Npy”函数输出能量迹trace数据。
分析程序读入的pts、pcts、pns分别是什么数据,类型是什么,维数是多少
CPA-student.py:根据汉明重量模型恢复16个字节密钥。
补充相关系数的计算代码,并取最大值记为maxcpa
解释每个生成图像的含义(横纵坐标、波形、尖峰等)
打印输出恢复的所有正确密钥bestguess
分析能量迹对密钥恢复的影响:10、50、100、150、200、240条能量迹能够恢复的正确密钥的字节数和位置分别是什么,并分析其原因。
实验步骤
pts、pcts、pns分别是什么数据、类型、维数
pts
图6.1 pts部分数据
数据:明文
类型:数组
维数:二维(250,16)
pcts
图6.2 pcts部分数据
数据:明文,密文
类型:数组
维数:三维(250,2,16)
pns
图6.3 pns部分数据
数据:能量迹纵坐标
类型:数组
维数:二维(250,10000)
完善相关系数的计算代码
hwlist = np.zeros(numtraces)语句之前的代码是程序自带的,最外层的for循环的目的是遍历密钥的字节位置,第二层的for循环是遍历所有密钥的可能性。本次实验需要使用能量迹的明文和密钥异或运算并执行后续代码,所以还需要设置一层循环,使得对应设置数量的能量迹明文可以和密钥进行运算,求得汉明重量,代码如下。
hwlist = np.zeros(numtraces) #初始化数组
for tnum in range(0, numtraces):
hwlist[tnum] = HW[intermediate(pt[tnum][bnum], kguess)]
注意一点pt二维数组(程序另有设置明文数组为pt)的取值,pts明文数组中250表示明文数量,而16是明文的size,所以明文数组长度为16。
因为是汉明重量模型,按照以往实验的思路,下一步是根据相关系数计算公式 r i , j = ∑ d = 1 D [ ( h d , i − h i ‾ ) ( t d , j − t j ‾ ) ] ∑ d = 1 D ( h d , i − h i ‾ ) 2 ∑ d = 1 D ( t d , j − t j ‾ ) 2 {r_{i,j}} = \frac{
{\sum\nolimits_{d = 1}^D {\left[ {\left( {
{h_{d,i}} - \overline {
{h_i}} } \right)\left( {
{t_{d,j}} - \overline {
{t_j}} } \right)} \right]} }}{
{\sqrt {\sum\nolimits_{d = 1}^D {
{
{\left( {
{h_{d,i}} - \overline {
{h_i}} } \right)}^2}} \sum\nolimits_{d = 1}^D {
{
{\left( {
{t_{d,j}} - \overline {
{t_j}} } \right)}^2}} } }} ri,j=∑d=1D(hd,i−<