AES加密

AES(Advanced Encryption Standard) 高級(jí)加密標(biāo)準(zhǔn),是 DES(Data Encryption Standard) 之后的一種對(duì)稱分組加密方式(關(guān)于對(duì)稱加密和非對(duì)稱加密可以參考我之前寫(xiě)的一篇文章 HTTPS從原理到應(yīng)用(一):加密(Encrypt)與哈希(Hash) )。DES 的密鑰長(zhǎng)度為 56bits, AES 主要是為了解決 DES 密鑰太短以致于不能提供足夠安全的問(wèn)題。 AES 是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所 (National Institute of Standards and Technology: NIST) 面向世界征集的一個(gè)算法,從最終獲勝的 Rijndael 算法改進(jìn)而來(lái)的, Rijndael 算法是一個(gè)分組密碼算法族,其分組長(zhǎng)度包括 128bits 160bits 192bits 224bits 256bits ,密鑰長(zhǎng)度也包括這五種長(zhǎng)度;但是最終 AES 只選取了分組長(zhǎng)度為 128bits ,密鑰長(zhǎng)度為 128bits 192bits 256bits 的三個(gè)版本。下面以密鑰長(zhǎng)度為 128bits 為例進(jìn)行講解。

算法步驟

先看下圖,根據(jù)圖來(lái)講解,比較好理解:

圖1-0 AES加密過(guò)程圖

從上圖可知加密過(guò)程需要的運(yùn)算有 SubBytes ShiftRows MixColumns AddRoundKey Key Schedule。首先明文 128位(16字節(jié)),分成一個(gè) 4 x 4 的矩陣(列優(yōu)先排序),先做一次 AddRoundKey 運(yùn)算,然后重復(fù)9次,SubBytes ShiftRows MixColumns AddRoundKey 運(yùn)算這9次過(guò)后,在重復(fù)一次但是最后這一次沒(méi)有 MixColumns 步驟,上述中的每一次 AddRoundKey,都需要密鑰,除了第一次是初始密鑰,后面的密鑰都是根據(jù)初始密鑰經(jīng)過(guò) KeySchedule 變換而來(lái)。AES的解密過(guò)程為加密過(guò)程的逆運(yùn)算,就沒(méi)有畫(huà)圖。下面分別具體來(lái)講 SubBytes ShiftRows MixColumns AddRoundKey Key Schedule。

SubBytes

矩陣中的各字節(jié)通過(guò)一個(gè) 8 位的 S-box 進(jìn)行轉(zhuǎn)換,用于提供算法的混淆性。。關(guān)于 S-box 的構(gòu)造這里不做敘述,S-box 以及 S-box的逆 如下圖:

圖1-1 S-box
圖1-2 Inverse S-box

舉例:字節(jié) 00000000,高四位的值對(duì)應(yīng) x 軸,低四位的值對(duì)應(yīng) y 軸,對(duì)應(yīng)S-box表可知,字節(jié)00000000 SubBytes 后轉(zhuǎn)換為字節(jié)0x63。在根據(jù)逆S-box表,字節(jié) 0x63 SubBytes 后轉(zhuǎn)換為字節(jié)0x00

ShiftRows

行移位是一個(gè) 4 x 4 的矩陣內(nèi)部字節(jié)之間的置換,用于提供算法的擴(kuò)散性。正向行移位,第一行不變,第二行向左移動(dòng) 8bit 位,第三行向左移動(dòng)16bit 位,第四行向左移動(dòng) 24bit 位。反向行移位,第一行不變,第二行向右移動(dòng) 8bit 位,第三行向右移動(dòng) 16bit 位,第四行向右移動(dòng) 24bit 位。

圖1-3 ShiftRows
MixColumns

每一列的四個(gè)字節(jié)通過(guò)線性變換互相結(jié)合,用于提供算法的擴(kuò)散性。具體運(yùn)算看下圖。

圖1-4 正向MixColumns
圖1-5 逆向MixColumns
圖1-6 正向MixColumns、逆向MixColumns用的矩陣互逆

由矩陣的乘法運(yùn)算可知,運(yùn)算后矩陣中的每個(gè)字節(jié)只與該列的 4 個(gè)值有關(guān),所以這個(gè)操作列混淆。另外此處的乘法和加法都是定義在 有限域GF(2^8)上的多項(xiàng)式模運(yùn)算 。 圖1-5逆向MixColumns運(yùn)算 , 圖1-6 表示正向和逆向所用的矩陣互逆,這樣才可以進(jìn)行解密運(yùn)算。這一塊要稍微有一點(diǎn)數(shù)學(xué)基礎(chǔ)才能理解,要知道線性代數(shù)中的 矩陣運(yùn)算有限域GF(2^8)上的多項(xiàng)式模運(yùn)算 。關(guān)于這兩點(diǎn)我不過(guò)多描述,感覺(jué)興趣的同學(xué)可以下去查資料或者跟我私下交流溝通。

