国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

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

技術(shù)回歸 - 探秘AES加密算法的原理

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

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

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

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

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

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

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

這里先學(xué)習(xí)AES加密的原理和用法。

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

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

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

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

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

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

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

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

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

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

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

二.?秘鑰的一生

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

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

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

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

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

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

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

三.?加密過程

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

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

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

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

行移位,這是一個(gè)簡單的左循環(huán)移位操作。當(dāng)密鑰長度為128比特時(shí),狀態(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é)。

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

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

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

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

相關(guān)推薦

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

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

象州县| 寻乌县| 山东省| 武宣县| 鄂托克旗| 积石山| 马公市| 龙州县| 达拉特旗| 苗栗县| 呼伦贝尔市| 得荣县| 布尔津县| 西峡县| 应城市| 义乌市| 桂平市| 西林县| 钦州市| 夹江县| 肃北| 青田县| 楚雄市| 兰州市| 锡林郭勒盟| 阿拉善右旗| 新安县| 日土县| 资溪县| 平江县| 依安县| 靖安县| 门头沟区| 灯塔市| 富源县| 金川县| 永寿县| 杭锦旗| 邵东县| 竹山县| 孝感市|