侧信道攻击实验四 AES CPA 攻击
參考大佬文章,收益匪淺
因為這是課內實驗,所以我并沒有把所有代碼都上傳,參考的文章里代碼很全。
實驗目的
實驗人數
每組1人
系統環境
Windows
實驗原理
CPA是利用密碼芯片的假設模型,預測其加解密時的功耗大小,然后和實際測量的功耗大小進行相關性分析推測密鑰。CPA攻擊通常采用漢明重量模型,所謂漢明權重就是一個碼字中1碼元的總數目,漢明權重越大,芯片運算時的功耗就越大。
實驗內容
Readfile-student.py:AES 能耗波形文件讀入與存儲,“Save2Npy”函數輸出能量跡trace數據。
- 分析程序讀入的pts、pcts、pns分別是什么數據,類型是什么,維數是多少
CPA-student.py:根據漢明重量模型恢復16個字節密鑰。
- 補充相關系數的計算代碼,并取最大值記為maxcpa
- 解釋每個生成圖像的含義(橫縱坐標、波形、尖峰等)
- 打印輸出恢復的所有正確密鑰bestguess
分析能量跡對密鑰恢復的影響:10、50、100、150、200、240條能量跡能夠恢復的正確密鑰的字節數和位置分別是什么,并分析其原因。
實驗步驟
pts、pcts、pns分別是什么數據、類型、維數
pts
圖6.1???? pts部分數據數據:明文
類型:數組
維數:二維(250,16)
pcts
圖6.2???? pcts部分數據數據:明文,密文
類型:數組
維數:三維(250,2,16)
pns
圖6.3???? pns部分數據數據:能量跡縱坐標
類型:數組
維數:二維(250,10000)
完善相關系數的計算代碼
hwlist = np.zeros(numtraces)語句之前的代碼是程序自帶的,最外層的for循環的目的是遍歷密鑰的字節位置,第二層的for循環是遍歷所有密鑰的可能性。本次實驗需要使用能量跡的明文和密鑰異或運算并執行后續代碼,所以還需要設置一層循環,使得對應設置數量的能量跡明文可以和密鑰進行運算,求得漢明重量,代碼如下。
hwlist = np.zeros(numtraces) #初始化數組 for tnum in range(0, numtraces):hwlist[tnum] = HW[intermediate(pt[tnum][bnum], kguess)]注意一點pt二維數組(程序另有設置明文數組為pt)的取值,pts明文數組中250表示明文數量,而16是明文的size,所以明文數組長度為16。
因為是漢明重量模型,按照以往實驗的思路,下一步是根據相關系數計算公式
ri,j=∑d=1D[(hd,i?hi ̄)(td,j?tj ̄)]∑d=1D(hd,i?hi ̄)2∑d=1D(td,j?tj ̄)2{r_{i,j}} = \frac{{\sum\nolimits_{d = 1}^D {\left[ {\left( {{h_{d,i}} - \overline {{h_i}} } \right)\left( {{t_{d,j}} - \overline {{t_j}} } \right)} \right]} }}{{\sqrt {\sum\nolimits_{d = 1}^D {{{\left( {{h_{d,i}} - \overline {{h_i}} } \right)}^2}} \sum\nolimits_{d = 1}^D {{{\left( {{t_{d,j}} - \overline {{t_j}} } \right)}^2}} } }} ri,j?=∑d=1D?(hd,i??hi??)2∑d=1D?(td,j??tj??)2?∑d=1D?[(hd,i??hi??)(td,j??tj??)]?
推導出邏輯代碼。
這部分代碼我之前有寫過,不過那時公式邏輯代碼組成的函數輸入對象雖然也是數組(準確來說應該說是列表),但是體量沒有這次仿真實驗做的大,而且numpy函數生成的數組在類型上就和列表就不一樣,所以代碼需要重新編寫。為了代碼流程顯得模塊化,我將上述計算公式模塊化如下:
ri,j=molesumdensum1×densum2{r_{i,j}} = \frac{molesum}{\sqrt{densum1 \times densum2}} ri,j?=densum1×densum2?molesum?
-
第一步依舊是是初始化,只不過是數組的初始化;
# 初始化數組——簡化計算流程 molesum = np.zeros(numpoint) densum1 = np.zeros(numpoint) densum2 = np.zeros(numpoint) -
第二步理論上來說可以直接運算了,不過先計算平均值可以減少代碼冗余。分別計算假設值和軌跡上所有點的漢明重量的平均值。
#當前猜測密鑰參與運算的漢明總量數組均值 h_mean = np.mean(hwlist, dtype=np.float64) #采集線上的電壓均值,共10000份 t_mean = np.mean(traces, axis=0, dtype=np.float64) -
第三步開始正式計算,累加次數取決于使用的能量跡數量,計算結束后將相關系數的最大絕對值存入maxcpa列表中。
for i in range(0, numtraces):h = (hwlist[i] - h_mean)t = traces[i] - t_meanmolesum = molesum + (h * t)densum1 = densum1 + h * hdensum2 = densum2 + t * tmaxcpa[kguess] = max(abs(molesum / np.sqrt(densum1 * densum2)))可能陌生的地方就是第三行的t值,其實t在這里是個數組,這一行的代碼運算也是數組之間的運算。
圖6.5???? 一維數組t 圖6.5???? 二維數組traces第三行代碼還可以替換為t = traces[i,:] - t_mean
-
將256種密鑰遍歷測試后,將maxcpa列表中的最大值儲存,作為所猜測的當前密鑰字節數值。
bestguess[bnum] = np.argmax(maxcpa)
完整代碼如下(打印語句不放):
for bnum in range(0, 16):#bnum定義所攻擊的字節位置maxcpa = [0]*256#記錄cpa最大值的向量for kguess in range(0, 256):#補充相關系數的計算代碼,并取最大值記為maxcpa#計算猜測密鑰參與運算形成的漢明重量hwlist = np.zeros(numtraces) #初始化數組for tnum in range(0, numtraces):hwlist[tnum] = HW[intermediate(pt[tnum][bnum], kguess)]# 根據相關系數計算公式推導出邏輯代碼# 初始化數組——簡化計算流程molesum = np.zeros(numpoint)densum1 = np.zeros(numpoint)densum2 = np.zeros(numpoint)#當前猜測密鑰參與運算的漢明總量數組均值h_mean = np.mean(hwlist, dtype=np.float64)#采集線上的電壓均值,共10000份t_mean = np.mean(traces, axis=0, dtype=np.float64)#正式計算for i in range(0, numtraces):h = (hwlist[i] - h_mean)t = traces[i] - t_meanmolesum = molesum + (h * t)densum1 = densum1 + h * hdensum2 = densum2 + t * tmaxcpa[kguess] = max(abs(molesum / np.sqrt(densum1 * densum2)))bestguess[bnum] = np.argmax(maxcpa)程序運行結果
正確密鑰bestguess打印輸出如下(使用能量跡為250條):
圖6.6???? 正確密鑰—250條能量跡生成圖像如下:
圖6.7???? 仿真能量跡-250條能量跡數據分析圖像的含義
以此圖為例:
圖6.8???? 仿真能量跡-50條能量跡橫坐標:所有可能的密鑰
縱坐標:相關系數絕對值
波形:波形可以反映算法的處理周期和處理速度
尖峰:在此實驗中,尖峰代表著猜測密鑰和正確結果的相關性,尖峰值越大,相關性越高
分析能量跡對密鑰恢復的影響
分別采用10、50、100、150、200、240條能量跡。
圖6.9???? 六種情況仿真能量跡以250條能量跡的正確密鑰輸出為正確標準,對此六種情況下的正確密鑰輸出進行判定,結果如下。
| 10 | 0 | 無 |
| 50 | 1 | 1 |
| 100 | 12 | 1,2,3,5,6,7,8,9,12,13,14,15 |
| 150 | 13 | 1,2,3,5,6,7,8,9,10,12,13,14,15 |
| 200 | 15 | 0,1,2,3,4,5,6,7,8,9,10,12,13,14,15 |
| 240 | 16 | 全部 |
原因簡單來說就是,參考基礎不夠大,無法生成普適規律。參考基數越大,個例對整體判斷的影響越小;反之,越大。
思考問題
如果利用比特模型和漢明距離模型,應該如何進行攻擊?
漢明距離模型
計算數字電路在某個特定時段內,0→1轉換和1-→0轉換的總數。然后,利用轉換的總數來刻畫電路在該時段內的能量消耗。把對整個電路的仿真劃分為小的時間段,就可以生成一-種能量跡。這種能量跡中不包含具體的電壓值,而是包含每個時間段內電路發生轉換的次數。
比特模型
攻擊者通過側信道可以得到密碼算法中間狀態的某個比特,將該側信道泄露的消息與立方攻擊相結合從而恢復密鑰信息。
總結
收獲之一就是明白了在給定能量跡數據集的條件下,如何進行仿真實驗。
前兩次側信道仿真實驗使用的n個明文其實代表的就是n條明文的意思,而不是一條明文里的n個數據,這點不弄懂是沒法繼續理解的。然后要明確的點是明文整體和密鑰進行異或,不會出現部分字節不異或的情況,所以這種思想帶入AES的CPA仿真實驗中的結果就是,參與運算的每個能量跡,輪到取第幾位時統一采集,逐個和猜測密鑰異或并計算漢明重量形成長度為明文數量的數組;相同的,能量跡的電壓值也是需要縱向劃分數組,用圖片理解這里縱向劃分的意義:
這是能量跡數據的結構示意圖,每條明文都有屬于自己的n個采集的電壓值(黑色線段),之前明文被采集和密鑰異或其實也是縱向劃分,和這個結構是一樣的。比如取每條明文的第一個字節/電壓值,就是在縱軸方向上把每條明文的第一項數據切割出來,這樣就形成兩個具有線性關系的整體,漢明重量數組和電壓值數組,然后兩個整體去計算相關系數,順理成章地完成了仿真實驗流程。
這么看起來其實也沒什么難的,原理看似很簡單,其實真的簡單,但是簡單卻不一定能理解,做前兩次仿真實驗時以為自己懂了,到了最后一次實驗數據“正規“后,往常不是很清晰的知識點就會拖累實驗進度,等再次搞懂后,發現其實并沒有一開始做時那么難。
之前的仿真實驗都是基于白盒的仿真實驗,S盒的運算公式和盒內部數值都是公開的,所以相對容易。這次實驗比之前的實驗從更正規的方式去做了一遍仿真實驗,看到仿真能量跡畫出來的時候還是很激動的。
注意點:
代碼邏輯上我覺得重點要理解的就是“兩層循環嵌套”,即最外層的密鑰16字節循環 + 遍歷密鑰循環,至于剩下的都是小循環而已,不對整體結構上產生影響。
還有要理解能量跡數據的各個屬性,雖然在代碼中能量跡數據看起來很輕松的就被調用使用,但是難點是在將能量跡數據從文件中提取出來時知道其中是什么數據,怎么用,何時用。
總結
以上是生活随笔為你收集整理的侧信道攻击实验四 AES CPA 攻击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机cpu操作ppt,CPU基础知识P
- 下一篇: Pr 视频效果:过渡、透视、通道