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,:));
三、仿真結果

