作者:backahasten

稿費:350RMB

投稿方式:傳送郵件至linwei#

http://

360。cn

,或登陸網頁版線上投稿

前言

最近在做老師留的翻譯作業的時候。發現了很多有關於側通道攻擊的文章。目前,

在國內的安全圈子中很少看到與側通道有關的內容,希望這篇可以做一個補充。

我先挖個坑,希望會寫3篇,這是第一篇,差分能量攻擊(DPA),第二篇可能是cache攻擊,第三篇TEMPEST攻擊,我希望我會寫完。

學習一項技能最好的辦法就是親手操作一下,斯普林格出版社出版的側通道攻擊年刊裡的一篇文章,作者使用DPA攻擊了一個沒有設防的IC卡,並且給出了完整的資料集;www。dpabook。org 上也有可有完整的能量軌跡和matlab程式碼示例,這樣就給了我們動手練習的基礎,我也加入了其他我讀到的一些內容,這篇文章是我的一個總結,如果有錯誤,希望各位前輩提醒指正。

I.背景知識

晶片在執行的時候,由於資料或者邏輯的不同,內部的電晶體通斷是有區別的,透過這個區別來確定程式內部的資料或者指令,就是側通道攻擊。獲取這個區別有很多方法,比如在晶片的GND引腳處獲取電壓,透過探針去擷取晶片輻射的變化等等。

我們的身邊有很多密碼學裝置,比如大家的銀行卡,門禁卡手機卡等等,側通道攻擊原來主要是針對這些裝置的,可是隨著人們對側通道攻擊的重視,密碼學裝置都增加了對側通道攻擊的防護,(當然,有一些沒有防護),側通道攻擊和資訊保安的其他技術一樣,都是一個動態發展的過程。

側通道攻擊近幾年也在智慧硬體的攻擊上被使用,比如2016年,就有人使用SPA(另一種側通道攻擊方法)攻擊了一個智慧保險箱。總之,側通道攻擊對於運算單一,時鐘頻率低(時鐘頻率低這點很重要)的裝置中的加密攻擊是很有效的。

在本文的第二部分,我會簡單介紹一下攻擊的流程,給大家建立起一個思維架構;第三部分,我會先使用網站上和書中的能量軌跡結合攻擊的使用的演算法開展一個真實的攻擊,第四部分,我會說一些多樣話的攻擊方法和能量軌跡的獲取。最後,我會給大家推薦一些有關於這個方面的書和文件。ps:怎麼有寫論文的感覺。

II.攻擊流程

針對與所有的側通道攻擊(包括DPA,TEMPSET,cache洩露等)主要就是兩個思路,第一個就是側通道洩露的擷取,第二個是資訊的恢復。本節我會主要介紹這兩點(只針對這種小裝置中的密碼學攻擊的情況)。

1.資訊的擷取

裝置上,示波器是必須的,無論如何,示波器一定要有把資料傳輸給電腦的能力,因為之後的處理都是使用matlab進行的。根據《能量分析攻擊》這本書中的介紹,針對晶片,主要有以下幾種獲取洩露的方法。

在GND引腳處串聯一個小電阻,大概是1~50歐姆,之後使用示波器測量電阻上的電壓。

使用電場探針或者磁場探針獲取晶片的電磁洩露。

還有很多其他的方法,比如什麼表面掃面法,工作臺法拉第籠法等等,這還是要根據具體情況去具體分析。在這裡,我們將使用《能量分析攻擊》這本書裡配套的能量軌跡,這個訓練集是使用小電阻耦合得到的。

2.資訊的恢復

這種型別的側通道攻擊,主要有

簡單能量分析攻擊

差分能量分析攻擊

等。

簡單能量分析攻擊:

簡單一點說,就是把能量軌跡顯示出來之後用眼睛“看”,當然,也有很多輔助看的方法,比如模板碰撞。SPA的有點是需要的能量軌跡少,缺點是需要洩露比較明顯,對噪音的敏感性大。這不是我們的重點,就不說了,有興趣的師傅可以看我後面推薦的書。ps:主要是我不太熟悉,逃。。。。

差分能量攻擊:

和模板類似,我們要使用已知的明文或者密文對加密演算法的一個步驟進行匹配。可以說成只針對一個步驟的金鑰的爆破。DPA的優點是,即使洩露較小,也可以有效識別,有天然的對噪音的過濾,缺點是需要的能量軌跡很多。

