上一期我們已經對AES的總體加密流程進行了介紹,在這里我們重新梳理一下:
1.把明文按照128bit拆分成若干個明文塊。
2.按照選擇的填充方式來填充最后一個明文塊。
3.每一個明文塊利用AES加密器和密鑰,加密成密文塊。
4.拼接所有的密文塊,成為最終的密文結果。
具體分成多少輪呢?
初始輪(Initial Round) 1次
普通輪(Rounds) N次
最終輪(FinalRound)1次
上一期我們提到,AES的Key支持三種長度:AES128,AES192,AES256。Key的長度決定了AES加密的輪數。
除去初始輪,各種Key長度對應的輪數如下:
AES128:10輪
AES192:12輪
AES256:14輪
不同階段的Round有不同的處理步驟。
初始輪只有一個步驟:
加輪密鑰(AddRoundKey)
普通輪有四個步驟:
行移位(ShiftRows)
列混淆(MixColumns)
加輪密鑰(AddRoundKey)
最終輪有三個步驟:
字節代替(SubBytes)
行移位(ShiftRows)
加輪密鑰(AddRoundKey)
1.字節替代(SubBytes)
首先需要說明的是,16字節的明文塊在每一個處理步驟中都被排列成4X4的二維數組。
所謂字節替代,就是把明文塊的每一個字節都替代成另外一個字節。替代的依據是什么呢?依據一個被稱為S盒(Subtitution Box)的16X16大小的二維常量數組。
假設明文塊當中a[2,2] = 5B(一個字節是兩位16進制),那么輸出值b[2,2] = S[5][11]。
2.行移位(ShiftRows)
這一步很簡單,就像圖中所描述的:
第一行不變
第二行循環左移1個字節
第三行循環左移2個字節
第四行循環左移3個字節
3.列混淆(MixColumns)
這一步,輸入數組的每一列要和一個名為修補矩陣(fixed matrix)的二維常量數組做矩陣相乘,得到對應的輸出列。
4.加輪密鑰(AddRoundKey)
這一步是唯一利用到密鑰的一步,128bit的密鑰也同樣被排列成4X4的矩陣。
讓輸入數組的每一個字節a[i,j]與密鑰對應位置的字節k[i,j]異或一次,就生成了輸出值b[i,j]。
需要補充一點,加密的每一輪所用到的密鑰并不是相同的。這里涉及到一個概念:擴展密鑰(KeyExpansions)。
擴展密鑰(KeyExpansions)
AES源代碼中用長度 4 * 4 *(10+1) 字節的數組W來存儲所有輪的密鑰。W{0-15}的值等同于原始密鑰的值,用于為初始輪做處理。
后續每一個元素W[i]都是由W[i-4]和W[i-1]計算而來,直到數組W的所有元素都賦值完成。
W數組當中,W{0-15}用于初始輪的處理,W{16-31}用于第1輪的處理,W{32-47}用于第2輪的處理 ......一直到W{160-175}用于最終輪(第10輪)的處理。
1.ECB模式
ECB模式(ElectronicCodebookBook)是最簡單的工作模式,在該模式下,每一個明文塊的加密都是完全獨立,互不干涉的。
這樣的好處是什么呢?
1.簡單
2.有利于并行計算
缺點同樣也很明顯:
相同的明文塊經過加密會變成相同的密文塊,因此安全性較差。
2.CBC模式
CBC模式(Cipher Block Chaining)引入了一個新的概念:初始向量IV(Initialization Vector)。
IV是做什么用的呢?它的作用和MD5的“加鹽”有些類似,目的是防止同樣的明文塊始終加密成同樣的密文塊。
從圖中可以看出,CBC模式在每一個明文塊加密前會讓明文塊和一個值先做異或操作。IV作為初始化變量,參與第一個明文塊的異或,后續的每一個明文塊和它前一個明文塊所加密出的密文塊相異或。
這樣以來,相同的明文塊加密出的密文塊顯然是不一樣的。
CBC模式的好處是什么呢?
安全性更高
壞處也很明顯:
1.無法并行計算,性能上不如ECB
2.引入初始化向量IV,增加復雜度。
-
AES加密算法
+關注
關注
0文章
5瀏覽量
5937
原文標題:漫畫:AES算法的底層原理
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論