侧信道实验实验三 S盒CPA侧信道攻击
---------------------------------------202/12/24 更新---------------------------------------如若有圖片不能查看,可復制圖片鏈接以瀏覽。
---------------------------------------202/12/23 更新---------------------------------------
這個實驗和的另一篇文章側信道實驗實驗二 S盒DPA側信道攻擊相似處很多,起碼在完善Sboxcpa攻擊-student.py程序階段是一樣的。因為很近似,所以一些細節我就沒有贅述,想看更多細節的可以移步至我的另一篇文章。
-------------------------------------------起始內容-------------------------------------------
實驗目的
實驗人數
每組1人
系統環境
Windows
實驗原理
測量階段,選取隨機數量明文和設定好的正確密鑰進行異或,得到的6bit結果作為S盒的輸入,S盒的輸出需統計二進制中1的個數,作為漢明重量,所有輸出得到一個漢明重量數組。
攻擊階段,需要遍歷密鑰的所有可能,每次遍歷都需經歷測量階段,最后得到所有猜測密鑰的漢明重量數組,且每個都需和正確密鑰得到的漢明重量數組共同計算相關系數數組,公式如下
corr=∑n(xi?x ̄)?(yi?y ̄)∑n(xi?x ̄)2?∑n(yi?y ̄)2corr=\frac{\sum_n^{}{\left(x_i-\overline{x} \right)}\cdot \left( y_i-\overline{y} \right)}{\sqrt{\sum_n^{}{\left( x_i-\overline{x} \right) ^2}}\cdot \sqrt{\sum_n^{}{\left( y_i-\overline{y} \right) ^2}}} corr=∑n?(xi??x)2??∑n?(yi??y?)2?∑n?(xi??x)?(yi??y?)?
其中,x ̄=1n∑nxi\overline{x}=\frac{1}{n}\sum_n^{}{x_i}x=n1?∑n?xi?,y ̄=1n∑nyi\overline{y}=\frac{1}{n}\sum_n^{}{y_i}y?=n1?∑n?yi?表示均值。
實驗內容
完成Sboxdpa仿真-student.py程序中的空缺部分
-
補充n、plaintext、keyTrue
-
補充HWfun函數,返回輸入的漢明重量
-
補充主函數,得到輸出相應的漢明重量向量
完成Sboxcpa攻擊-student.py程序中的空缺部分:
-
補充plaintext、power_std
-
補充相關系數Corrfun函數,返回兩個向量的相關系數
-
補充主函數,猜測所有可能的密鑰,對每個密鑰計算相關系數,求出相關系數最大的猜測密鑰
實驗測試2組數據
實驗步驟
完善Sboxdpa仿真-student.py程序
補充變量
補充n、plaintext、keyTrue三個變量
n = 9 #第一組明文數組長度 #n = 64 #第二組明文數組長度 plainlist = [41, 35, 62, 4, 33, 44, 22, 46, 18] #第一組明文數組 #plainlist = [3, 10, 3, 1, 9, 48, 2, 59, 50, 32, 7, 27, 27, 54, 32, 52, 39, 2, 11, 41, 42, 9, 7, 62, 63, 62, 56, 40, 19, 55, 57, 40, 7, 7, 37, 34, 15, 26, 18, 58, 32, 9, 56, 1, 42, 35, 60, 7, 43, 56, 26, 28, 16, 25, 2, 57, 47, 44, 62, 27, 9, 31, 6, 5] #第二組明文數組 keyTrue = 49 #加密所用密鑰完善HWfun函數
此函數本質上是計算整數轉化為二進制后中1的個數,可以使用快速統計的方法。
補充代碼如下:
def HWfun(num):# 統計輸入num的漢明重量并返回ans = 0if num == 0:return 0while num > 0:num &= (num - 1)ans += 1return ans完善主函數
使用表格美化庫完善輸出。
補充代碼如下:
if __name__ == "__main__":# 補充:S盒輸出對應漢明重量列表table = pt.PrettyTable()hw_std = []HWout = sboxout(n, plainlist, keyTrue)for i in range(n):hw_std.append(HWfun(HWout[i]))table.add_column('序號',[i for i in range(1,n+1)])table.add_column('明文-十進制',[index for index in plainlist])table.add_column('S盒輸出-十進制', [index for index in HWout])table.add_column('S盒輸出-漢明重量', [index for index in hw_std])print(table)程序運行結果
圖6.1???? 長度為9的明文數組表格輸出  圖6.2???? 長度為64的明文數組表格輸出 ### 完善Sboxcpa攻擊-student.py程序補充變量
使用Sboxdpa仿真-student.py程序得到的結果:
plainlist = [41, 35, 62, 4, 33, 44, 22, 46, 18] #第一組明文數組 #plainlist = [3, 10, 3, 1, 9, 48, 2, 59, 50, 32, 7, 27, 27, 54, 32, 52, 39, 2, 11, 41, 42, 9, 7, 62, 63, 62, 56, 40, 19, 55, 57, 40, 7, 7, 37, 34, 15, 26, 18, 58, 32, 9, 56, 1, 42, 35, 60, 7, 43, 56, 26, 28, 16, 25, 2, 57, 47, 44, 62, 27, 9, 31, 6, 5] #第二組明文數組 power_std = [2, 2, 1, 2, 2, 2, 1, 1, 2] #第一組明文數組的漢明重量數組 #power_std = [2, 0, 2, 4, 2, 0, 3, 4, 4, 2, 3, 2, 2, 1, 2, 3, 2, 3, 2, 2, 2, 2, 3, 1, 1, 1, 3, 2, 1, 1, 1, 2, 3, 3, 2, 2, 0, 2, 2, 1, 2, 2, 3, 4, 2, 2, 3, 3, 2, 3, 2, 1, 4, 3, 3, 1, 3, 2, 1, 2, 2, 3, 3, 2] #第二組明文數組的漢明重量數組完善Corrfun函數
完全根據公式:
xcorr=∑n(xi?x ̄)?(yi?y ̄)∑n(xi?x ̄)2?∑n(yi?y ̄)2x corr=\frac{\sum_n^{}{\left(x_i-\overline{x} \right)}\cdot \left( y_i-\overline{y} \right)}{\sqrt{\sum_n^{}{\left( x_i-\overline{x} \right) ^2}}\cdot \sqrt{\sum_n^{}{\left( y_i-\overline{y} \right) ^2}}} xcorr=∑n?(xi??x)2??∑n?(yi??y?)2?∑n?(xi??x)?(yi??y?)?
推導出的代碼。
補充代碼如下:
def Corrfun(n, pstd, ptest): # 計算相關系數# 補充相關系數函數,返回兩個向量的相關系數值pstd_mean = mean(pstd)ptest_mean = mean(ptest)mole = 0denx = 0deny = 0for i in range(n):mole += (ptest[i] - ptest_mean) * (pstd[i] - pstd_mean)for i in range(n):denx += (ptest[i] - ptest_mean)**2deny += (pstd[i] - pstd_mean)**2den2 = math.sqrt(denx) * math.sqrt(deny)return abs(mole/den2)完善主函數
遍歷0-63共64個密鑰(密鑰的所有可能性),遍歷密鑰得到的漢明重量數組和正確密鑰得到的漢明重量數組共同帶入Corrfun函數,計算相關系數,取所有相關系數中的最大值=1對應的密鑰,即為正確密鑰。
補充代碼如下:
if __name__ == "__main__":# 遍歷所有可能密鑰,計算每個猜測密鑰對應的相關系數,求最大系數對應的猜測密鑰keyList = [i for i in range(64)]n = len(plainlist)Corrlist = []for k in range(64):hw_std = []HWout = sboxout(n, plainlist, k)for m in range(n):hw_std.append(HWfun(HWout[m]))Corrlist.append(Corrfun(n, power_std, hw_std))final_dict = dict(zip(keyList, Corrlist))print(max(final_dict, key=final_dict.get))程序運行結果
兩個長度的數組運行結果都如下
思考問題
除了利用漢明重量模型,還可以用什么模型進行攻擊?
多元模型:漢明重量模型、漢明距離模型
二元模型:比特模型、零值模型
除了漢明重量模型,至少還有三種模型可以使用
實際攻擊時采用哪一種仿真模型,需要根據攻擊對象(數據)的變化特點、密碼芯片對密碼算法的實現方式(軟件實現、硬件實現)、攻擊方法的使用等靈活選擇。
比較熟悉的是漢明距離模型,其通常用于比較兩個相同長度的二進制字符串。它還可以用于字符串,通過計算不同字符的數量來比較它們之間的相似程度。在硬件上進行CPA攻擊時一般采用漢明距離模型,原因之一就是在功耗曲線基數大時,漢明距離模型比漢明重量模型更有優勢。
總結
在實現CPA仿真實驗過程中,我有去測試不同明文長度對密鑰猜測結果的影響。如上文,我第一次測試長度為9的明文數組結果是正確的。不過不能確定正確率是100%,所以我循序漸進的進行進一步的測試:
階段實驗
階段一:
采用原明文數組plainlist = [41, 35, 62, 4, 33, 44, 22, 46, 18],遍歷64個密鑰,查看結果。
主函數代碼如下:
if __name__ == "__main__":keyList = [i for i in range(64)]n = len(plainlist)for i in range(64):power_std = []HWout_true = sboxout(n, plainlist, i) # S盒輸出for j in range(n):power_std.append(HWfun(HWout_true[j])) # 漢明重量Corrlist = []for k in range(64):hw_std = []HWout = sboxout(n, plainlist, k)for m in range(n):hw_std.append(HWfun(HWout[m]))Corrlist.append(Corrfun(n, power_std, hw_std))final_dict = dict(zip(keyList, Corrlist))print("正確密鑰:",max(final_dict, key=final_dict.get))運行部分結果如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
其余結果相同,說明密鑰的更改對正確率沒影響。
階段二:
采用長度相同(設長度為19)、明文內容不同的100個數組進行測試,正確密鑰設為63。
主函數代碼如下:
if __name__ == "__main__":for i in range(100):plainlist = list(np.random.randint(64, size=19))keyList = [i for i in range(64)]n = len(plainlist)power_std = []HWout_true = sboxout(n, plainlist, 63)for j in range(n):power_std.append(HWfun(HWout_true[j]))Corrlist = []for k in range(64):hw_std = []HWout = sboxout(n, plainlist, k)for m in range(n):hw_std.append(HWfun(HWout[m]))Corrlist.append(Corrfun(n, power_std, hw_std))final_dict = dict(zip(keyList, Corrlist))print("正確密鑰:",max(final_dict, key=final_dict.get))運行部分結果如下:
圖8.2???? 階段二程序部分輸出 其余結果相同,說明明文內容的更改對正確率沒影響。階段三:
更改明文長度,從9—64,DES的明文分組上限就是64,至于為什么從9開始,是因為長度過小時可能會出現Corrfun函數內,被除數為0的情況。正確密鑰設為45。
主函數代碼如下:
if __name__ == "__main__":for i in range(9,65):plainlist = list(np.random.randint(64, size = i))keyList = [i for i in range(64)]n = len(plainlist)power_std = []HWout_true = sboxout(n, plainlist, 45)for j in range(n):power_std.append(HWfun(HWout_true[j]))Corrlist = []for k in range(64):hw_std = []HWout = sboxout(n, plainlist, k)for m in range(n):hw_std.append(HWfun(HWout[m]))Corrlist.append(Corrfun(n, power_std, hw_std))final_dict = dict(zip(keyList, Corrlist))print("正確密鑰:",max(final_dict, key=final_dict.get))運行部分結果如下:
圖8.3???? 階段三程序部分輸出 其余結果相同,說明明文數組長度的更改對正確率沒影響。綜合分析
階段實驗證明CPA仿真攻擊的正確率不管在什么情況下都是100%,比DPA效果好多了。原因就在于CPA考慮了方差問題,使得其猜測精度有很明顯的提高。
總結
以上是生活随笔為你收集整理的侧信道实验实验三 S盒CPA侧信道攻击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有幸为鲍勃大叔的封山之作《匠艺整洁之道》
- 下一篇: 以下数据库收录外文文献全文的有_除了SC