DPA的基本想法就是,透過大量的能量軌跡計算能量軌跡和資料的依賴性。

獲取能量軌跡:

首先,我們要確定一箇中間值f(d,k),這個f一般是密碼學演算法的一箇中間值,d必須是已知的,我們整個DPA的目的就是求k,k可能是金鑰的一部分,或者金鑰派生出來的值。接下來,使用示波器去接受對應的能量軌跡。完成之後我們有兩個矩陣,第一個矩陣是一個只有一列的矩陣(或許應該叫向量),內容是我們已知的或者是可控的d值,長度是len(d),我們叫他大D。第二個矩陣T是一個len(d)*T的矩陣,T是取樣的點數,也就是能量軌跡的長度。每一個d對應矩陣C的一行。這裡牽扯到能量軌跡對齊的問題,我們會在第四節討論這個問題。

計算假設的中間值:

接下來,我們需要一個向量大K,大K應該包含所有小k,即遍歷所有k的金鑰空間。之後,使用矩陣D和矩陣大K生成矩陣V,使用如下的虛擬碼進行解釋。

for i = 1:1:len(D)

for n = 1:1:len(K)

V(i,n) = f(D[i],K[n]);

end

end

這樣,我們就得到了矩陣V,矩陣V的每一行是已知值d相同,金鑰K不同,每一列是金鑰值k相同,已知值不同。

生成能量模型:

這一步,我們使用上文的V矩陣生成一個對應的矩陣H,矩陣H的名字叫假設能量消耗模型,其中的值就是我們假設的能量消耗值。

有很多方法去獲得這個能量的消耗值,比如使用器件級別甚至電晶體級別的模擬,可是這樣就需要對晶片的結構有很深的瞭解,牽扯到了“晶片逆向”這門武林絕學。實際上,有很多簡易的方法可以做到同樣的效果。比如漢明距離和漢明重量。

看一串二進位制:00111010,10001110,漢明距離是兩個二進位制數中,0到1或者1到0的轉換的個數,在這裡,就是4,因為第1,3,4,6位有轉換。漢明重量是二進位制數中1的個數,這兩個二進位制數的漢明重量都是4。

同樣的,還有很多方法可以,我們會在第四節繼續討論。

比較兩個能量軌跡

這個比較有很多種模型和方法,我們只說一種最常用的,基於相關係數的攻擊。在這一步,我們參與運算的矩陣是測量的矩陣C和我們生成能量的模型V。計算方法如下。

[d1,k] = size(H);

[d2,t] = size(T);

for

i = 1:1:k

for

j = 1:1:t

ans = corrcoef(H(:,i),T(:,j));

R(i,j) = ans(1,2);

end

end

之後,我們就可以得到相關係數矩陣R,每一行代表真實的金鑰值和我們假設的金鑰值的相關係數,最大的哪條,就是我們要找的金鑰值,對應的T時刻,就是這一步中間函式執行的時刻。

III.演示例項

我們先來回憶一下數學符號的問題:

f(d,k)函式:這是密碼學計算的一箇中間步驟,d是我們已知的明文或者密文,k是我們要獲取的部分金鑰。

D,一個向量,裡面儲存著我們已知的明文或者密文d。

K,一個向量,遍歷所有可能的金鑰值k。

T,一個矩陣,每一行是隨時間變化而變化的能量值,行數是已知的明文或密文d的數量。

V,一個矩陣,是使用f函式計算了所有可能D,K之後的值。

H,把矩陣V的每一位使用生成能量模型計算之後的值,大小與V相同。

我使用網站上的能量軌跡進行測試,它包含了3個能量軌跡,ws1-3,我使用最一般化的ws3能量軌跡。

什麼叫最一般化呢,就是實際情況中,攻擊者可以相對輕鬆獲取的軌跡。比如,獲取到的能量軌跡是失調的。失調的原因可能是在獲取矩陣T的時候,本來要求的是所有的取樣點數應該是與晶片內部執行的時間對齊的,可是這在現實中是不太可能完全對齊的,因為這需要很小心的去設定示波器的觸發。或者是晶片使用了亂序操作來對側通道進行防禦。

我先直接給出他的程式碼和執行之後的結果,並使用註釋對程式碼進行解釋。

load(‘WS3。mat’);

