前言算法
最近在作老師留的翻譯做業的時候。發現了不少有關於側信道攻擊的文章。目前,在國內的安全圈子中不多看到與側信道有關的內容,但願這篇能夠作一個補充。spring
我先挖個坑,但願會寫3篇,這是第一篇,差分能量攻擊(DPA),第二篇多是cache攻擊,第三篇TEMPEST攻擊,我但願我會寫完。安全
學習一項技能最好的辦法就是親手操做一下,斯普林格出版社出版的側信道攻擊年刊裏的一篇文章,做者使用DPA攻擊了一個沒有設防的IC卡,而且給出了完整的數據集;www.dpabook.org 上也有可有完整的能量軌跡和matlab代碼示例,這樣就給了咱們動手練習的基礎,我也加入了其餘我讀到的一些內容,這篇文章是個人一個總結,若是有錯誤,但願各位前輩提醒指正。架構
I.背景知識ide
芯片在運行的時候,因爲數據或者邏輯的不一樣,內部的晶體管通斷是有區別的,經過這個區別來肯定程序內部的數據或者指令,就是側信道攻擊。獲取這個區別有不少方法,好比在芯片的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
相比於不正確的密鑰,相差很大。圖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