側信道攻擊,從喊666到入門之——差分能量攻擊初探
作者: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)nfor n = 1:1:len(K)nV(i,n) = f(D[i],K[n]); nendnendn
這樣,我們就得到了矩陣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);n%{naes_plaintexts: 可知的輸入值,也就是矩陣D,這裡大小是1000*16,也就是有16次不同的輸入,我們這裡只對第一次進行攻擊ntraces_noDummy: 能量軌跡,沒有插入隨機指令作為防護,1000*25000也就是矩陣Tntraces_withDummy: 能量軌跡,插入了隨機指令作為側信道攻擊防護,1000*25000也就是矩陣TnHW: 用來儲存漢明重量,便於後面調用 n%}nsamples = 1000;n%選擇是否進行了隨機插值的能量軌跡,下文會進行對比nanalyzed_traces = traces_noDummy;n%analyzed_traces = traces_withDummy;n%選擇哪條能量軌跡進行攻擊,一共有16條nbyte_to_attack = 1;nmore offn%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n% 讀取存儲空間中aes_plaintexts的第一列nD = aes_plaintexts(1:samples, byte_to_attack);nclear aes_plaintexts byte_to_attackn% 選擇能量軌跡neval(sprintf(traces = %s(1:samples, :);, analyzed_traces));nclear analyzed_tracesn%密鑰有256種可能,K的空間是256nK = uint8(0:255);n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n% TASK 2n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n% 計算中間值,這個就是上文中的f(d,k),這個函數的選取就是我們需要攻擊的函數,計算之後是矩陣VnV = SubBytes(bitxor(repmat(D, 1, length(K)), repmat(K, samples, 1)) + 1);n% 使用漢明重量計算假設能量值,計算之後是矩陣HnH = HW(V+1);n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n% 計算相關性ntr_length = size(traces, 2);nR = zeros(length(K), tr_length);nfor key_idx = uint16(K)+1nfprintf(Working on key guess = %dn, K(key_idx));n n%下面計算相關係數矩陣nfor k = 1:tr_lengthnr = corrcoef( [double(H(:,key_idx)) double(traces(:,k))] );nR(key_idx, k) = r(1, 2);nendnendnclear key_idx k rn%下面我改了一些,有助於快速定位攻擊成功的位置n[b,c]=max(max(R)); % c的值就是對應的正確密鑰值nplot(R(c,:)); n
我們看下攻擊的結果(運行時間比較長)。下面是TASK 2運行之後,正確密鑰0x10的圖。圖3_1
相比於不正確的密鑰,相差很大。圖3_2
對於沒有進行很好對對齊的能量軌跡(matlab腳本中選擇analyzed_traces = traces_withDummy;),也有明顯的相關性峰值,只不過最大值會縮小。圖3_3
IV.尾聲
1.優化
我們先來考慮一下,有什麼可以優化的。
所以先要來考慮,為什麼要優化。
優化,就是為了可以使用更少的能量軌跡,去攻擊泄露更不明顯的能量軌跡。或者是繞過一些防禦手段,比如掩碼防護,或者針對不知到計算細節的特殊加密方案的攻擊,等等。
我們再來看一看,有什麼地方值得優化,比如生成假設能量模型和對比假設能量模型和實際能量模型,可以使用不同的模型使得獲取到的假設模型和比較結果更優化。我們的示例只針對了一個中間量來進行計算,那麼對於使用了掩碼的能量軌跡,我們可以使用幾個中間量進行高階DPA攻擊。對於不知道具體計算過程的演算法,可以使用旁路立方體攻擊,等等。需要優化的地方還很多。
2.能量軌跡的獲取
這是個很重要的問題,我沒有單獨拿出一章來講的原因是我沒有實際操作過,主要是因為沒錢買適合的示波器。我會簡單的介紹一下。
在2017年斯普林格出版的 Hardware Security and Trust 年刊第四篇 Practical Session: Differential Power Analysis for Beginners中,介紹了作者獲取IC卡能量軌跡的方法,具有很強的通用性,可以借鑒一下。待我有錢買示波器之後,我也會自己動手做一遍。
diy一個板子,引出IC卡的接觸引腳,如圖4_1
之後按如下的方法接線,一路測量數據,另外一路測量功率圖4_2
使用JSmartCard Explorer通過一個讀卡器與接觸式IC卡進行交互,使用 PicoScope 6 GUI讀取能量軌跡。4.4
圖4_3
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/1hrSJkf6 密碼:qgh8
推薦閱讀:
※王寶強離婚與徐玉玉被騙(上)
※如何看待弓峰敏、卜崢聯袂加盟滴滴?
※花無涯帶你走進黑客世界3 白帽和黑帽
※Web 應用安全基礎