%{

aes_plaintexts: 可知的輸入值,也就是矩陣D,這裡大小是1000*16,也就是有16次不同的輸入,我們這裡只對第一次進行攻擊

traces_noDummy: 能量軌跡,沒有插入隨機指令作為防護,1000*25000也就是矩陣T

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

HW: 用來儲存漢明重量,便於後面呼叫

%}

samples = 1000;

%選擇是否進行了隨機插值的能量軌跡,下文會進行對比

analyzed_traces = ‘traces_noDummy’;

%analyzed_traces = ‘traces_withDummy’;

%選擇哪條能量軌跡進行攻擊,一共有16條

byte_to_attack = 1;

more off

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 讀取儲存空間中aes_plaintexts的第一列

D = aes_plaintexts(1:samples, byte_to_attack);

clear aes_plaintexts byte_to_attack

% 選擇能量軌跡

eval(sprintf(‘traces = %s(1:samples, :);’, analyzed_traces));

clear analyzed_traces

%金鑰有256種可能,K的空間是256

K = uint8(0:255);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% TASK 2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 計算中間值,這個就是上文中的f(d,k),這個函式的選取就是我們需要攻擊的函式,計算之後是矩陣V

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);

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))] );

R(key_idx, k) = r(1, 2);

end

end

clear key_idx k r

%下面我改了一些,有助於快速定位攻擊成功的位置

[b,c]=max(max(R‘)); % c的值就是對應的正確金鑰值

plot(R(c,:));

我們看下攻擊的結果(執行時間比較長)。下面是TASK 2執行之後,正確金鑰0x10的圖。圖3_1

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

相比於不正確的金鑰,相差很大。圖3_2

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

對於沒有進行很好對對齊的能量軌跡(matlab指令碼中選擇analyzed_traces = ’traces_withDummy‘;),也有明顯的相關性峰值,只不過最大值會縮小。圖3_3

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

IV.尾聲

1.最佳化

我們先來考慮一下,有什麼可以最佳化的。

所以先要來考慮,為什麼要最佳化。

最佳化,就是為了可以使用更少的能量軌跡,去攻擊洩露更不明顯的能量軌跡。或者是繞過一些防禦手段,比如掩碼防護,或者針對不知到計算細節的特殊加密方案的攻擊,等等。

我們再來看一看,有什麼地方值得最佳化,比如生成假設能量模型和對比假設能量模型和實際能量模型,可以使用不同的模型使得獲取到的假設模型和比較結果更最佳化。我們的示例只針對了一箇中間量來進行計算,那麼對於使用了掩碼的能量軌跡,我們可以使用幾個中間量進行高階DPA攻擊。對於不知道具體計算過程的演算法,可以使用旁路立方體攻擊,等等。需要最佳化的地方還很多。

2.能量軌跡的獲取

這是個很重要的問題,我沒有單獨拿出一章來講的原因是我沒有實際操作過,主要是因為沒錢買適合的示波器。我會簡單的介紹一下。

在2017年斯普林格出版的 Hardware Security and Trust 年刊第四篇 Practical Session: Differential Power Analysis for Beginners中,介紹了作者獲取IC卡能量軌跡的方法,具有很強的通用性,可以借鑑一下。待我有錢買示波器之後,我也會自己動手做一遍。

diy一個板子,引出IC卡的接觸引腳,如圖4_1

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

之後按如下的方法接線,一路測量資料,另外一路測量功率圖4_2

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

使用JSmartCard Explorer透過一個讀卡器與接觸式IC卡進行互動,使用 PicoScope 6 GUI讀取能量軌跡。4。4

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

圖4_3

側通道攻擊,從喊666到入門之——差分能量攻擊初探

側通道攻擊,從喊666到入門之——差分能量攻擊初探

V.參考

《能量分析攻擊》(奧地利)Stefan Mangard、Elisabeth Oswald、Thomas Popp,馮登國,周永彬,劉繼業 譯 科學出版社。以及配套網站,www。dpabook。org(入門好書)

《密碼旁路分析原理與方法》郭世澤 王韜 趙新傑 科學出版社 (進階必備)

N本斯普林格出版社(springer)年刊 Constructive Side-Channel Analysis and Secure Design

N本斯普林格出版社年刊 Hardware Security and Trust

檔案下載

連結:

https://

pan。baidu。com/s/1hrSJkf

6

密碼:qgh8