AddRoundKey

這個(gè)步驟比較簡(jiǎn)單,矩陣中的每一個(gè)字節(jié)都與該次輪秘鑰(round key)做異或運(yùn)算。

圖1-7 AddRoundKey
Key Schedule

AddRoundKey 這個(gè)步驟,除第一次是使用原始密鑰,后續(xù)的步驟都是通過(guò)對(duì)原始密鑰進(jìn)行密鑰擴(kuò)展而來(lái)的。具體擴(kuò)展步驟如下圖所示:

圖1-8 Key Schedule

將原始密鑰以字節(jié)按上圖 K0 K1 ... K15 的順序排列,也是第一次做
AddRoundKey 運(yùn)算時(shí)用到的矩陣。第二次做 AddRoundKey 運(yùn)算時(shí),已經(jīng)是密鑰擴(kuò)展之后的密鑰了。擴(kuò)展步驟為上圖所示, K41 列通過(guò) K0 列和
K12 列做一次 ShiftColumns 然后在做一次 SubBytes 和最下面矩陣的 第一列 做異或運(yùn)算,求出 K41 列;然后 K51 列為 K4 列與 K41 列異或,
K61 列為 K8 列與 K51 列異或, K71 列為 K12 列與 K61 列異或。這樣就求出了第二次 AddRoundKey 運(yùn)算所用到的矩陣。第三次,同樣按這個(gè)步驟,有兩點(diǎn)需要注意:

  • 原始矩陣為第二次 AddRoundKey 運(yùn)算用到的 K41 這個(gè)矩陣,
  • 計(jì)算矩陣第一列值的時(shí)候,要使用下面矩陣的第二列,即 02 那一列。

下面矩陣有 10 列,以此可求出 10 個(gè)矩陣,分別對(duì)應(yīng)除第一次使用原始密鑰的后面 10AddRoundKey 運(yùn)算。

總結(jié)

AES 是一種對(duì)稱分組密碼,對(duì)稱密碼我已經(jīng)講解過(guò),分組密碼是將一個(gè)明文分組作為整體加密并且通常得到的是與明文等長(zhǎng)的密文分組。分組密碼,有不同的工作模式,主要是為了增強(qiáng)密碼算法,或者使算法適應(yīng)具體應(yīng)用的技術(shù)。工作模式有電碼本模式(ECB),密文分組鏈接模式(CBC),密文反饋模式(CFB),輸出反饋模式(OFB),計(jì)數(shù)器模式(CTR)。此篇文章,主要講述 AES加密 的步驟,這些工作模式,以及 SubBytesS-box 的構(gòu)造,和 有限域GF(2^8)上的多項(xiàng)式模運(yùn)算 都沒(méi)有做過(guò)多的講解;另外這兒也沒(méi)有給出實(shí)現(xiàn)的代碼,這個(gè)后續(xù)會(huì)補(bǔ)上。若有疑問(wèn)歡迎探討,若是對(duì)我沒(méi)有提到的幾個(gè)點(diǎn)有興趣,可以查相關(guān)資料去了解,也可以和我探討。這是一系列文章的其中一篇,你可以在這兒Encode & Decode集序找到他其他的兄弟。

參考

  • 密碼算法詳解——AES
  • AES加密算法圖解
  • William Stallings著. 王張宜,楊敏,杜瑞穎,等譯. 密碼編碼學(xué)與網(wǎng)絡(luò)安全 —— 原理與實(shí)踐(第五版)[M]. 北京:電子工業(yè)出版社,2012.1.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 高級(jí)加密標(biāo)準(zhǔn)(英語(yǔ):Advanced EncryptionStandard,縮寫(xiě):AES),在密碼學(xué)中又稱Rijn...
    黃曉果閱讀 11,173評(píng)論 0 2
  • 引用 AES加密算法原理AES加密算法的C++實(shí)現(xiàn)密碼算法詳解——AES(高級(jí)加密算法) 1. 前言 本文針對(duì)加密...
    碼夢(mèng)的一生閱讀 15,788評(píng)論 2 3
  • 維基百科中對(duì)AES加密的解釋是這樣的: 高級(jí)加密標(biāo)準(zhǔn)(英語(yǔ):Advanced Encryption Standar...
    Originalee閱讀 8,155評(píng)論 9 32
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲(chǔ)、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 3,018評(píng)論 0 6
  • 1進(jìn)學(xué)生會(huì)是能鍛煉你的能力,但是并不是每個(gè)人都要進(jìn)去,學(xué)習(xí)仍然是第一要?jiǎng)?wù),不能耽擱 2利用空余時(shí)間多開(kāi)闊眼界,出去...
    毒舌至吻閱讀 262評(píng)論 0 1

友情鏈接更多精彩內(nèi)容