【PA 】CPA matlab代码总结(二)

2022.3.23 星期三

一、相关理论基础

相关性功耗分析(Correlation Power Analysis)

本次实验是基于 AES 的 CPA 攻击,使用虚拟操作加密,使用《能量分析攻击》这本书里配套的能量轨迹,这个训练集是使用小电阻耦合得到的;

由www.dpabook.org 提供的代码;

该代码原理讲解位于《能量分析攻击》p97-100;

CPA攻击是经典DPA攻击的延伸,其利用功耗样点与被处理数据的汉明权重之间的相关性因子进行分析(DPA的变种);

需要了解AES的加密过程,汉明重量模型。

这个讲解不错:

初探侧信道攻击:差分功耗分析破译 AES 密钥

代码:HidingInPlainSight/!!Suggested_Completion_Order!!.ipynb(python)

二、差分功耗分析仿真

使用WS3的训练集:1000条完整(16字节)的明文;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
load('WS3.mat');%{
 
aes_plaintexts:    可知的输入值(矩阵D)1000*16;
                     
traces_noDummy:    能量轨迹(矩阵T),没有插入随机指令作为防护,大小1000*25000;
      
traces_withDummy:  能量轨迹,插入了随机指令作为侧信道攻击防护,1000*25000也就是矩阵T
                    
HW:                储存汉明重量,便于后面调用     
%}
 
samples = 1000;  % 1000条明文
 
%选择是否进行了随机插值的能量轨迹
analyzed_traces = 'traces_noDummy';
%analyzed_traces = 'traces_withDummy';
byte_to_attack = 1; %选择攻击的位置:第一个字节
more off%禁用分页输出
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%读取存储空间中aes_plaintexts的第一个字节
%向量D:明文
D = aes_plaintexts(1:samples, byte_to_attack);
clear aes_plaintexts byte_to_attack
 
%选择能量轨迹
eval(sprintf('traces = %s(1:samples, :);', analyzed_traces));
%%%%%%sprintf将数据格式化为字符串
%%%%%%eval() 函数用来执行一个字符串表达式,并返回表达式的值。
%%%%%%%s 读入一个字符串,遇空格、制表符或换行符结束。
clear analyzed_traces
 
%密钥有256种可能,K的空间是256
K = uint8(0:255);
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TASK 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算中间值,就是f(d,k),这个函数的选取就是我们需要攻击的函数,计算之后是矩阵V
%明文和密钥按位异或,再进行S盒变换
V = SubBytes(bitxor(repmat(D, 1, length(K)), repmat(K, samples, 1)) + 1);
 
% 使用汉明重量计算假设能量值,计算之后是矩阵H【汉明重量模型】
H = HW(V+1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算相关性
tr_length = size(traces, 2);
R = zeros(length(K), tr_length);
%相关系数矩阵R
for key_idx = uint16(K)+1
fprintf('Working on key guess = %d\n', K(key_idx));
  
%下面计算相关系数矩阵
for k = 1:tr_length
r = corrcoef( [double(H(:,key_idx)) double(traces(:,k))] );
% corrcoef计算两个列向量相关系数,返回协方差矩阵矩阵r
 
R(key_idx, k) = r(1, 2);
% r(1, 2)为两个向量的相关系数(协方差)
 
end
end
clear key_idx k r
%如果 A' 为矩阵,则 max(A) 是包含每一行的最大值的列向量。如果 A 是向量,则 max(A) 返回 A 的最大值。
[b,c]=max(max(R'));  % c的值就是对应的正确密钥值
% 返回R中最大值rmax及其行号rn,可得猜测密钥K(rn)
fprintf('Key byte is most likely: %d\n', c);
% plot(R(rn,:));
figure
plot(R(c,:));

  

三、仿真结果

 

四、总结

 
posted @   学习记录本  阅读(1060)  评论(10编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示