AES 是?Advanced Encryption Standard 的縮寫泪电,是最常見的對稱加密算法瞬矩。AES 在密碼學中又稱 Rijndael 加密法姑廉,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準饭望。這個標準用來替代原先的 DES,已經(jīng)被多方分析且廣為全世界所使用澈侠。
AES基本原理
AES 的加密公式為 C=E(K,P)劫侧,其中 K 為密鑰,P 為明文,C 為密文烧栋。
AES 加密明文的過程是写妥,首先對明文進行分組,每組的長度都是 128 位劲弦,然后一組一組地加密耳标,直到所有明文都已加密醇坝。密鑰的長度可以是 128邑跪、192 或 256 位。
在加密函數(shù) E 中呼猪,會執(zhí)行一個輪函數(shù)画畅,除最后一次執(zhí)行不同外,前面幾輪的執(zhí)行是相同的宋距。以 AES-128 為例轴踱,推薦加密輪數(shù)為 10 輪,即前 9 輪執(zhí)行的操作相同谚赎,第 10 輪執(zhí)行的操作與前面不同淫僻。不同的密鑰長度推薦的加密輪數(shù)是不一樣的,具體見下面的表格壶唤。
加密時雳灵,明文按照 128 位為單位進行分組,每組包含?16 個字節(jié)闸盔,按照從上到下悯辙、從左到右的順序排列成一個 4 × 4 的矩陣,稱為明文矩陣迎吵。AES 的加密過程在一個大小同樣為 4 × 4 的矩陣中進行躲撰,稱為狀態(tài)矩陣,狀態(tài)矩陣的初始值為明文矩陣的值击费。每一輪加密結(jié)束后拢蛋,狀態(tài)矩陣的值變化一次。輪函數(shù)執(zhí)行結(jié)束后蔫巩,狀態(tài)矩陣的值即為密文的值谆棱,從狀態(tài)矩陣得到密文矩陣,依次提取密文矩陣的值得到 128 位的密文批幌。
以 128 位密鑰為例础锐,密鑰長度為 16 個字節(jié),也用 4 × 4 的矩陣表示荧缘,順序也是從上到下皆警、從左到右。AES 通過密鑰編排函數(shù)把密鑰矩陣擴展成一個包含 44 個字的密鑰序列截粗,其中的前 4 個字為原始密鑰用于初始加密信姓,后面的 40 個字用于 10 輪加密鸵隧,每輪使用其中的 4 個字。密鑰遞歸產(chǎn)生規(guī)則如下:
(1) 如果 i 不是 4 的倍數(shù)意推,那么由等式 w[i] = w[i-4] ⊕ w[i-1] 確定豆瘫;
(2) 如果 i 是 4 的倍數(shù),那么由等式 w[i] = w[i-4] ⊕ T(w[i-1]) 確定菊值。
加密的第 1 輪到第 9 輪的輪函數(shù)一樣外驱,包括 4 個操作:字節(jié)代換、行位移腻窒、列混合和輪密鑰加昵宇。最后一輪迭代不執(zhí)行列混合。另外儿子,在第一輪迭代之前瓦哎,先將明文和原始密鑰進行一次異或加密操作。?
AES 加密的輪函數(shù)操作
字節(jié)代換 SubBytes
矩陣中的各字節(jié)通過一個 8 位的 S-box 進行轉(zhuǎn)換柔逼。這個步驟提供了加密法非線性的變換能力蒋譬。S-box 與 GF(2^8)上的乘法反元素有關(guān),已知具有良好的非線性特性愉适。為了避免簡單代數(shù)性質(zhì)的攻擊犯助,S-box 結(jié)合了乘法反元素及一個可逆的仿射變換矩陣建構(gòu)而成。此外在建構(gòu) S-box 時儡毕,刻意避開了固定點與反固定點也切,即以 S-box 替換字節(jié)的結(jié)果會相當于錯排的結(jié)果。
行位移?ShiftRows
在此步驟中腰湾,每一行都向左循環(huán)位移某個偏移量雷恃。在 AES 中(區(qū)塊大小 128位 ),第一行維持不變费坊,第二行里的每個字節(jié)都向左循環(huán)移動一格倒槐。同理,第三行及第四行向左循環(huán)位移的偏移量就分別是 2 和 3附井。128 位和 192 位的區(qū)塊在此步驟的循環(huán)位移的模式相同讨越。經(jīng)過 ShiftRows 之后,矩陣中每一豎列永毅,都是由輸入矩陣中的每個不同列中的元素組成把跨。Rijndael 算法的版本中,偏移量和 AES 有少許不同沼死;對于長度 256 比特的區(qū)塊着逐,第一行仍然維持不變,第二行、第三行耸别、第四行的偏移量分別是 1 字節(jié)健芭、2 字節(jié)、3 字節(jié)秀姐。除此之外慈迈,ShiftRows 操作步驟在 Rijndael 和 AES 中完全相同。
列混合?MixColumns
在 MixColumns 步驟省有,每一列的四個字節(jié)通過線性變換互相結(jié)合痒留。每一列的四個元素分別當作 1 , x , x^2 , x^3 的系數(shù),合并即為GF(2^8)中的一個多項式锥咸,接著將此多項式和一個固定的多項式 c(x)=3x^3+x^2+x+2 在 modulo x^4 + 1 下相乘狭瞎。此步驟亦可視為 Rijndael 有限域之下的矩陣乘法。MixColumns 函數(shù)接受 4 個字節(jié)的輸入搏予,輸出 4 個字節(jié),每一個輸入的字節(jié)都會對輸出的四個字節(jié)造成影響弧轧。因此 ShiftRows 和 MixColumns 兩步驟為這個密碼系統(tǒng)提供了擴散性雪侥。
輪密鑰加 AddRoundKey
回合密鑰將會與原矩陣合并。在每次的加密循環(huán)中精绎,都會由主密鑰產(chǎn)生一把回合密鑰(通過 Rijndael 密鑰生成方案產(chǎn)生)速缨,這把密鑰大小會跟原矩陣一樣,以與原矩陣中每個對應(yīng)的字節(jié)作異或(⊕)加法代乃。
分享學習筆記和技術(shù)總結(jié)旬牲,內(nèi)容涉及 Java 進階、架構(gòu)設(shè)計搁吓、前沿技術(shù)原茅、算法與數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫堕仔、中間件等多個領(lǐng)域擂橘,歡迎關(guān)注。本文首發(fā)于微信公眾號“后端開發(fā)那點事兒”摩骨。