• 正文
    • 一.?AES的基本結(jié)構(gòu)
    • 二.?秘鑰的一生
    • 三.?加密過程
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

技術回歸 - 探秘AES加密算法的原理

02/17 10:18
1058
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

現(xiàn)在的很多產(chǎn)品都實現(xiàn)了OTA功能,通過OTA功能,產(chǎn)品可以實現(xiàn)功能不斷地優(yōu)化,給用更多的功能體驗,當然最重要的,我猜大部分還是解決bug問題。

如果產(chǎn)品做成了暢銷品,為了避免被山寨,還需要考慮自己的OTA不被破解,當年做的平衡車就在市場上出現(xiàn)了很多復制品,連bug都一樣,而且還能兼容官方APP進行下載,真的讓人氣憤啊。幸運的是,當時有后臺加持,檢測到了山寨品的ID范圍,直接發(fā)了一張“二向箔”全給升級成轉(zhuǎn)頭了。

開始做產(chǎn)品的時候,對于加密考慮的很少,OTA這事功能實現(xiàn)挺簡單,要考慮防護,考慮的方方面面就很多了,首先bin文件的存儲不能簡單的放到線上,包括傳輸過程中也不能出現(xiàn)明文,最好每次更新被抓包的話,每次被抓包的加密數(shù)據(jù)都不一樣,這樣才足夠可靠。

AES是一種對稱加密機制,所謂對稱,就是加密秘鑰和解密秘鑰是同一個,通信的雙方約定好這個秘鑰,發(fā)送的時候使用秘鑰打包,接收時再用同樣的秘鑰進行解密。這種加密方式的缺點是秘鑰的保存,一點被別人知道了秘鑰就麻煩了。

對于嵌入式產(chǎn)品來說,通常的做法是約定好產(chǎn)品的秘鑰,直接機密存儲在產(chǎn)品的Flash中,服務器端也會存儲一份,這樣服務器在發(fā)送bin文件時,先使用秘鑰進行加密,然后通過各種各樣的通信方式傳遞給產(chǎn)品的主控,主控再使用秘鑰進行解密還原bin文件。

這個過程中,通信的監(jiān)聽不會泄露秘鑰,主要防護點就變成了產(chǎn)品端秘鑰的保存上,實際上,可以通過非對稱加密手段,在OTA之前,先將本次升級的秘鑰傳輸給產(chǎn)品主控,然后在傳輸秘鑰加密后的密文,這樣來保證每次串數(shù)的密文不同。

這里先學習AES加密的原理和用法。

一.?AES的基本結(jié)構(gòu)

AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數(shù)據(jù),直到加密完整個明文。

在AES標準規(guī)范中,分組長度只能是128位,也就是說,每個分組為16個字節(jié)(每個字節(jié)8bits)。密鑰的長度可以使用128位、192位256位。密鑰的長度不同,推薦加密輪數(shù)也不同,如下表所示:

如果我們實現(xiàn)AES-128加密,這里推薦的加密輪數(shù)是10 。

AES的加密公式為C = E(K,P),在加密函數(shù)E中,會執(zhí)行一個輪函數(shù),并且執(zhí)行10次這個輪函數(shù),這個輪函數(shù)的前9次執(zhí)行的操作是一樣的,只有第10次有所不同。也就是說,一個明文分組會被加密10輪。AES的核心就是實現(xiàn)一輪中的所有操作。

AES的處理單位是字節(jié),128bit,也就是16字節(jié),這就是分組長度,我們把明文按照這個長度分成多個組。

每個分組P和輸入密鑰K都被是16個字節(jié),分別記為P = P0 P1 … P15 和 K = K0 K1 … K15。

一般地,明文分組用字節(jié)為單位的正方形矩陣描述,稱為狀態(tài)矩陣。在算法的每一輪中,狀態(tài)矩陣的內(nèi)容不斷發(fā)生變化,最后的結(jié)果作為密文輸出。該矩陣中字節(jié)的排列順序為從上到下、從左至右依次排列。

假設明文分組為P = abcdefghijklmnop ,其中的字符a對應P0,p對應P15。如下圖所示:

