十分鐘看懂AES加密

十分鐘看懂AES加密算法

今天看了Moserware的《A Stick Figure Guide to the Advanced Encryption Standard(AES)》收穫了很多,對AES算法有了更加清楚的理解,這篇博客用了大量的情景圖文來展現AES的發展歷史和算法的具體流程,雖然是2009年的博文,可是在今天仍然是頗有借鑑意義。今天將這篇博文翻譯過來,翻譯不順暢,暫且拋磚引玉。
好久之前
1
AES:我天天處理不少數據。我把不少很神奇的祕密數據加密成枯燥的數據包給你的WIFI路由器,這些都是我作的!
2
AES:可是仍是沒有人關心的我故事,嗚嗚嗚。。。
3
AES:個人故事能夠比灰姑娘的故事更傳奇呢,由於我如今但是分組密碼世界的國王!
4
你還沒走啊,想聽個人故事?來我們開始造做吧…
5
曾經啊(1975之前),除了保密局沒有辦法去評判那種加密算法更好,有人說是EBG13 vf terng, 也有人說是Double ROT13,各執一詞。
6
終於有人站出來號召建立一個好的安全加密算法。
7
這時一個強有力的競爭者佔了出來,他的名字就是IBM!
8
在國家安全局的修改以後,他被欽定爲數據加密標準,也就是DES。由於人家有更加短的密鑰和更增強壯的S盒。
9
DES已經統治了20多年了,學術界也開始研究他。這是第一次細緻的研究。今後,現代密碼學誕生。
10
這些年間,前赴後繼的攻擊者挑戰DES,並且DES被戰勝過幾回。
11
阻止攻擊的惟一辦法就是使用DES算法三次也就是’Triple-DES’,這個辦法很可行,可是真的是很慢。
12
有一個需求來了,他們須要像’Triple-DES’同樣強壯可是更快更靈活的加密算法。(~1997)
13
你們都躍躍欲試。
14
個人創造者也就是AES的發明者,Vincent Rijmen和Joan Daemen也在他們之中,他們倆把他們的姓結合在一塊兒給我做爲乳名:Rijndael。
15
16
不出所料,AES贏了。
17
並且,AES成了加密界的國王,他無處不在。Intel甚至在他們的芯片中爲我量身定製了底層指令來讓AES執行地更快!
18
可是加密算法是怎麼工做的呢?咱們來到下一部分算法

密碼學基礎

19
想明白加密算法是怎麼工做的你須要知道3個idea來理解這些東西。安全

1. 混淆

20
在明文和加密以後的祕文之間創建某種關係是很好的想法。一個混淆的例子是凱撒密碼。密文的每一個字母對應於明文字母的後面第三個字母。ide

2. 擴散

21
另外一個很好的想法是擴散信息。一個例子是簡單的列轉置。函數

3. 保密密鑰

22
千百年來,咱們發現假設沒有人知道你的加密方法是一件愚蠢的事情,總會有人最終知道的。
23
可是具體是怎麼工做的呢?咱們看下一部分ui

詳細過程

24
可是在我告訴大家以前,大家得先簽署這份協議!
25
你須要先簽這個玩意兒
26
將數據放在一個44得矩陣裏,在這個矩陣得末尾進行填充,由於數據不老是16字節來正好填滿。這個矩陣咱們在下文中稱之爲‘狀態矩陣’
27
初始的一輪將剛纔咱們建立的矩陣和第一輪的密碼4
4矩陣進行異或操做
28
爲何用異或操做?緣由很簡單,異或快並且開銷少–很快的位運算。異或運算使用簡單的硬件並且能夠並行計算由於沒有多餘的爲須要參與運算。加密

密鑰擴散 Part1

29
AES須要不少密鑰以供後面輪加密的使用。AES經過一個簡單的混合操做來將初始的密鑰生成這些密鑰。這個生成過程很快。儘管它也有一些缺點:(太簡單),AES已經足夠好了。idea

密鑰擴散 Part2a

30

  • 首先,將上一輪的密鑰的最後一列拿出來而後將這一列的第一個字節放到最後一個位置上,其餘位置的字節依次向上移動一個位置
  • 而後,將變換位置後的這一列經過一個替代盒的映射轉換爲另外一列

密鑰擴散 Part2b

31

  • 而後把剛纔的獲得的那一列再與輪常量列相異或,這個常量對每一輪都不同
  • 最後再把剛纔異或以後獲得的列與上一輪的密鑰的第一列相異或獲得第一列

密鑰擴散 Part3

