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