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