【SCA】DPA matlab代碼總結(一)


2022.3.11 星期五

一、相關理論基礎

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

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

該代碼原理講解位於《能量分析攻擊》p6-8;bit泄漏模型;

需要了解AES的加密過程。

《密碼旁路分析原理與方法》郭世澤 p96-101 也有相關內容。

常用的相關性分析包括差分分析方法和線性相關系數分析,原理是利用統計方法,提取部分秘密信息,與旁路泄漏軌跡中某個特定位置的相關性。

差分分析方法通過處理0和1對應功耗均值之間的差來測量相關性:

 

 二、差分功耗分析仿真

使用WS1的訓練集:該能量跡對應inputs加載,addRoundKey,subbytes操作。

1.dpa函數

 

%%WS1.mat:該能量跡對應inputs加載,addRoundKey,subbytes操作。
%inputs 200x1 200條明文,但只給了16個輸入字節的一個字節。
%traces 200x50000 
%subytes 1x256 :字節替換,通過一個非線性的替換函數,用查找表的方式把每個字節替換成對應的字節。
%byte_Hamming_weight 字節漢明重量【本程序沒有用】
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%dpa函數
function [key_trace] = dpa1(traces,SubBytes,inputs)
%差分攻擊
%第一步加載,s盒、能量跡、明文
 %load SubBytes;%加載AES的S盒
 %load races;能量跡
 %load inputs;明文
%第二步 [key_trace] = dpa1(traces,SubBytes,inputs)
%第三步  show_plots(key_trace,1,256,4,5000)最后一個5000為y坐標軸的范圍,4為每次出現圖像的個數

[m,n] = size(traces);
key = [0:255];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%方法一%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%addRoundKey:明文和密鑰異或后的數據為mix
for i=1:m
    mix(i,:) = bitxor(inputs(i),key);
end

s= reshape(SubBytes, 16, 16)';%將SubBytes1x256轉成16x16【注意轉置】
after_sbox = zeros(m,256);
%s盒輸入,字節替換
         %每個單字節數據的高 4 位作為 x 值,低 4 位作為 y 值。
         %然后根據行列號在 S 盒置換表中查找對應值,將找到的單字節數據作為字節替換操作的輸出結果。
         %S 盒可以作為查找表實現。可能只有 256個字節可以替換的值,因此需要 256 個字節的內存。
for i=1:m
     for j=1:256
         h=bitget( mix(i,j),8:-1:5);%s盒輸入的高四位二進制【bitget獲取指定位置的位】
         l=bitget( mix(i,j),4:-1:1);%s盒輸入低四位二進制
         H=bin2dec(num2str(h));%s盒輸入的高四位二進制轉十進制
         L=bin2dec(num2str(l));%s盒輸入低四位二進制轉十進制
         after_sbox(i,j)=s(H+1,L+1);%最終得到s和代換后的數據
     end
end   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%結束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%方法二:另一種字節替換方式%%%%%%%%%%%%%%
%after_sbox = zeros(m,256);
%for i=1:m
%    after_sbox(i,:) = SubBytes(bitxor(inputs(i),key)+1);
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


 key_trace = zeros(256,n);%n=5000;
    power_consumption = bitget(after_sbox,1);%攻擊位置是s盒變換后的數據的LSB【比特模型】;數據為0和1;
    for i=1:256
        %一次AES加密操作的能量消耗與after_sbox的LSB之間的依賴關系
        %第1bit為1的能量跡放一波,為0的放一波,相減后,最大尖峰的為正確的猜測密鑰
        %無尖峰:如果用錯誤的密鑰計算,沒有依賴性
     %小尖峰:該密鑰計算得出的與實際測量的不完全獨立,但依賴性遠遠小於正確的密鑰
        key_trace(i,:) = sum(traces(find(power_consumption(:,i)==1),:)) - sum(traces(find(power_consumption(:,i)==0),:));
    end
   save  key_trace;%key_trace 256x5000
end

 

2.show_plots函數

function show_plots(variable, firstplot, lastplot, step, yscale)

%SHOW_PLOTS plots rows of a matrix in separate windows
%單獨的窗口中繪制矩陣的行
% DESCRIPTION:
%
% show_plots(variable, firstplot, lastplot, step, yscale) 
% plots each row a matrix in a separate window 
% 
% - variable : 應繪制的矩陣	       
% - firstplot (optional): 要繪制的第一行的編號;默認值為1
% - lastplot  (optional): 要打印的最后一行的編號;默認值是行的總數
% - step      (optional): 同時顯示的繪圖數量;默認值為6(大屏幕使用6,小屏幕使用4))
% - yscale    (optional): 設置y軸上顯示的值的范圍;顯示從-yscale到+yscale的值;yscale的默認值為1     
%		
%
% EXAMPLE:
%                                            
% show_plots(unidrnd(10,8,10),1,8,4,10)


if (~(exist('yscale','var') == 1))
    yscale = 1; 
end

if (~(exist('firstplot','var') == 1))
    firstplot = 1; 
end

if (~(exist('lastplot','var') == 1))
    lastplot = size(variable,1); 
end

if (~(exist('step','var') == 1))
    step = 6;
end

for key=firstplot:step:lastplot

    for i=key:(key+step - 1)

       figure(i - key +1);

       if (i<=lastplot)
            keydata = variable(i,:);
         
            n = length(keydata);

            plot(keydata);
            axis([0 n -yscale yscale])
            xlabel('time')
            ylabel('Voltage / Corrlelation')

            titletext = sprintf('Plot Number: %d, Max: %2.4f, Min: %2.4f',i, max(keydata), min(keydata));
            titletext = strrep(titletext,'\','\\');
            titletext = strrep(titletext,'_','\_');
            title(titletext);
       else
%          close 
       end
   end
   
   disp('Press any key for next file')
   pause;
end

 3.函數調用

load('WS1.mat'); 
[key_trace] = dpa1(traces,SubBytes,inputs);
show_plots(key_trace,1,256,4,5000);

三、仿真結果

由以上程序可以得到下面結果,可以看出,當猜測的密鑰錯誤時,沒有明顯的尖峰。

其中index_key = 44時,尖峰明顯,說明該子密鑰是是43的可能性很大

四、總結

 DPA利用了一個這樣的事實:微控制器的能量消耗依賴於算法執行過程中所處理的中間值。本次實驗的能量消耗依賴於AES加密第一輪中的SubBytes變換的第一個輸出字節的MSB。同樣,攻擊者也可以基於其他中間值來實施攻擊。                                                                            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM