第六章 高級加密標準
第六章 高級加密標準
美國國家技術研究所NIST在2001年發布了高級加密標準AES,一個對稱分組密碼算法,取代DES稱為廣泛使用的標準。
與公鑰密碼RSA相比,AES以及大多數的對稱密碼的結構都很復雜。
AES中所有的運算是在8位的字節上進行的。
一個域是一個結合,在集合內進行加減乘除運算的結果,也不會離開該域。例如\(Z_p=\{0,1,2,3,\dots,p-1\}\),其中\(p\)是一個素數,然後該域上的操作是取模。
1. AES的結構
明文分組長度為128位即16字節(對明文進行分組,每個組的昌都市128位)。密鑰長度可以使16字節,24字節或是32位字節,對應的128位,192位,256位。根據密鑰的長度。算法被稱為AES-128等。
加密解密算法的密鑰輸入後也被組織成一個字節方陣,然後被擴展為:密鑰字陣列。128位的密鑰最終擴展為44個32位的序列:也就是說,128位的輸入密鑰,先按照\(4 \times 4\)字節的形式組織,然後擴展成44個4字節的序列\(w_i\)(數組),然後每4個序列組成一個\(4 \times 4\)的方陣(按列擺放),一共有11個方陣。128位密鑰總共能夠進行10輪(11次),192位對應12輪,256對應14輪。
每一輪都有:
- 字節代替
. 行位移
. 列混淆
. 輪密鑰加
組成。
其中第0輪只是一次輪密鑰加。因此嚴格意義上,128位的還是10次。
1.1 字節替換
字節替換是一個簡單的查表操作。為的是:防止已有的各種密碼分析的攻擊。
AES定義了一個S盒,是一個\(16 \times 16\)字節組成的矩陣,也就是一個表。包含了8位所有能表示的256個數的一個置換,其中要置換字節的高4位作為行值,低4位作為列值。
另外還有一個逆S盒,是解密時候用的。
S盒的構造:
- 首先按照\((x,y)\)初始化盒中\(16 \times 16\)表格中的每一個。例如,第9行,2列的值就是\(92\)
- 然後對\(16\times 16\)表格中的每一個值用它的逆替換。(這個後面再看,有點小看不懂)
- 沒看懂
S盒被設計成:能夠防止已有的各種密碼分析攻擊。尋求輸入和除數為之間相關性設計的很低,而且輸出值不是輸入值的線性數學函數時。
1.2 行位移變換
這個比較簡單:第\(n\)行左移\(n\)個字節。(\(n\)從0開始)
行變換確保了某列中的四個字節被擴展到了4個不同的列:擴散
1.3 列混淆變換
列混淆變換的真相列混淆變換對每列獨立的進行操作。
每列中的每個字節被映射為一個新值。辭職有改了中的每4個字節通過某個函數變換得來。其操作就是左乘一個\(4 \times 4\)的矩陣。
列混淆的矩陣中的值是基於碼字間有最大距離的線性編碼,使得每列的所有字節都有良好的混淆性。
列混淆和行變換使得在經過幾輪變換後,所有的輸出位於所有的輸入位相關。
1.4 輪密鑰加
是將前3個步驟的輸出結果(其中第0輪,也就是第一次,直接使用第一組\(w_0\ ~\ w_3\)進行)與對應輪的密鑰進行異或操作。
輪密鑰加的變換操作影響了輸入的每一位。密鑰擴展的復雜性和AES其他階段運算的復雜性,確保了該算法的安全性。
1.5 總結
AES不是一個Feistel結構,Feistel結構:數據分組中的一半使用密鑰處理,然後用它來修改數據分組中的另一半,然後交換這兩部分。
AES則是在每一輪都使用代替和混淆將這個數據分組作為一個單一的矩陣處理
2 AES密鑰擴展算法
AES的密鑰擴展算法輸入值是16個字節(128位),輸出是44個4字節的一維線性數組。(書上使用一個字表示4字節)
輸入密鑰被復制到擴展密鑰數組的前4個字(原封不動的復制到了擴展密鑰的前128位),這樣就有了\(w[0] \dots w[3]\).
- 當\(w[i]\)的\(i\)是\(4\)的倍數時候,采用跟復雜算法計算一個tmp,也就是在第5的\(w\)的時候第一次計算tmp。其計算規則是:
- \(w[i-4]\)四個字節,都左移一個字節。
- 使用S盒替換其中的每個字節
- 與一個輪常量進行異或操作
然後每個\(w[i]\)是\(w[i-4]\)與tmp的異或結果。(tmp可以理解為,每4個\(w\)才會變一次的一個值)
輪常量是4個字節,右邊3個字節都是0,左邊一個字節每一輪都不同。雖然有固定的算法,但是每輪的輪常量最左一個字節是固定的。可以查表得到。
輪密鑰的設計在於防止已有的密碼分析攻擊。輪常量則是為了防止不同的輪常量產生方式上的對稱性或是相似性。
第六章 高級加密標準