上圖表明,明文矩陣在一次一次的輪函數(shù)運算后被轉(zhuǎn)化為了密文矩陣,按照上面的明文假設,加密過程中的數(shù)據(jù)變化非常大,如下圖:

上面部分可以簡單理解,我們首先把明文分組,每次加密之操作16字節(jié),每次加密分10輪,在這10輪加密過程中,明文被輪函數(shù)轉(zhuǎn)換了10次。

二.?秘鑰的一生

秘鑰是怎么作用的呢?秘鑰其實也被分成10次,每一次執(zhí)行輪函數(shù),都讓秘鑰對相應輪數(shù)上的狀態(tài)矩陣作用一下,也就是明文變化10次,就用10個不同的秘鑰去作用10次,當然10個不同的秘鑰肯定都是基于原始秘鑰而來的。

16字節(jié)的密鑰也是用字節(jié)為單位的矩陣表示,矩陣的每一列被稱為1個32位比特字。

通過密鑰編排函數(shù) ,該密鑰矩陣被擴展成一個44個字組成的序列W[0],W[1], … ,W[43]。

該序列的前4個元素W[0],W[1],W[2],W[3]是原始密鑰,用于加密運算中的初始密鑰;后面40個字分為10組,每組4個字(128比特)分別用于10輪加密運算中的輪密鑰加,如下圖所示:

上圖中,如果Key = “abcdefghijklmnop”,則K0 = a, K15 = p,?W[0] = K0 K1 K2 K3 = “abcd”

后面的10次秘鑰矩陣是通過秘鑰擴展函數(shù)進行擴展的,如下圖

其中,T是一個有點復雜的函數(shù),類似于前面明文的處理,各種代換和異或后計算出來的。目的就是打亂數(shù)據(jù),讓數(shù)據(jù)看不出規(guī)律。

三.?加密過程

W[0,3]是指W[0]、W[1]、W[2]和W[3]串聯(lián)組成的128位密鑰。加密的第1輪到第9輪的輪函數(shù)一樣,包括4個操作:字節(jié)代換、行位移、列混合和輪密鑰加。最后一輪迭代不執(zhí)行列混合。

另外,在第一輪迭代之前,先將明文和原始密鑰進行一次異或加密操作。下面是AES加解密的一個過程。

下面是對于加密過程的簡要描述,大體了解加解密過程要做哪些事情。

字節(jié)代換,這就是一個查表,加密和解密過程需要一對數(shù)據(jù)表,分別叫做S盒和逆S盒。本質(zhì)上就是一個二維數(shù)組,根據(jù)坐標查詢對應的數(shù)據(jù)做代換,他們兩個在輪加密過程中是可逆的。

行移位,這是一個簡單的左循環(huán)移位操作。當密鑰長度為128比特時,狀態(tài)矩陣的第0行左移0字節(jié),第1行左移1字節(jié),第2行左移2字節(jié),第3行左移3字節(jié),如下圖所示:

行移位的逆變換是將狀態(tài)矩陣中的每一行執(zhí)行相反的移位操作,例如AES-128中,狀態(tài)矩陣的第0行右移0字節(jié),第1行右移1字節(jié),第2行右移2字節(jié),第3行右移3字節(jié)。

列混合,這里也是涉及到了一對矩陣運算,兩個列混合的矩陣的乘積正好是單位矩陣,一次你在加密和解密過程中,他們也是互為可逆的操作。

輪秘鑰加,到這里才需要用到我們秘鑰矩陣。

輪密鑰加是將128位輪密鑰Ki同狀態(tài)矩陣中的數(shù)據(jù)進行逐位異或操作,如下圖所示。其中,密鑰Ki中每個字W[4i],W[4i+1],W[4i+2],W[4i+3]為32位比特字,包含4個字節(jié),他們的生成算法下面在下面介紹。輪密鑰加過程可以看成是字逐位異或的結(jié)果,也可以看成字節(jié)級別或者位級別的操作。也就是說,可以看成S0 S1 S2 S3 組成的32位字與W[4i]的異或運算。

具體的算法,試驗完成再發(fā)出來。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

多年硬件從業(yè)經(jīng)驗,專注分享從研發(fā)到供應鏈,再到精益制造過程中的經(jīng)驗和感悟!