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。同樣,攻擊者也可以基於其他中間值來實施攻擊。