# AES-NIST 翻譯 聯邦信息 加工標准出版物 197 2001 年 11 月 26 日 宣布高級加密標準 (AES) ** 聯邦信息處理標准出版物 (FIPS PUBS) 由國家標準技術研究所 (NIST)發布,在經商務部長批准後,根據 1996 年信息技術管理改革法案第 5131 節(公法 104-106)和 1987 年計算機安全法(公法 100-235)。 1. **標準名稱**。 高級加密標準 (AES) (FIPS PUB 197)。 2. **標準類別**。 計算機安全標準,密碼學。 3. 解釋。 高級加密標準 (AES) 指定了 FIPS 批准的可用於保護電子數據的密碼算法。 AES算法是一個可以加密(encipher)和解密(decipher)信息的對稱塊密碼。加密將數據轉換成一種無法理解的形式,稱為密文; 解密密文將數據轉換回其原始形式,稱為明文。 AES 算法能夠使用 128、192 和 256 位的加密密鑰來加密並解密 128 位塊中的數據。 4. **審批機關**。 商務部長。 5. *維修機構**。 商務部、美國國家標準研究院技術,信息技術實驗室(ITL)。 6. **適用性**。 聯邦部門和機構可以在以下情況下使用該標準機構確定敏感(非機密)信息(如 P. L. 100-235 中所定義)需要加密保護。 可以使用其他 FIPS 批准的加密算法來補充或代替此標準。 使用加密設備保護機密的聯邦機構或部門信息可以使用這些設備來保護敏感(非機密)信息,而不是這個標準。 此外,本標準可能被非聯邦政府組織採納和使用。當它為商業和私人提供所需的安全時,鼓勵使用。 7. **規格**。 聯邦信息處理標準 (FIPS) 197,高級加密標準 (AES)(附)。 8. **實施**。 本標準中指定的算法可以在軟件、固件、硬件或其任意組合。 具體實現可取決於幾個因素,例如應用程序、環境、使用的技術等。算法應與 FIPS 批准或 NIST 推薦的模式結合使用手術。 這些模式中使用的 AES 的對象標識符 (OID) 和任何相關參數可在位於計算機安全對象寄存器 (CSOR) 的http://csrc.nist.gov/csor/ [2]。 由認可的實驗室測試和驗證的算法的實現將是視為符合本標準。 由於密碼安全取決於許多除了正確實施加密算法之外的因素,聯邦政府員工和其他人,還應參考 NIST 特別出版物 800-21,指南在聯邦政府中實施密碼學,以獲取更多信息和指導(NIST SP 800-21 可在 http://csrc.nist.gov/publications/ 獲得)。 9. **實施時間表**。 本標準自 2002 年 5 月 26 日起施行。 10. **專利**。 本標準中指定的算法的實現可能包含在美國和外國專利。 11. **出口管制**。 某些加密設備和有關它們的技術數據是受聯邦出口管制。 執行此標準的密碼模塊的出口和有關它們的技術數據必須符合這些聯邦法規,並獲得許可美國商務部出口管理局。 適用聯邦聯邦法規 (CFR) 部分第 15 篇規定了政府出口管制740.17; 標題 15,CFR 第 742 部分; 和標題 15,CFR 第 774 部分,第 5 類,第 2 部分。 12. **資格**。 NIST 將繼續關注 AES 分析的發展算法。 與其他密碼算法標準一樣,NIST 將正式重新評估這個標準每五年一次。此標準和可能的威脅都會降低通過使用此標準提供的安全性標準將由 NIST 酌情進行審查,同時考慮到最新可用的分析和技術。 此外,對任何技術突破或任何該算法的數學弱點將導致 NIST 重新評估該標準並提供必要的修改。 13. **棄權程序**。 在某些特殊情況下,聯邦首腦機構或其代表可以批准對聯邦信息處理標準的豁免(美國聯邦知識產權保護協會)。 此類機構的負責人只能將此類權力重新授予高級官員根據美國法典第 44 篇第 3506(b) 節指定。 豁免只能授予當遵守本標準時 a. 對聯邦計算機操作員完成任務產生不利影響系統或 b. 對運營商造成重大不利的財務影響,而政府的儲蓄並不能抵消。 機構負責人可以根據包含上述詳細信息的書面豁免請求採取行動。機構負責人在確定條件時也可以在沒有書面豁免請求的情況下採取行動因為達不到標準。 機構負責人只能通過書面形式批准豁免解釋機構負責人做出所需調查結果的依據的決定。 複印件每項此類決定的採購敏感或機密部分均應明確標識送往:國家標準技術研究院; 收件人:FIPS 豁免決定,信息技術實驗室, 100 Bureau Drive, Stop 8900, Gaithersburg, MD 208998900。 此外,每項豁免的通知和批准豁免的每項授權應立即發送給眾議院政府運作委員會參議院的代表和政府事務委員會應予以公佈及時在聯邦公報上。當豁免決定適用於設備和/或服務的採購時,豁免決定的通知必須作為一部分在《商業商業日報》上發布收購要約徵求通知的通知,或者,如果作出豁免決定在發布該通知後,對該通知進行修訂。棄權書副本、任何證明文件、批准棄權書的文件以及任何支持文件和隨附文件,經機構授權刪除,以及決定根據美國法典第 5 篇第 552(b) 條進行採購,應作為採購的一部分文件並由該機構保留。 14. **從哪裡獲得副本**。 該出版物可通過訪問以電子方式獲得http://csrc.nist.gov/publications/。 其他可用的計算機安全出版物的列表,包括訂購信息,可以從 NIST 出版物列表 91 中獲得,這是在同一網站上可用。 或者,NIST 計算機安全出版物的副本是可從以下地址獲得:國家技術信息服務 (NTIS),5285 Port Royal Road,弗吉尼亞州斯普林菲爾德 22161。 目錄 1. 簡介 2. 定義 2.1 術語表和縮略語 2.2 算法參數、符號和函數 3. 符號和約定 3.1 輸入和輸出 3.2 字節 3.3 字節數組 3.4 國家 3.5 作為列數組的狀態 4. 數學預備知識 4.1 添加 4.2 乘法 4.2.1 乘以 x 4.3 係數為 GF(28) 的多項式) 5. 算法規範 5.1 密碼 5.1.1 SubBytes()轉換 5.1.2 ShiftRows() 轉換 5.1.3 MixColumns() 轉換 5.1.4 AddRoundKey() 轉換 5.2 按鍵擴展 5.3 反密碼 5.3.1 InvShiftRows() 轉換 5.3.2 InvSubBytes() 轉換 5.3.3 InvMixColumns() 轉換 5.3.4 AddRoundKey() 轉換的逆 5.3.5 等效逆密碼 6. 實施問題 6.1 密鑰長度要求 6.2 鍵控限制 6.3 密鑰長度、塊大小和輪數的參數化 6.4 實施 # 一、簡介 該標準規定了 Rijndael 算法([3] 和 [4]),一種對稱塊密碼,可以使用長度為 128、192 和 256 位的密鑰處理 128 位的數據塊。Rijndael 旨在處理額外的塊大小和密鑰長度,但它們不是本標准採用。 在本標準的其餘部分,此處指定的算法將被稱為“AES 算法。” 該算法可以與指示的三種不同密鑰長度一起使用以上,因此這些不同的“風味”可能被稱為“AES-128”、“AES-192”和“AES-256”。 本規範包括以下部分: 2. 術語、縮略語和算法參數、符號和功能的定義; 3. 算法規範中使用的符號和約定,包括順序和位、字節和字的編號; 4. 有助於理解算法的數學性質; 5. 算法規範,涵蓋密鑰擴展、加密、解密例程; 6. 實現問題,例如密鑰長度支持、鍵控限制和其他塊/鍵/輪大小。 該標準以幾個附錄結尾,其中包括 Key 的分步示例擴展和密碼,密碼和逆密碼的示例向量,以及列表參考。 # 二.定義 本標准通篇使用以下定義: AES 高級加密標準仿射 仿射變換 Affine Transformation 由矩陣乘法和隨後的矩陣相乘組成的變換轉換添加一個向量。 數組 Array 相同實體的枚舉集合(例如,字節數組)。 位 Bit 值為 0 或 1 的二進制數字。 區塊 Block 二進制位的塊序列,包括輸入、輸出、狀態和圓鍵。 序列的長度是它包含的位數。塊也被解釋為字節數組。 Byte 字節 一組八位,被視為單個實體或8 個獨立位的數組。 加密 Cipher 使用密鑰將明文轉換為密文的一系列轉換。 加密密鑰安全Cipher Key Secret,密鑰擴展例程使用的加密密鑰生成一組輪密鑰; 可以被描繪成一個矩形陣列字節,有四行和 Nk 列。 密文Ciphertext 從 Cipher 輸出或輸入到 Inverse Cipher 的數據。 逆向加密 Inverse Cipher 一系列轉換,使用以下方法將密文轉換為明文密鑰。 密鑰擴展Key Expansion 例程用於從密碼密鑰生成一系列輪密鑰。 明文Plaintext 數據輸入到 Cipher 或從 Inverse Cipher 輸出。 Rijndael 此高級加密中指定的加密算法標準 (AES)。 輪密鑰Round Key 輪密鑰是使用密鑰從密碼密鑰派生的值擴展例程; 它們應用於密碼中的狀態和逆密碼。 S-box state 狀態 可以被描繪成矩形陣列的中間密碼結果字節數,有四行和 Nb 列。用於多字節替換的非線性替換錶轉換並在密鑰擴展例程中執行字節值的一對一替換。 字 word 一組 32 位,被視為單個實體或數組4 個字節。 2.2 算法參數、符號和函數 本標準中使用了以下算法參數、符號和函數: AddRoundKey() 一輪的密碼和逆密碼中的變換使用異或運算將密鑰添加到狀態。 的長度Round Key 等於狀態的大小(即,對於 Nb = 4,Round密鑰長度等於 128 位/16 字 節)。 InvMixColumns() Inverse Cipher 中的轉換是混合列()。 InvShiftRows() Inverse Cipher 中的轉換是 ShiftRows() 的逆運算。 InvSubBytes() Inverse Cipher 中的轉換是子字節()。 K 密鑰。 MixColumns() Cipher 中的轉換採用所有列陳述並混合他們的數據(彼此獨立)以產生新的列。 Nb 構成狀態的列數(32 位字)。 為了這標準,Nb = 4。(另見第 6.3 節。) Nk 組成密鑰的 32 位字數。 為了這標準,Nk = 4、6 或 8。(另見第 6.3 節。) Nr 輪數,它是 Nk 和 Nb 的函數(即固定的)。 對於此標準,Nr = 10、12 或 14。(另請參見第 6.3 節。) Rcon[] 圓形常量字數組。 RotWord() Key Expansion 例程中使用的函數,需要一個四字節字並執行循環排列。 ShiftRows() 循環處理狀態的密碼轉換將 State 的最後三行移動不同的偏移量。 SubBytes() 使用在每個狀態上運行的非線性字節替換錶(S-box)處理狀態的密碼轉換獨立聲明字節。 SubWord() Key Expansion 例程中使用的函數,需要一個四字節輸入字並將 S-box 應用於四個字節中的每一個產生一個輸出詞。 XOR 異或運算。 ![](https://i.imgur.com/eqEinOp.png) 異或運算。 ![](https://i.imgur.com/JMQbOne.png) 有限域乘法。 # 三、符號和約定 ## 3.1 輸入和輸出 AES 算法的輸入和輸出各包含 128 位序列(數字0 或 1 的值)。 這些序列有時會被稱為區塊和數量它們包含的位將被稱為它們的長度。 AES 算法的密碼密鑰是128、192 或 256 位的序列。 不允許其他輸入、輸出和密碼密鑰長度按這個標準。 此類序列中的位將從零開始編號,並以小於序列長度(塊長度或密鑰長度)的位置結束。 我附加到一個位的數字被稱為它的索引並且將處於 0 <= i <= 128、0 <= i <= 192 或 0 <= i <= 256 的範圍之一,具體取決於塊長度和密鑰長度(上面指定)。 ## 3.2字節 AES 算法中處理的基本單位是字節,八位序列被視為單一實體。 輸入、輸出和密碼密鑰位序列在第 3.1 節中描述。 被處理作為通過將這些序列分成八個連續的組而形成的字節數組 位形成字節數組(見第 3.3 節)。 對於由 a 表示的輸入、輸出或密碼密鑰,結果數組中的字節將使用兩種形式之一引用,an 或 a[n],其中 n 將處於以下範圍之一: Key length = 128 bits, 0 <= n <= 16; Block length = 128 bits, 0 <= n <= 16; Key length = 192 bits, 0 <= n <= 24; Key length = 256 bits, 0 <= n <= 32. AES 算法中的所有字節值都將表示為其各個位的串聯大括號之間的值(0 或 1),順序為 {b7, b6, b5, b4, b3, b2, b1, b0}。 這些字節是使用多項式表示解釋為有限域元素: ![](https://i.imgur.com/gguj01M.png) 例如{01100011}標識具體的有限域元素![](https://i.imgur.com/7YaFYUr.png) 使用十六進製表示法來表示字節值也很方便,兩組中的每一組四位由單個字符表示,如圖 1 所示。 ![](https://i.imgur.com/AAb6Z5p.png) 圖 1. 位模式的十六進製表示。 因此元素 {01100011} 可以表示為 {63},其中表示包含較高編號位的四位組再次位於左側。 一些有限域運算涉及到 8 位字節左側的一個附加位 (b8)。 這個在存在額外的位,它將在 8 位字節之前顯示為“{01}”; 例如,一個9 位序列將顯示為 {01}{1b}。 ## 3.3 字節數組 字節數組將以以下形式表示: ![](https://i.imgur.com/AZEXzA5.png) 字節和字節內的位元順序源自 128 位輸入序列 ![](https://i.imgur.com/8lb1qvF.png) 如下: ![](https://i.imgur.com/yf6xxHk.png) 該模式可以擴展到更長的序列(即,對於 192 位和 256 位密鑰),因此,一般的, ![](https://i.imgur.com/0PvUnlg.png) 將第 3.2 節和第 3.3 節放在一起,圖 2 顯示了每個字節中的位是如何編號的。 ![](https://i.imgur.com/OTtRsFK.png) 圖 2. 字節和位的索引。 ## 3.4 state 在內部,AES 算法的操作是在二維字節數組上執行的稱為state。 State由四行字節組成,每行包含Nb個字節,其中Nb是塊長度除以 32。在由符號 s 表示的狀態數組中,每個單獨的字節 有兩個索引,其行號 r 在 0 <= r <= 4 範圍內,其列號 c 在範圍 0<=£ c <= Nb。 這允許狀態的單個字節被稱為 s(r,c) 或s[r,c]。 對於此標準,Nb=4,即 0 <= c < 4(另見第 6.3 節)。 在第 5 節中描述的密碼和逆密碼的開頭。 輸入——字節數組in0, in1, … in15 – 被複製到狀態數組中,如圖 3 所示。密碼或逆然後對該 State 數組進行密碼運算,然後將其最終值複製到輸出——字節數組 out0、out1、... out15。 ![](https://i.imgur.com/voihcLu.png) 圖 3. 狀態數組輸入和輸出。 因此,在 Cipher 或 Inverse Cipher 的開頭,輸入數組 in 被複製到 State根據方案排列: ![](https://i.imgur.com/6Zqq5MG.png) 在 Cipher 和 Inverse Cipher 的末尾,狀態被複製到輸出數組 out 作為如下: ![](https://i.imgur.com/8YKNeKx.png) ## 3.5 作為列數組的狀態 State數組每列的四個字節組成32位字,其中行號r為每個單詞中的四個字節提供索引。 因此,狀態可以解釋為32 位字(列)的一維數組,w0...w3,其中列號 c 提供該數組的索引。 因此,對於圖 3 中的示例,State 可以被視為一個數組四個字,如下: ![](https://i.imgur.com/Z2vCfRx.png) # 四、 數學預習 AES 算法中的所有字節都被解釋為使用符號的有限域元素在第二節介紹。 3.2. 有限域元素可以相加和相乘,但是這些操作與用於數字的不同。 以下小節介紹了基本的第二節所需的數學概念。 5. ## 4.1 加法 有限域中兩個元素的相加是通過“相加”的係數來實現的這兩個元素的多項式中的相應冪。 添加是用XOR 運算(用 ![](https://i.imgur.com/jZ3UO65.png)表示) - 即模 2 - 使得 1![](https://i.imgur.com/LZ1iPT8.png)1 = 0 、1![](https://i.imgur.com/7HvDF2s.png)0 = 1 和 0![](https://i.imgur.com/xuUvwwX.png)0 = 0 。 因此,多項式的減法與多項式的加法相同。 或者,有限域元素的加法可以描述為模 2 加法字節中的相應位。 對於兩個字節 {a7a6a5a4a3a2a1a0} 和 {b7b6b5b4b3b2b1b0},總和為{c7c6c5c4c3c2c1c0},其中每個 ci = ai ![](https://i.imgur.com/v4teVBl.png)bi(即,c7 = a7 ![](https://i.imgur.com/dCZdBYE.png)b7,c6 = a6 ![](https://i.imgur.com/ZIrR4pw.png)b6,...c0 = a0![](https://i.imgur.com/7EXj9Qd.png)b0)。 例如,下面的表達式是等價的: ![](https://i.imgur.com/hweX5Ax.png) ## 4.2 乘法 在多項式表示中,GF(2^8)(用•表示)對應於多項式乘以 8 次不可約多項式的模。多項式是如果它的唯一約數是一和它本身,則它是不可約的。 對於 AES 算法,這個不可約多項式是 ![](https://i.imgur.com/6sDPsyn.png) 或以十六進製表示的 {01}{1b}。例如,{57} • {83} = {c1},因為 ![](https://i.imgur.com/kDJq3J6.png) m(x) 的模約簡確保結果將是次數較少的二元多項式小於 8,因此可以用一個字節表示。 與加法不同,沒有簡單的操作對應於該乘法的字節級別。 上面定義的乘法是結合的,元素 {01} 是乘法身份。 對於任何次數小於 8 的非零二進制多項式 b(x),乘法b(x) 的逆,表示為 b-1(x),可以發現如下:擴展歐幾里德算法 [7] 是 用於計算多項式 a(x) 和 c(x) 使得 ![](https://i.imgur.com/4kaiavH.png) 因此,a(x) • b(x) mod m(x) = 1,這意味著 ![](https://i.imgur.com/gJFrYq5.png) 此外,對於域中的任意 a(x)、b(x) 和 c(x),它認為 ![](https://i.imgur.com/MfrY3Lk.png) 它遵循 256 個可能字節值的集合,XOR 用作加法和如上定義的乘法,具有有限域 GF(28). It follows that the set of 256 possible byte values, with XOR used as addition and the multiplication defined as above, has the structure of the finite field GF(2^8). ## 4.2.1 乘以 x 將等式 (3.1) 中定義的二進制多項式與多項式 x 相乘得到 ![](https://i.imgur.com/uGe4JNZ.png) 結果 x • b(x) 是通過減少上述結果模 m(x) 獲得的,如等式中所定義(4.1)。 如果 b7 = 0,則結果已經是簡化形式。 如果 b7 = 1,減少是通過減去(即異或)多項式 m(x)。 它遵循 x 的乘法(即,{00000010} 或 {02}) 可以在字節級實現為左移和後續與 {1b} 的條件按位異或。 這種對字節的操作由 xtime() 表示。可以通過重複應用 xtime() 來實現乘以 x 的更高次冪。通過添加中間結果,可以實現乘以任意常數。 例如,{57} • {13} = {fe} 因為 ![](https://i.imgur.com/TDWyvyw.png) ## 4.3 係數為 GF(2^8) 的多項式 四項多項式可以定義為 - 係數是有限域元素 - 為: ![](https://i.imgur.com/kv46A6t.png) 這將被表示為 [a0 , a1 , a2 , a3 ] 形式的單詞。 請注意,這裡的多項式部分的行為與有限域定義中使用的多項式有些不同元素,即使兩種類型的多項式使用相同的不確定項 x。 係數在本節中是有限域元素本身,即字節,而不是位; 還有,四項多項式的乘法使用不同的約簡多項式,定義如下。從上下文中應該始終清楚區分。為了說明加法和乘法運算,讓 ![](https://i.imgur.com/tWnq6n8.png) 定義第二個四項多項式。 通過添加有限域來執行加法x 的同次冪的係數。 此加法對應於每個單詞中的相應字節 - 換句話說,完整單詞的異或值。因此,使用 (4.5) 和 (4.6) 的等式, ![](https://i.imgur.com/t8gqu05.png) 乘法分兩步實現。 在第一步中,多項式乘積 c(x) = a(x) •b(x) 是代數展開的,並且收集類似的權力給 ![](https://i.imgur.com/3x0Jofh.png) ![](https://i.imgur.com/FejSJOR.png) 結果 c(x) 不代表四字節字。 因此,第二步乘法是將 c(x) 對 4 次多項式求模; 結果可以簡化為次數小於 4 的多項式。對於 AES 算法,這是通過多項式 x^4 + 1,所以 ![](https://i.imgur.com/W5m16bn.png) a(x) 和 b(x) 的模積,表示為 a(x) ∼ b(x),由四項給出多項式 d(x),定義如下: ![](https://i.imgur.com/c0IK1fb.png) 當a(x)為固定多項式時,式(4.11)定義的運算可寫成矩陣形式為: ![](https://i.imgur.com/gkhBCqA.png) 因為 x^4 +1 不是 GF(2^8), 乘以一個固定的四項多項式不一定是可逆的。 然而,AES 算法指定了一個固定的四項具有逆的多項式(參見第 5.1.3 節和第 5.3.3 節): ![](https://i.imgur.com/aQmVYeM.png) AES 算法中使用的另一個多項式(參見第 5.2 節中的 RotWord() 函數)有 a0= a1 = a2 = {00} and a3 = {01}, 即多項式 x^ 3. 上式(4.13)的檢驗將顯示其作用是通過旋轉輸入字中的字節來形成輸出字。 這意味著 [b0, b1, b2, b3] 被轉換為 [b1, b2, b3, b0]。 # 五、算法規範 對於AES算法,輸入塊、輸出塊和State的長度都是128位。 這由 Nb = 4 表示,它反映了 32 位字的數量(數量列)在狀態。 對於 AES 算法,密鑰的長度 K 為 128、192 或 256 位。 鑰匙length 由 Nk = 4、6 或 8 表示,它反映了 32 位字的數量(數量列)在密碼密鑰中。 對於 AES 算法,在執行過程中要執行的輪數算法取決於密鑰大小。 輪數用Nr表示,其中Nr =Nk = 4 時為 10,Nk = 6 時為 Nr = 12,Nk = 8 時為 Nr = 14。 唯一符合該標準的 Key-Block-Round 組合在圖 4 中給出。有關密鑰長度、塊大小和輪數的實施問題,請參閱第 1 節。6.3. ![](https://i.imgur.com/mb7J96R.png) 對於其密碼和逆密碼,AES 算法使用的輪函數是由四種不同的面向字節的轉換組成:1)字節替換使用替換表(S-box),2)將狀態數組的行移動不同的偏移量,3)混合State 數組每一列中的數據,以及 4) 向 State 添加 Round Key。 這些轉換(及其逆)在第二節中描述。 5.1.1-5.1.4 和 5.3.1-5.3.4。密碼和逆密碼在第 5.1 5.3節中描述。 5.1 和秒。 分別同時Key密鑰表在第5.2節中描述。 ## 5.1 密文 在 Cipher 的開始,使用第 1 節中描述的約定將輸入複製到 State 數組。 3.4. 在初始 Round Key 添加之後,State 數組通過執行輪函數 10、12 或 14 次(取決於密鑰長度)進行轉換,最後一輪與前 Nr -1 輪略有不同。 然後將最終狀態復製到輸出,如第 3.4 節中所述。 round 函數使用由一維使用第 1 節中描述的密鑰擴展例程派生的四字節字數組。 5.2.密碼在圖 5 中的偽代碼中進行了描述。各個轉換 -SubBytes()、ShiftRows()、MixColumns() 和 AddRoundKey() – 處理狀態並在以下小節中描述。 在圖 5 中,數組 w[] 包含鍵時間表,這在第二節中有描述。 5.2.如圖 5 所示,所有 Nr 輪都是相同的,除了最後一輪,它確實 不包括 MixColumns() 轉換。 附錄 B 提供了密碼示例,顯示了狀態數組的值每輪的開始和應用中描述的四個轉換中的每一個之後以下部分。 ![](https://i.imgur.com/cwb54w3.png) 圖 5. Cipher.1 的偽代碼 ### 5.1.1 SubBytes()轉換 SubBytes() 轉換是一種獨立運行的非線性字節替換使用替換錶(S-box)在狀態的每個字節上。 這個 S-box(圖 7),它是可逆的,是通過組合兩個變換構造的: 1. 取有限域GF(28), 在第二節中描述。 4.2; 這元素 {00} 映射到自身。2. 應用以下仿射變換(在 GF(2) 上): 2. 應用以下仿射變換(在 GF(2) 上): ![](https://i.imgur.com/56Reco6.png) 對於 0 <= i < 8 ,其中 bi 是 i^th字節的第 bit,ci 是第 i^th字節 c 的第 bit 與值 {63} 或 {01100011}。 在這里和其他地方,變量上的質數(例如,b')表示變量要用右邊的值更新。在矩陣形式下,S盒的仿射變換元素可以表示為: ![](https://i.imgur.com/4lcTKtV.png) 圖 6 說明了 SubBytes() 轉換對狀態的影響。 p.s.1 各種轉換(例如 SubBytes()、ShiftRows() 等)作用於被尋址的 State 數組通過“狀態”指針。 AddRoundKey() 使用一個額外的指針來尋址 Round Key。 ![](https://i.imgur.com/AdmQci8.png) 圖 6. SubBytes() 將 S-box 應用於狀態的每個字節。 The S-box used in the SubBytes() transformation is presented in hexadecimal form in Fig. 7. SubBytes() 轉換中使用的 S-box 在圖 7 中以十六進制形式呈現。例如,如果 s1,1 ={53},則替換值將由交集確定圖 7 中索引為“5”的行和索引為“3”的列的結果。這將導致 s11' 有{ed} 的值。 ![](https://i.imgur.com/4TDIKwC.png) 圖 7. S-box:字節 xy 的替換值(十六進制格式)。 ### 5.1.2 ShiftRows() 轉換 在ShiftRows()轉換中,循環State最後三行的字節移動了不同數量的字節(偏移量)。 第一行,r = 0,沒有移動。具體來說,ShiftRows() 轉換過程如下: ![](https://i.imgur.com/AmjjB8p.png) 其中移位值 shift(r,Nb) 取決於行號 r,如下所示(回想一下 Nb = 4): ![](https://i.imgur.com/Y1nmlKi.png) 這具有將字節移動到行中“較低”位置的效果(即,a 中 c 的較低值給定行),而“最低”字節環繞到行的“頂部”(即,較高的值c 在給定的行中)。 圖 8 說明了 ShiftRows() 轉換。 ![](https://i.imgur.com/LrEKuwN.png) 圖 8. ShiftRows() 循環移動狀態中的最後三行。 ### 5.1.3 MixColumns() 轉換 MixColumns() 轉換逐列對 State 進行操作,處理每個列作為四項多項式,如第 1 節所述。 4.3. 這些列被認為是GF(2^8) 和乘以模 x^4 + 1 具有固定多項式 a(x),由下式給出 ![](https://i.imgur.com/bzvRfQM.png) 如第二節所述。 4.3,這個可以寫成矩陣乘法。 讓 ![](https://i.imgur.com/C3zoIaP.png) ![](https://i.imgur.com/BJfZ3VG.png) 作為這種乘法的結果,一列中的四個字節被以下內容替換: ![](https://i.imgur.com/nzvni7l.png) 圖 9 說明了 MixColumns() 轉換。 ![](https://i.imgur.com/sEd7HB3.png) 圖 9. MixColumns() 逐列對 State 進行操作。 ### 5.1.4 AddRoundKey() 轉換 在 AddRoundKey() 轉換中,Round Key 通過簡單的按位添加到 State異或運算。 每個 Round Key 由來自密鑰表的 Nb 個詞組成(在第 1 節中描述)。5.2). 這些 Nb 個詞分別被添加到 State 的列中,這樣 ![](https://i.imgur.com/9j8lk6u.png) 其中 [wi] 是第 5.2 節中描述的關鍵調度詞。round是范圍內的一個值0 <= round <= Nr. 在 Cipher 中,初始 Round Key 添加發生在 round = 0 時,先於round函數的第一次應用(見圖5)。 AddRoundKey()的應用當 1 <= round <= Nr 時,密碼轉換為 Nr 輪。 這種轉換的作用如圖 10 所示,其中 l = round * Nb。 字節密鑰表中的地址在第3.1節中進行了描述。 ![](https://i.imgur.com/GB7iLKG.png) 圖 10. AddRoundKey() 將 State 的每一列與一個詞進行異或運算從關鍵時間表。 ## 5.2 密鑰擴展 AES 算法採用密碼密鑰 K,並執行密鑰擴展例程以生成關鍵時間表。 The Key Expansion一共生成了Nb(Nr+1)個詞:算法需要一組初始的 Nb 個詞,Nr 輪的每一輪都需要 Nb 個詞的關鍵數據。 這生成的密鑰表由 4 字節字的線性數組組成,表示為 [wi],其中 i 在範圍內0 <= i < Nb(Nr + 1)。 根據偽代碼將輸入密鑰擴展到密鑰表中圖 11。 SubWord() 是一個接受四字節輸入字並應用 S-box 的函數(第 5.1.1 節,圖 7)四個字節中的每一個都產生一個輸出字。 函數 RotWord() 需要一個詞[a0,a1,a2,a3]作為輸入,進行循環置換,返回詞[a1,a2,a3,a0]。 這圓形常量字數組 Rcon[i],包含由 [xi-1,{00},{00},{00}], 與X^i-1 是域 GF(28) 中 x 的冪(x 表示為 {02})), 如第二節所述。 4.2(注意i從 1 開始,而不是 0)。 從圖 11 可以看出,擴展密鑰的前 Nk 個詞填充的是密鑰。 接下來的每個word w[i] 都等於前一個word w[i-1] 的異或,並且word Nk 位於更早的位置,w[i-Nk]。 對於位置是 Nk 倍數的word,a在 XOR 之前對 w[i-1] 應用轉換,然後是帶有輪次的 XOR常量,Rcon[i]。 這種轉換包括一個字中字節的循環移位(RotWord()),然後對單詞的所有四個字節應用表查找(Subword())。 重要的是要注意 256 位密碼密鑰 (Nk = 8) 的密鑰擴展例程是與 128 位和 192 位密碼密鑰略有不同。 如果 Nk = 8 並且 i-4 是 Nk 的倍數,然後在 XOR 之前將 SubWord() 應用於 w[i-1]。 ![](https://i.imgur.com/NJuOqNe.png) 請注意,Nk=4、6 和 8 不必全部實現; 它們都包含在上面的條件語句中簡明。 具體實施要求密碼密鑰在第6.1節中介紹。 圖 11. 密鑰擴展的偽代碼.2 附錄 A 給出了密鑰擴展的示例。 ## 5.3 逆密碼 第二節中的密碼轉換。 5.1可以倒過來,然後逆序執行到為 AES 算法生成一個簡單的逆密碼。 個人的轉變用於逆向密碼 - InvShiftRows()、InvSubBytes()、InvMixColumns()、 和 AddRoundKey() – 處理狀態並在以下小節中描述。圖 12 中的偽代碼描述了逆密碼。在圖 12 中,數組 w[] 包含關鍵時間表,這在前面的5.2節中有所描述。 函數 SubWord() 和 RotWord() 返回一個結果,該結果是函數輸入的轉換,而Cipher 和 Inverse Cipher 中的轉換(例如,ShiftRows()、SubBytes() 等)轉換由“狀態”指針尋址的狀態數組。 ![](https://i.imgur.com/azMR9yX.png) 附錄 A 給出了密鑰擴展的示例。 ### 5.3.1 InvShiftRows() 轉換 InvShiftRows() 是 ShiftRows() 轉換的逆。 最後的字節State 的三行循環移位不同的字節數(偏移量)。 首先行,r = 0,沒有移動。 底部三行循環移位 Nb - shift(r, Nb) 字節,其中移位值 shift(r,Nb) 取決於行號,在等式 (5.4) 中給出(參見第 5.1.2 節)。 具體來說,InvShiftRows() 轉換過程如下: ![](https://i.imgur.com/GoPCK19.png) 圖 13 說明了 InvShiftRows() 轉換。 3 各種轉換(例如 InvSubBytes()、InvShiftRows() 等)作用於狀態數組由“狀態”指針尋址。 AddRoundKey() 使用一個額外的指針來尋址 Round Key。 ![](https://i.imgur.com/Ztag6Pz.png) 圖 13. InvShiftRows() 循環移動狀態中的最後三行。 ### 5.3.2 InvSubBytes() 轉換 InvSubBytes() 是字節替換變換的逆運算,其中將逆 S 盒應用於 State 的每個字節。 這是通過應用仿射的倒數獲得的變換 (5.1),然後對 GF(28) 進行乘法逆運算). InvSubBytes() 轉換中使用的逆 S 盒如圖 14 所示: ![](https://i.imgur.com/KB9F8sc.png) 圖 14. 逆 S 盒:字節 xy 的替換值(在十六進制格式)。 ### 5.3.3 InvMixColumns() 轉換 InvMixColumns() 是 MixColumns() 轉換的逆。InvMixColumns() 逐列對 State 進行操作,將每一列視為四項多項式,如第 1 節所述。 4.3. 這些列被視為多項式 女友(28) 和乘以模 x^4個 + 1 具有固定多項式 a-1(x),由 ![](https://i.imgur.com/oNupYca.png) 如第4.3節所述。這個可以寫成矩陣乘法。 讓 ![](https://i.imgur.com/mvH1YB6.png) 作為這種乘法的結果,一列中的四個字節被以下內容替換: ![](https://i.imgur.com/q9fV9yn.png) ### 5.3.4 AddRoundKey() 轉換的逆向 AddRoundKey(),這在第 5.1.4 節中有描述。是它自己的逆,因為它只涉及異或運算的一個應用。 在第5.3節中介紹的簡單逆向密碼中。 圖12,序列的轉換不同於密碼,而密鑰時間表的形式加密和解密保持不變。 但是,AES 算法的幾個屬性允許具有與密碼(用它們的逆代替變換)。 這是通過更改完成的在關鍵時間表中。 允許此等效逆向密碼的兩個屬性如下: 1. SubBytes() 和 ShiftRows() 轉換通勤; 這是一個SubBytes() 轉換後緊跟 ShiftRows()轉換等同於立即進行 ShiftRows() 轉換接著購買 SubBytes() 轉換。 他們的反面也是如此,InvSubBytes() 和 InvShiftRows。 2. 列混合操作 - MixColumns() 和 InvMixColumns() - 是與列輸入呈線性關係,這意味著. InvMixColumns(state XOR Round Key) = InvMixColumns(state) XOR InvMixColumns(Round Key)。 這些屬性允許 InvSubBytes() 和 InvShiftRows() 的順序要逆轉的轉變。 AddRoundKey() 和 InvMixColumns() 的順序如果解密密鑰的列(word)使用 InvMixColumns() 轉換修改計劃。通過顛倒 InvSubBytes() 和InvShiftRows() 轉換如圖 12 所示,並通過顛倒順序之後的“循環”中使用的 AddRoundKey() 和 InvMixColumns() 轉換首先修改 round = 1 到 Nr-1 的解密密鑰計劃,使用InvMixColumns() 轉換。 解密密鑰的第一個和最後一個Nb字時間表不得以這種方式修改。鑑於這些變化,由此產生的等效逆密碼提供了一種更有效的結構比第二節中描述的逆密碼。 5.3 和圖 12. 等效的偽代碼Inverse Cipher 出現在圖 15 中。(單詞數組 dw[] 包含修改後的解密密鑰日程。 圖 15 中還提供了對密鑰擴展例程的修改。) ![](https://i.imgur.com/vqjD9sm.png) 對於等效逆密碼,在以下位置添加偽代碼密鑰擴展例程的結尾(第 5.2 節): ![](https://i.imgur.com/2b3hbya.png) 請注意,由於 InvMixColumns 對二維字節數組進行操作當 Round Keys 保存在一個單詞數組中時,調用此代碼序列中的 InvMixColumns 涉及類型的更改(即InvMixColumns() 的輸入通常是狀態數組,它被認為是一個二維字節數組,而這裡的輸入是一個 Round計算為一維單詞數組的鍵)。 圖 15. 等效逆密碼的虛擬代碼。 # 6.實施問題 ## 6.1 密鑰長度要求 AES 算法的實現應至少支持第 5.1 節中規定的三種密鑰長度中的一種。128、192 或 256 位(即 Nk 分別為 4、6 或 8)。 實現 25 可以選擇支持兩個或三個密鑰長度,這可以促進互操作性算法實現。 ## 6.2 密鑰限制 沒有為 AES 算法識別出弱密鑰或半弱密鑰,也沒有鍵選擇的限制。 ## 6.3 密鑰長度、塊大小和輪數的參數化 該標準明確定義了密鑰長度 (Nk)、塊大小 (Nb) 和輪數 (Nr) – 參見圖 4。但是,該標準的未來重申可能包括對這些參數允許值的更改或添加。 所以,實施者可以選擇在考慮未來靈活性的情況下設計他們的 AES 實施。 ## 6.4 各平台實施建議 實施變化是可能的,在許多情況下,可能提供性能或其他優點。 給定相同的輸入密鑰和數據(明文或密文),任何實現產生與本標準中指定的算法相同的輸出(密文或明文)是一個可接受的 AES 實現。 參考文獻 [3] 和位於參考文獻中的其他論文。 [1] 包括關於如何有效地在各種平台上實現 AES 算法。 # 附錄 A - 密鑰擴展示例 本附錄顯示了各種密鑰大小的密鑰時間表的開發。 請注意,多字節值是使用第 3 節中描述的符號表示的。中間值在密鑰計劃的開發過程中產生的(見第 5.2 節)在下面給出表(所有值均採用十六進制格式,索引列 (i) 除外)。 ## A.1 128 位密鑰的擴展 本節包含以下密鑰的密鑰擴展: ![](https://i.imgur.com/ArXQiiP.png) 對於 Nk = 4,這導致 ![](https://i.imgur.com/TOqD0lK.png) ![](https://i.imgur.com/Px75SIT.png) ![](https://i.imgur.com/qNEEEOM.png) ## A.2 192 位密鑰的擴展 本節包含以下密鑰的密鑰擴展: ![](https://i.imgur.com/uWrcUs9.png) ![](https://i.imgur.com/hnoYg1e.png) ![](https://i.imgur.com/MbULPaH.png) ![](https://i.imgur.com/RTYUS1M.png) ## A.3 256 位密鑰的擴展 ![](https://i.imgur.com/yGb5ssB.png) ![](https://i.imgur.com/mzQanvT.png) ![](https://i.imgur.com/O6ZpMR8.png) ## 附錄 B – 密碼示例 下圖顯示了狀態數組中的值作為塊的密碼進展 長度和每個 16 字節的密碼密鑰長度(即 Nb = 4 和 Nk = 4)。 ![](https://i.imgur.com/ugH0tOd.png) ![](https://i.imgur.com/XMcYK00.png) ## 附錄 C – 示例向量 本附錄包含示例向量,包括所有三個 AES 密鑰的中間值長度(Nk = 4、6 和 8),用於密碼、逆密碼和等效逆密碼在第二節中描述。 分別為 5.1、5.3 和 5.3.5。 在 [1] 和[5]. 所有向量都採用十六進製表示法,每對字符給出一個字節值,其中每對左邊的字符為包含較高位的 4 位組提供位模式使用第 1 節中解釋的符號對位進行編號。 3.2、同時右字符提供位較低編號位的模式。 所有字節的數組索引(兩個十六進制的組這些測試向量中的數字)從零開始並從左到右增加。 ![](https://i.imgur.com/bw2RZZ7.png) ### C.1 AES-128(Nk=4,Nr=10) ![](https://i.imgur.com/sRD6vvs.png) ![](https://i.imgur.com/K0rNEle.png) ![](https://i.imgur.com/L3UQ4C5.png) ![](https://i.imgur.com/7FFEdfK.png) ![](https://i.imgur.com/bHcuOxj.png) ![](https://i.imgur.com/wWqA5pg.png) ### C.2 AES-192(Nk=6,Nr=12) ![](https://i.imgur.com/FfjzBAH.png) ![](https://i.imgur.com/IyMnxws.png) ![](https://i.imgur.com/cVSI8SV.png) ![](https://i.imgur.com/efEH0tc.png) ![](https://i.imgur.com/ohnN9Xz.png) ![](https://i.imgur.com/a8uVxXy.png) ![](https://i.imgur.com/f9XWFwF.png) ## C.3 AES-256 (Nk=8, Nr=14) ![](https://i.imgur.com/YULI2Xo.png) ![](https://i.imgur.com/USD1Riz.png) ![](https://i.imgur.com/6p7QhqM.png) ![](https://i.imgur.com/vR0eKLd.png) ![](https://i.imgur.com/LR1b8Qi.png) ## 附錄 D - 參考資料 [1] AES page available via http://www.nist.gov/CryptoToolkit. 4 [2] Computer Security Objects Register (CSOR): http://csrc.nist.gov/csor/. [3] J. Daemen and V. Rijmen, AES Proposal: Rijndael, AES Algorithm Submission, September 3, 1999, available at [1]. [4] J. Daemen and V. Rijmen, The block cipher Rijndael, Smart Card research and Applications, LNCS 1820, Springer-Verlag, pp. 288-296. [5] B. Gladman’s AES related home page http://fp.gladman.plus.com/cryptography_technology/. [6] A. Lee, NIST Special Publication 800-21, Guideline for Implementing Cryptography in the Federal Government, National Institute of Standards and Technology, November 1999. [7] A. Menezes, P. van Oorschot, and S. Vanstone, Handbook of Applied Cryptography, CRC Press, New York, 1997, p. 81-83. [8] J. Nechvatal, et. al., Report on the Development of the Advanced Encryption Standard (AES), National Institute of Standards and Technology, October 2, 2000, available at [1].
{"metaMigratedAt":"2023-06-17T19:51:58.818Z","metaMigratedFrom":"Content","title":"AES-NIST 翻譯","breaks":true,"contributors":"[{\"id\":\"d04bcc5d-3861-4f44-ac15-833b4c074a3b\",\"add\":47797,\"del\":27079}]"}
    118 views