2022.3.23 星期三
一、相关理论基础
相关性功耗分析(Correlation Power Analysis)
本次实验是基于 AES 的 CPA 攻击,使用虚拟操作加密,使用《能量分析攻击》这本书里配套的能量轨迹,这个训练集是使用小电阻耦合得到的;
由www.dpabook.org 提供的代码;
该代码原理讲解位于《能量分析攻击》p97-100;
CPA攻击是经典DPA攻击的延伸,其利用功耗样点与被处理数据的汉明权重之间的相关性因子进行分析(DPA的变种);
需要了解AES的加密过程,汉明重量模型。
这个讲解不错:
代码:HidingInPlainSight/!!Suggested_Completion_Order!!.ipynb(python)
二、差分功耗分析仿真
使用WS3的训练集:1000条完整(16字节)的明文;
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,:));
三、仿真结果