32
剛纔咱們獲得了第一列,那麼第二列怎麼獲得呢?很簡單,用咱們上一輪的密鑰的第二列和咱們剛纔獲得的第一列異或就獲得了新一輪的第二列,第三列第四列用一樣的方法依次計算獲得(注意256位的密鑰更加複雜,咱們用的是128位的密鑰,也就是16字節)
33
接下來是中間輪了,中間輪是對一系列操做重複執行若干次。重複的次數取決於密鑰的長度(128位則重複9次,192位重複11次,256位重複13次)翻譯

混淆:替代字節

34
將每一字節經過S盒換成另一個字節,咱們用圖片左下角和右下角的符號表示混淆這一操做
擴散 Part1:行移位
35
將44的矩陣按圖左的方式進行行移位,而後按圖右的方式進行從新組合獲得一個新的44矩陣左下角和右下角的符號表明行移位這一操做orm

擴散 Part2:列混淆

36
用列混淆變換將每一列轉換成新的一列,算法爲模不可約多項式
圖片中左下角和右下角的符號表明列混淆操做圖片

加輪密鑰

37
在每輪的最後,將上一步列混淆獲得的矩陣與下一輪的密鑰進行異或獲得新的矩陣
38
在最後一輪咱們丟棄了列混淆這一操做,由於最後一輪它不會提升安全性了,只會將速度拉低
39
每一輪我都對這些比特進行混淆和擴散。並且還把每一輪的密鑰都嵌入進去。輪數越多安全性越好!
40
決定到底要多少輪老是面臨一個挑戰,那就是在安全性和效率以前作出權衡。
41
有人說能夠通過6輪加密就能夠了,可是這很很差!若是你仔細觀察,你會發現每一輪輸出的每個比特取決於前兩輪。爲了增長擴散的雪崩效應,我增長了4輪。這是個人安全邊界。密鑰長度位128位時須要10輪,192位時須要12輪,256位時須要14輪。
42
每次AES都要先執行異或初始操做,而後執行9輪擁有4項操做的中間輪,最後執行包括三項操做的最後一輪
43
解密意味着加密的逆過程
44
相比與ECB而言,CBC更好
45
可是除了剛纔所作的那些類比,究竟發生了些什麼呢?
46
若是像真正明白這些東西,咱們還須要數學基礎知識

數學!

47
咱們思考一個問題,X+X=?你可能會說2X
48
咱們回顧一下數學基礎

(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

49
咱們將會作點小改變,之前,係數能夠很大,而如今,咱們只讓係數等於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⨁1

x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2
x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2

50

上圖展現了乘法怎麼讓式子增長的飛快
51
儘管新的加法讓事情變得更加簡單,可是x13x13仍是顯得太大了,咱們怎麼才能讓這個多項式的最高次不高於7呢?
52
咱們請來了咱們的朋友——時鐘數學,怎麼作呢?只須要把式子加在一塊兒而後作長除法就能夠了。咱們要時刻注意餘數(這也叫模加法)
53
在咱們這裏,咱們用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,仍是過高了,咱們必須將它變小一點

54
咱們將剛纔的結果除以m(x)=x8⨁x4⨁x3⨁x⨁1m(x)=x8⨁x4⨁x3⨁x⨁1而後取餘數
55
下面咱們到了最艱難的部分了:對數運算。對數運算搞定以後,其餘都是小case!對數能夠幫助咱們將乘法轉換爲加法(如圖)
56
咱們將對數引入咱們的新世界,在這裏,底數再也不是10了,而是簡單的多項式x⨁1x⨁1(若是你不停地乘以x⨁1x⨁1而後除以m(x)m(x)獲得餘數,你會發現你能夠生成全部低於x8x8的多項式)
57
爲何咱們要用這種數學呢?密碼學與比特和字節打交道不是嗎?OK,還有一個最後的聯繫,一個7階的多項式能夠表示1字節,由於咱們用剛纔引入的數學方法生成的多項式的係數只能是1或0
58
對於字節,咱們將多項式加法變成簡單的異或。咱們能夠用對數技巧建立一個表來加快運算
59
由於咱們知道怎麼定義的乘法,咱們能夠爲每個多項式字節找到真正字節的逆運算。由於總共只有255個這樣的字節,因此咱們能夠暴力破解
60
如今咱們能夠理解神祕的S盒了。它將一個字節aa應用兩個函數。第一個函數是g,找到aa的逆元,第二個函數是f,f是故意讓這個數學更麻煩來抵擋黑客的進攻
61
咱們還能夠理解那些瘋狂的輪常量。我經過不停地乘以xx來獲得他們
62
列混淆變換是最困難的。我把每一列看做是一個多項式.用咱們新的乘法將它乘以一個特殊的多項式,而後除以x4+1x4+1獲得餘數,而後將其簡化成矩陣相乘
63 全部的東西都濃縮到上圖了

相關文章
相關標籤/搜索