十分鐘讀懂AES加密算法

偶閱博客一篇,漫畫式的講解十分有趣,故轉之。

原文地址:https://blog.csdn.net/lrwwll/article/details/78069013

 

------------------------------------------------ 分割線 ------------------------------------------------

今天看了Moserware的《A Stick Figure Guide to the Advanced Encryption Standard(AES)》收穫了不少,對AES算法有了更加清楚的理解,這篇博客用了大量的情景圖文來展示AES的發展歷史和算法的具體流程,雖然是2009年的博文,但是在今天仍然是很有借鑑意義。今天將這篇博文翻譯過來,翻譯不暢,暫且拋磚引玉。

很久以前

1
AES:我每天處理很多數據。我把很多很神奇的祕密數據加密成枯燥的數據包給你的WIFI路由器,這些都是我做的! 
2
AES:但是還是沒有人關心的我故事,嗚嗚嗚。。。 
2

AES:我的故事可以比灰姑娘的故事更傳奇呢,因爲我現在可是分組密碼世界的國王! 
3
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

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

2. 擴散

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

3. 保密密鑰

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

詳細過程

33
但是在我告訴你們之前,你們得先簽署這份協議! 
34
你需要先簽這個玩意兒 
35

將數據放在一個4*4得矩陣裏,在這個矩陣得末尾進行填充,因爲數據不總是16字節來正好填滿。這個矩陣我們在下文中稱之爲‘狀態矩陣’ 
36
初始的一輪將剛纔我們創建的矩陣和第一輪的密碼4*4矩陣進行異或操作 
37

爲什麼用異或操作?原因很簡單,異或快而且開銷少–很快的位運算。異或運算使用簡單的硬件而且可以並行計算因爲沒有多餘的爲需要參與運算。

密鑰擴散 Part1

38

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

密鑰擴散 Part2a

39

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

密鑰擴散 Part2b

40

* 然後把剛纔的得到的那一列再與輪常量列相異或,這個常量對每一輪都不一樣 
* 最後再把剛纔異或之後得到的列與上一輪的密鑰的第一列相異或得到第一列

密鑰擴散 Part3

41

剛纔我們得到了第一列,那麼第二列怎麼得到呢?很簡單,用我們上一輪的密鑰的第二列和我們剛纔得到的第一列異或就得到了新一輪的第二列,第三列第四列用同樣的方法依次計算得到(注意256位的密鑰更加複雜,我們用的是128位的密鑰,也就是16字節) 
42

接下來是中間輪了,中間輪是對一系列操作重複執行若干次。重複的次數取決於密鑰的長度(128位則重複9次,192位重複11次,256位重複13次)

混淆:替代字節

43

將每一字節通過S盒換成另外一個字節,我們用圖片左下角和右下角的符號表示混淆這一操作

擴散 Part1:行移位

44

將4*4的矩陣按圖左的方式進行行移位,然後按圖右的方式進行重新組合得到一個新的4*4矩陣左下角和右下角的符號代表行移位這一操作

擴散 Part2:列混淆

45

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

加輪密鑰

46

在每輪的最後,將上一步列混淆得到的矩陣與下一輪的密鑰進行異或得到新的矩陣 
47

在最後一輪我們丟棄了列混淆這一操作,因爲最後一輪它不會提高安全性了,只會將速度拉低 
48

每一輪我都對這些比特進行混淆和擴散。而且還把每一輪的密鑰都嵌入進去。輪數越多安全性越好! 
49

決定到底要多少輪總是面臨一個挑戰,那就是在安全性和效率之前做出權衡。 
50

有人說可以經過6輪加密就可以了,但是這很不好!如果你仔細觀察,你會發現每一輪輸出的每一個比特取決於前兩輪。爲了增加擴散的雪崩效應,我增加了4輪。這是我的安全邊界。密鑰長度位128位時需要10輪,192位時需要12輪,256位時需要14輪。 
51

每次AES都要先執行異或初始操作,然後執行9輪擁有4項操作的中間輪,最後執行包括三項操作的最後一輪 
52

解密意味着加密的逆過程 
53

相比與ECB而言,CBC更好 
54

但是除了剛纔所做的那些類比,究竟發生了些什麼呢? 
55

如果像真正明白這些東西,我們還需要數學基礎知識

數學!

56

我們思考一個問題,X+X=?你可能會說2X 
57

我們回顧一下數學基礎

 

(x+1)2=(x+1)(x+1)=x2+x+x+1=x2+2x+1

58

我們將會做點小改變,以前,係數可以很大,而現在,我們只讓係數等於1或0 
舊方式:

     123x2+45x2+678x+9x+10=168x2+687x+10

新方式:
     x2⨁x2⨁x2⨁x⨁x⨁1=x2⨁1
     x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2

59

上圖展示了乘法怎麼讓式子增加的飛快 
60

 

儘管新的加法讓事情變得更加簡單,但是x13x13還是顯得太大了,我們怎麼才能讓這個多項式的最高次不高於7呢? 
61

我們請來了我們的朋友——時鐘數學,怎麼做呢?只需要把式子加在一起然後做長除法就可以了。我們要時刻注意餘數(這也叫模加法) 
62

在我們這裏,我們用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,還是太高了,我們必須將它變小一點

63

我們將剛纔的結果除以m(x)=x8⨁x4⨁x3⨁x⨁1m(x)=x8⨁x4⨁x3⨁x⨁1然後取餘數 
64

下面我們到了最艱難的部分了:對數運算。對數運算搞定之後,其他都是小case!對數可以幫助我們將乘法轉換爲加法(如圖) 
65

我們將對數引入我們的新世界,在這裏,底數不再是10了,而是簡單的多項式x⨁1x⨁1(如果你不停地乘以x⨁1x⨁1然後除以m(x)m(x)得到餘數,你會發現你可以生成所有低於x8x8的多項式) 
66

爲什麼我們要用這種數學呢?密碼學與比特和字節打交道不是嗎?OK,還有一個最後的聯繫,一個7階的多項式可以表示1字節,因爲我們用剛纔引入的數學方法生成的多項式的係數只能是1或0 
67

對於字節,我們將多項式加法變成簡單的異或。我們可以用對數技巧創建一個表來加快運算 
68

因爲我們知道怎麼定義的乘法,我們可以爲每一個多項式字節找到真正字節的逆運算。因爲總共只有255個這樣的字節,所以我們可以暴力破解 
69

現在我們可以理解神祕的S盒了。它將一個字節aa應用兩個函數。第一個函數是g,找到aa的逆元,第二個函數是f,f是故意讓這個數學更麻煩來抵擋黑客的進攻 
70

我們還可以理解那些瘋狂的輪常量。我通過不停地乘以xx來得到他們 
71

列混淆變換是最困難的。我把每一列看作是一個多項式.用我們新的乘法將它乘以一個特殊的多項式,然後除以x4+1x4+1得到餘數,然後將其簡化成矩陣相乘 
72

所有的東西都濃縮到上圖了

OVER

 

最後再附上原圖地址:http://www.moserware.com/2009/09/stick-figure-guide-to-advanced.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章