十分鐘看懂AES加密演算法
今天看了Moserware的《A Stick Figure Guide to the Advanced Encryption Standard(AES)》收穫了不少,對AES演算法有了更加清楚的理解,這篇部落格用了大量的情景圖文來展示AES的發展歷史和演算法的具體流程,雖然是2009年的博文,但是在今天仍然是很有借鑑意義。今天將這篇博文翻譯過來,翻譯不暢,暫且拋磚引玉。
很久以前
AES:我每天處理很多資料。我把很多很神奇的祕密資料加密成枯燥的資料包給你的WIFI路由器,這些都是我做的!
AES:但是還是沒有人關心的我故事,嗚嗚嗚。。。
AES:我的故事可以比灰姑娘的故事更傳奇呢,因為我現在可是分組密碼世界的國王!
你還沒走啊,想聽我的故事?來我們們開始造作吧…
曾經啊(1975以前),除了保密局沒有辦法去評判那種加密演算法更好,有人說是EBG13 vf terng, 也有人說是Double ROT13,各執一詞。
終於有人站出來號召建立一個好的安全加密演算法。
這時一個強有力的競爭者佔了出來,他的名字就是IBM!
在國家安全域性的修改之後,他被欽定為資料加密標準,也就是DES。因為人家有更加短的金鑰和更加強壯的S盒。
DES已經統治了20多年了,學術界也開始研究他。這是第一次細緻的研究。從此,現代密碼學誕生。
這些年間,前赴後繼的攻擊者挑戰DES,而且DES被打敗過幾次。
阻止攻擊的唯一辦法就是使用DES演算法三次也就是’Triple-DES’,這個辦法很可行,但是真的是很慢。
有一個需求來了,他們需要像’Triple-DES’一樣強壯但是更快更靈活的加密演算法。(~1997)
大家都躍躍欲試。
我的創造者也就是AES的發明者,Vincent Rijmen和Joan Daemen也在他們之中,他們倆把他們的姓結合在一起給我作為乳名:Rijndael。
不出所料,AES贏了。
而且,AES成了加密界的國王,他無處不在。Intel甚至在他們的晶片中為我量身定製了底層指令來讓AES執行地更快!
但是加密演算法是怎麼工作的呢?我們來到下一部分
密碼學基礎
想明白加密演算法是怎麼工作的你需要知道3個idea來理解這些東西。
1. 混淆
在明文和加密之後的祕文之間建立某種關係是很好的想法。一個混淆的例子是凱撒密碼。密文的每個字母對應於明文字母的後面第三個字母。
2. 擴散
另一個很好的想法是擴散資訊。一個例子是簡單的列轉置。
3. 保密金鑰
千百年來,我們發現假設沒有人知道你的加密方法是一件愚蠢的事情,總會有人最終知道的。
但是具體是怎麼工作的呢?我們看下一部分
詳細過程
但是在我告訴你們之前,你們得先簽署這份協議!
你需要先簽這個玩意兒
將資料放在一個44得矩陣裡,在這個矩陣得末尾進行填充,因為資料不總是16位元組來正好填滿。這個矩陣我們在下文中稱之為‘狀態矩陣’
初始的一輪將剛才我們建立的矩陣和第一輪的密碼44矩陣進行異或操作
為什麼用異或操作?原因很簡單,異或快而且開銷少–很快的位運算。異或運算使用簡單的硬體而且可以平行計算因為沒有多餘的為需要參與運算。
金鑰擴散 Part1
AES需要很多金鑰以供後面輪加密的使用。AES通過一個簡單的混合操作來將初始的金鑰生成這些金鑰。這個生成過程很快。儘管它也有一些缺點:(太簡單),AES已經足夠好了。
金鑰擴散 Part2a
- 首先,將上一輪的金鑰的最後一列拿出來然後將這一列的第一個位元組放到最後一個位置上,其他位置的位元組依次向上移動一個位置
- 然後,將變換位置後的這一列通過一個替代盒的對映轉換為另一列
金鑰擴散 Part2b
- 然後把剛才的得到的那一列再與輪常量列相異或,這個常量對每一輪都不一樣
- 最後再把剛才異或之後得到的列與上一輪的金鑰的第一列相異或得到第一列
金鑰擴散 Part3
剛才我們得到了第一列,那麼第二列怎麼得到呢?很簡單,用我們上一輪的金鑰的第二列和我們剛才得到的第一列異或就得到了新一輪的第二列,第三列第四列用同樣的方法依次計算得到(注意256位的金鑰更加複雜,我們用的是128位的金鑰,也就是16位元組)
接下來是中間輪了,中間輪是對一系列操作重複執行若干次。重複的次數取決於金鑰的長度(128位則重複9次,192位重複11次,256位重複13次)
混淆:替代位元組
將每一位元組通過S盒換成另外一個位元組,我們用圖片左下角和右下角的符號表示混淆這一操作
擴散 Part1:行移位
將44的矩陣按圖左的方式進行行移位,然後按圖右的方式進行重新組合得到一個新的44矩陣左下角和右下角的符號代表行移位這一操作
擴散 Part2:列混淆
用列混淆變換將每一列轉換成新的一列,演算法為模不可約多項式
圖片中左下角和右下角的符號代表列混淆操作
加輪金鑰
在每輪的最後,將上一步列混淆得到的矩陣與下一輪的金鑰進行異或得到新的矩陣
在最後一輪我們丟棄了列混淆這一操作,因為最後一輪它不會提高安全性了,只會將速度拉低
每一輪我都對這些位元進行混淆和擴散。而且還把每一輪的金鑰都嵌入進去。輪數越多安全性越好!
決定到底要多少輪總是面臨一個挑戰,那就是在安全性和效率之前做出權衡。
有人說可以經過6輪加密就可以了,但是這很不好!如果你仔細觀察,你會發現每一輪輸出的每一個位元取決於前兩輪。為了增加擴散的雪崩效應,我增加了4輪。這是我的安全邊界。金鑰長度位128位時需要10輪,192位時需要12輪,256位時需要14輪。
每次AES都要先執行異或初始操作,然後執行9輪擁有4項操作的中間輪,最後執行包括三項操作的最後一輪
解密意味著加密的逆過程
相比與ECB而言,CBC更好
但是除了剛才所做的那些類比,究竟發生了些什麼呢?
如果像真正明白這些東西,我們還需要數學基礎知識
數學!
我們思考一個問題,X+X=?你可能會說2X
我們回顧一下數學基礎
(x+1)2=(x+1)(x+1)=x2+x+x+1=x2+2x+1
(x+1)2=(x+1)(x+1)=x2+x+x+1=x2+2x+1
我們將會做點小改變,以前,係數可以很大,而現在,我們只讓係數等於1或0
舊方式:
123x2+45x2+678x+9x+10=168x2+687x+10
123x2+45x2+678x+9x+10=168x2+687x+10
新方式:
x2⨁x2⨁x2⨁x⨁x⨁1=x2⨁1
x2⨁x2⨁x2⨁x⨁x⨁1=x2⨁1x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2
x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2上圖展示了乘法怎麼讓式子增加的飛快
儘管新的加法讓事情變得更加簡單,但是x13x13還是顯得太大了,我們怎麼才能讓這個多項式的最高次不高於7呢?
我們請來了我們的朋友——時鐘數學,怎麼做呢?只需要把式子加在一起然後做長除法就可以了。我們要時刻注意餘數(這也叫模加法)
在我們這裡,我們用m(x)=x8⨁x4⨁x3⨁x⨁1m(x)=x8⨁x4⨁x3⨁x⨁1作為除數而不是12.假設我們現在做乘法x⋅b(x),b(x)x⋅b(x),b(x)有係數bb7…bb0;
但是得到的結果最高次冪是8,還是太高了,我們必須將它變小一點
我們將剛才的結果除以m(x)=x8⨁x4⨁x3⨁x⨁1m(x)=x8⨁x4⨁x3⨁x⨁1然後取餘數
下面我們到了最艱難的部分了:對數運算。對數運算搞定之後,其他都是小case!對數可以幫助我們將乘法轉換為加法(如圖)
我們將對數引入我們的新世界,在這裡,底數不再是10了,而是簡單的多項式x⨁1x⨁1(如果你不停地乘以x⨁1x⨁1然後除以m(x)m(x)得到餘數,你會發現你可以生成所有低於x8x8的多項式)
為什麼我們要用這種數學呢?密碼學與位元和位元組打交道不是嗎?OK,還有一個最後的聯絡,一個7階的多項式可以表示1位元組,因為我們用剛才引入的數學方法生成的多項式的係數只能是1或0
對於位元組,我們將多項式加法變成簡單的異或。我們可以用對數技巧建立一個表來加快運算
因為我們知道怎麼定義的乘法,我們可以為每一個多項式位元組找到真正位元組的逆運算。因為總共只有255個這樣的位元組,所以我們可以暴力破解
現在我們可以理解神祕的S盒了。它將一個位元組aa應用兩個函式。第一個函式是g,找到aa的逆元,第二個函式是f,f是故意讓這個數學更麻煩來抵擋黑客的進攻
我們還可以理解那些瘋狂的輪常量。我通過不停地乘以xx來得到他們
列混淆變換是最困難的。我把每一列看作是一個多項式.用我們新的乘法將它乘以一個特殊的多項式,然後除以x4+1x4+1得到餘數,然後將其簡化成矩陣相乘
所有的東西都濃縮到上圖了