深度学习赋能侧信道攻击
#前言
這是IoT的時代,這也是AI的時代。
在IoT時代,針對IoT設備上的密碼芯片進行側信道分析是極其活躍的領域,是研究IoT安全至關重要的一環。在AI時代,目前引領AI第三次復興的技術便是深度學習。將側信道與深度學習相結合會有什么效果,本文對此進行了嘗試。
側信道分析部分,思路是根據power trace(能耗軌跡),從運行在ARM CPU上的AES算法實現中恢復AES密鑰。在深度學習則是賦能于側信道分析,我們將power trace處理后的數據集作為深度學習系統的輸入,訓練神經網絡,使其預測key字節,作為輸出。
下文中我們會首先介紹AES、側信道分析、深度學習等前置知識,然后以實戰為導向實現對16字節密鑰的恢復。
?
#AES
高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。現在,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。
AES的區塊長度固定為128比特,密鑰長度則可以是128,192或256比特;而Rijndael使用的密鑰和區塊長度均可以是128,192或256比特.(本文就是針對密鑰長度為128比特(16字節)的AES實現進行攻擊)。
大多數AES計算是在一個特別的有限域完成的。
AES加密過程是在一個4×4的字節矩陣上運作,這個矩陣又稱為“體(state)”,其初值就是一個明文區塊(矩陣中一個元素大小就是明文區塊中的一個Byte)。(Rijndael加密法因支持更大的區塊,其矩陣的“列數(Row number)”可視情況增加)加密時,各輪AES加密循環(除最后一輪外)均包含4個步驟:
AddRoundKey—矩陣中的每一個字節都與該次回合密鑰(round key)做XOR運算;每個子密鑰由密鑰生成方案產生。
SubBytes—透過一個非線性的替換函數,用查找表的方式把每個字節替換成對應的字節。
?
ShiftRows—將矩陣中的每個橫列進行循環式移位。?
MixColumns—為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每內聯的四個字節。最后一個加密循環中省略MixColumns步驟,而以另一個AddRoundKey取代。
?
#側信道攻擊
側信道攻擊的過程可以簡單概括為:攻擊者使用示波器采集密碼算法在目標設備上運行時的計時、功耗、電磁輻射、聲音、熱量、射頻、故障輸出等旁路泄露信息,接著分析這些信息和密碼設備執行過程中的中間運算、中間狀態的關系(這些中間運算、中間狀態依賴于密碼算法的密鑰),進而根據分析結果恢復出密鑰。攻擊者采集的旁路泄露信息又被稱作能量軌跡(power trace),在分析power trace和中間運算、中間狀態的關系之前,需要對power trace進行預處理(見下文)。
另外,在下文會提到“攻擊點”的概念,這里先做說明。
攻擊的目標是恢復key字節的值,但是在實際中除非你捕獲到了加載到內存中的key,否則而基本不會直接捕獲到key。事實上,我們預測的是稱為攻擊點的值,這些攻擊點也叫做敏感變量。攻擊點是內存中的點,在這個點上,計算會導致內存出現變化(比如更改了一個寄存器的值,或者設置了值等),這些變化與我們嘗試恢復的key有關系(比如異或)。更改內存值會導致功耗發生變化,這意味著這些更改可以從功耗軌跡中發現。
如下圖所示
?
左圖是AES中所有的攻擊點(攻擊點由黃/紅點表示),然而在實際應用上,他們大多數是不可逆的,可逆的意思是說可以從猜測值推測出key字節的值。只有紅點是直接可逆的,他們都位于第一輪,示意圖如上圖的右圖所示。
可以看到組成包括key、sub_bytes_in,sub_bytes_out。
其中key是我們希望通過推理得到的,sub_bytes_in是當key和明文一起存儲后的目標字節的值,sub_bytes_out是使用AES盒替換另一個值之后的字節值。
對于我們要攻擊的算法來說,sub_bytes_in,sub_bytes_out都很容易受到攻擊。
?
#深度學習
深度學習(英語:deep learning)是機器學習的分支,是一種以人工神經網絡為架構,對資料進行表征學習的算法。
?
深度學習是機器學習中一種基于對數據進行表征學習的算法。觀測值(例如一幅圖像)可以使用多種方式來表示,如每個像素強度值的向量,或者更抽象地表示成一系列邊、特定形狀的區域等。而使用某些特定的表示方法更容易從實例中學習任務(例如,人臉識別或面部表情識別)。深度學習的好處是用非監督式或半監督式的特征學習和分層特征提取高效算法來替代手工獲取特征
為什么使用深度學習來做SCA?
第一點最顯然的原因,也是其他領域也會使用深度學習的原因,就是深度學習可以直接從原始功耗或trace中學習,而不是依賴人工設計的特征和假設,這使得攻擊更易設計,減少了對特定領域專業知識的需求。
第二點是因為模型可以直接學習預測目標中間值,而不需要使用近似模型(相當于模板攻擊而言),這也簡化了攻擊設計。
第三點是因為使用深度學習可以進行概率攻擊(利用softmax),因為模型在多個power trace上輸出的分數可以被直接排序得到可能性最大的字節值。
?
#構建數據集
首先我們需要構建數據集,之后才能在其上訓練模型。這一步的關鍵就是收集power trace
怎么收集power trace呢?
流程如下所示
?
1.啟動示波器開始捕獲
2.觸發硬件上的加密過程(選定的或者是隨機的key和明文進行加密)
3.在加密結束時,停止捕獲并從示波器收集power trace。我們構造數據集時會將trace及對應的標簽(使用的key和明文)都加入進去
我們使用示波器來捕獲,所需的硬件設備示意圖如下所示
?
紅板中間放的是待分析的芯片,下面是示波器的probe,兩端分別連接到通信接口和芯片,示波器的捕獲的什么樣子呢?
在示波器每次捕獲之后,可以得到一組與下圖類似的power trace
?
上圖顯示了沒有受到保護的AES實際實現時的power trace,這種情況下很容易就可以進行SCA,因為我們可以清楚地看到10輪AES(上圖已經標注出來了)
然后需要將power trace轉為深度學習可用的數據集,這里涉及到3個操作:
1.數據處理。我們將power trace縮放到[-1,1],如果不這么做,大多數模型是不會收斂的
2.計算攻擊點。對于每條軌跡,我們預先計算期望的_sub_bytesin 和_sub_bytesout 值。然后執行矩陣轉置,以確保數據的格式是[ byte _ id ][ example _ id],因為我們希望能在對密鑰的單字節攻擊時可以通過byte_id獲取數值。然后還需要對每個字節值進行分類編碼(categorical encoding),因為模型的輸出是256個潛在值上的softmax。
3.將數據打包成分片(shard)。分片中包含給定key value的所有樣本。這可以讓我們調整每個key需要多少樣本,并確保在訓練和測試時使用不同的key。
數據集有了之后我們就可以開始訓練了
?
#訓練模型
訓練的目的是為了使用先前收集的trace建立模型。傳統的SCA都會使用模板攻擊等方式學習這些模式。模板攻擊是使用訓練數據執行多元統計分析,創建一個被稱為漢明加權模型(Hamming Weight Power Model)的近似泄露模型(leakage model)。模板攻擊可以類比于CV領域中舊的視覺算法,依賴于人類精心設計的特征,而使用深度學習模型可以直接從原始數據中學習。
在訓練模型之前,需要加載數據集
?
還要加載配置文件
?
配置文件內容如下
?
其中主要用于設置四項內容:
1.攻擊目標。從device和algorithm看到,指定了要攻擊的設備以及其上運行的算法。
2.攻擊方式。從attack_points和attack_bytes可以看到.前文我們已經提到,AES 128的16字節密鑰有3個攻擊點,所以實際我們需要訓練3*16=48個模型
3.攻擊所需數據。從num_shards,num_traces_per_shard可以看到,一個shard包含給定的key的所有樣本,因此shard的數量等于要使用的key的數量。num_traces_per_shard指的是給定的key使用多少不同的power trace。
4.攻擊所需架構。包含模型的參數、優化器等。
?
本文使用的是帶殘差的CNN,即ResNet,但是有一些不同
1.由于我們處理的是時間序列,
shape為(batch_size,trace_len,value),而不是圖像(shape為(batch_size,width,height,channels)),所以使用的一維卷積
2.模型一開始用的是max pooling,這是因為之前采樣的時候是過采樣的,使用max pooling可以使模型更小,以便更快地收斂
3.使用了卷積增長函數的簡化的stack(堆),其實每個stack就是將過濾器數量翻倍
dropout用于幫助泛化,之后是全連接層、激活層和BatchNormalization層,輸出層是帶有softmax激活的256輸出的全連接層
網絡的一般結構如下
殘差塊結構如下
從批歸一化開始,在進行卷積之前通過激活層。正如前面提到的,我們這里用的是一維卷積,即Conv1D;其他的都和標準殘差架構一樣,不再另做說明。
模型搭建完成后,使用訓練集進行訓練即可。
?
?
#攻擊
這一步,我們利用訓練好的模型來恢復訓練過程中沒見過的key。
我們將深度學習應用于側信道攻擊的優勢就是它可以根據trace數量可擴展地進行概率攻擊,我們只需要累計模型的預測值就可以了,如下所示,累計的結果越大,則該值越有可能是對應字節的值。
?
為什么這么直接加起來就可以來了?因為我們之前在輸出層用的是softmax,softmax就是用于將模型的輸出轉為概率分布,他們的和等于1,如下所示
?
現在還有一個問題,怎么評估側信道攻擊的效果呢(除了直接看是否恢復出了給定的key)
在本文中主要評估恢復給定key需要多少條trace,評估指標可以是:恢復key所需的最少trace是幾條?平均需要幾條trace才能恢復key?恢復所有key需要多少trace?以及通過攻擊曲線(如下所示)來看累計成功率,我們以恢復16字節的key中的一個字節為例來看看。
?
我們畫出攻擊中的密鑰恢復效率,實際就是打印攻擊曲線
下面給出的累計成功率就是上圖曲線下的面積。如果是完美的攻擊,其曲線下面積應為1,這說明1個trace就可以恢復出全部的key,但是這基本不會發生,我們要做的是找到曲線最陡或者說曲線下面積最大的攻擊,因為這種攻擊的性能最好。
下面的代碼用于計算并打印指標
?
從上圖結果可以看到,使用1個trace可以恢復40%左右的key,為了恢復全部key,需要4個trace,累計成功率為83.79%
現在我們嘗試恢復出AES的完整的key。
攻擊前,還需要設置參數:攻擊點可以設為sub_bytes_out;從攻擊曲線的圖中可以看到其實不需要10條trace,5條trace就足夠了;此外還需要設置目標shard,一個shard就是一個不同的key,隨意設置即可
?
我們運行16次字節恢復算法,一次可以恢復出一個key字節
?
運行得到的結果如下
?
可以看到基本預測正確。
?
#參考
1.https://baike.baidu.com/item/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86/468774?fromtitle=aes&fromid=5903&fr=aladdin2.https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%863.http://61.161.158.164:8085/KCMS/detail/detail.aspx?filename=1020088612.nh&dbcode=CMFD&dbname=CMFD20214.https://zh.wikipedia.org/zh-hans/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A05.https://www.youtube.com/watch?v=Db8mj5KFz8E6.https://docs.google.com/presentation/d/1l-TpGGuGu40TS4ecqPfzLqrzSQccwgu3BlsKMTyZbSk/edit原創稿件征集
郵箱:edu@antvsion.com
QQ:3200599554
黑客與極客相關,互聯網安全領域里
的熱點話題
漏洞、技術相關的調查或分析
稿件通過并發布還能收獲
200-800元不等的稿酬
戳
“閱讀原文”
體驗免費靶場!總結
以上是生活随笔為你收集整理的深度学习赋能侧信道攻击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ADS仿真6_PA设计【未完成】
- 下一篇: PR学习笔记总结,附带剪辑成品