1. 程式人生 > 其它 >【能量分析攻擊】DPA程式碼總結(二)

【能量分析攻擊】DPA程式碼總結(二)

2022.3.23 星期三

一、相關理論基礎

本次實驗是基於 AES 的 DPA 攻擊,使用虛擬操作加密,使用《能量分析攻擊》這本書裡配套的能量軌跡,這個訓練集是使用小電阻耦合得到的;

由www.dpabook.org 提供的程式碼;

該程式碼原理講解位於《能量分析攻擊》p97-100;

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

二、差分功耗分析模擬

使用WS3的訓練集:1000條完整(16位元組)的明文;

load('WS3.mat');
%{
aes_plaintexts:    可知的輸入值(矩陣D),大小是1000*16;1000條能量跡
                    

traces_noDummy:    能量軌跡(矩陣T),沒有插入隨機指令作為防護,大小1000*25000;
                    1000*25000表示對1000個明文,每個取樣25000個能量洩露點
                   

traces_withDummy:  能量軌跡,插入了隨機指令作為側通道攻擊防護,1000*25000也就是矩陣T
                    

HW:                用來儲存漢明重量,便於後面呼叫        
%}
samples = 1000;  % 1000個明文即1000條取樣軌跡數

%選擇是否進行了隨機插值的能量軌跡
analyzed_traces = 'traces_noDummy';
%analyzed_traces = 'traces_withDummy';

byte_to_attack = 1; %選擇攻擊的位置,第一個位元組
more off%禁用分頁輸出
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%讀取儲存空間中aes_plaintexts的第一列
%向量D:表示1000條能量跡的在一次相同操作下對應的資料
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 %bitxor按位異或 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,:));