版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 加密它:用新的高級加密標準(AES)保持你的數(shù)據(jù)安全</p><p> James McCaffrey </p><p> 摘要 AES(The Advanced Encryption Standard)是美國國家標準與技術研究所用于加密電子數(shù)據(jù)的規(guī)范。它被預期能成為人們公認的加密包括金融、電信和政府數(shù)字信息的方法。本文展示了AES的概貌并解析了它使用的算
2、法。包括一個完整的C#實現(xiàn)和加密.NET數(shù)據(jù)的舉例。在讀完本文后你將能用AES加密、測試 基于AES的軟件并能在你的系統(tǒng)中使用AES加密。美國國家標準與技術研究所(NIST)在2002年5月26日建立了新的高級數(shù)據(jù)加密標準(AES)規(guī)范。本文中我將提供一個用C#編寫的的能運行的 AES 實現(xiàn),并詳細解釋到底什么是 AES 以及編碼是如何工作的。我將向您展示如何用 AES 加密數(shù)據(jù)并擴展本文給出的代碼來開發(fā)一個商業(yè)級質(zhì)量的 AES 類。
3、我 還將解釋怎樣把 AES 結(jié)合到你的軟件系統(tǒng)中去和為什么要這么做,以及如何測試基于 AES 的軟件?! ES 是一個新的可以用于保護電子數(shù)據(jù)的加密算法。明確地說,AES 是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密</p><p> 00 11 22 33 44 55 66 77 88 99 aa bb cc
4、 dd ee ff</p><p> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</p><p> 192位密鑰的值是:</p><p> 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17</p><p> 0
5、 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23</p><p> Figure 2 S-盒( Sbox )當 AES 的構造函數(shù)(constructor)被調(diào)用時,用于加密方法的兩個表被初始化。第一個表是代替盒稱為S-盒。它是一個16×16的矩陣。S-盒的前五行和前五列如 Figure 2 所示。在幕后,加密例程獲取該密鑰數(shù)組
6、并用它來生成一個名為w[]的密鑰調(diào)度表,F(xiàn)igure 3 所示。Figure 3 密鑰調(diào)度表(Key Sched)w[] 最初的 Nk (6) 行被作為種子,用原始密鑰值(0x00 到0x17)。剩余行從種子密鑰來產(chǎn)生。變量 Nk 代表以 32 位字為單位的種子密鑰長度。稍后我分析 AES 實現(xiàn)時你將清楚地看到 w[] 是怎樣產(chǎn)生的。 關鍵是這里現(xiàn)在有許多密鑰使用而不只是一個。這些新的密鑰被稱為輪密鑰(round keys)以將
7、它們與原始種子密鑰區(qū)別開來。Figure 4 State (態(tài))數(shù)組 AES 加密例程開始是拷貝 16 字節(jié)的輸入數(shù)組到一個名為 State (態(tài))的 4×4 字節(jié)矩陣中。(參見 Figure 4)。AES 加密算法 取名為 Cipher,它操作 State[],其過程描述的偽代碼參見</p><p> 1 0 0 0 1 0 0 0</p><p> 0 0 0 0
8、 1 0 0 0 XOR</p><p> 1 0 0 0 0 0 0 0</p><p> AES 算法的主循環(huán)對 State 矩陣執(zhí)行四個不同的操作,在規(guī)范中被稱為 SubBytes(字節(jié)替換)、ShiftRows(行位移變換)、MixColumns(列混合變換) 和 AddRoundKey。除了每次循環(huán) AddRoundKey 都被調(diào)用并使用密鑰調(diào)度表的下面四行外,AddRoun
9、dKey 與預備處理步驟中的 AddRoundKey 相同。SubBytes 例程是一個代替操作,它將 State 矩陣中的每個字節(jié)替換成一個由 Sbox 決定的新字節(jié)。比如,如果 State[0,1]的值是 0x40 如果你想找到它的代替者,你取 State[0,1] 的值 (0x40) 并讓 x 等于左邊的數(shù)字(4)并讓 y 等于右邊的數(shù)字(0)。然后你用 x 和 y 作為索引 進到 Sbox 表中尋找代替值,如 Figure 2
10、所示?! hiftRows 是一個置換操作,它將 State 矩陣中的字節(jié)向左旋轉(zhuǎn)。Figure 6 示范了 ShiftRows 如何操作 State[]。State 的第0行被向左旋轉(zhuǎn)0個位置,State 的第1行被向左旋轉(zhuǎn)1個位置,State 的第2行被向左</p><p> State[0,1] = (State[0,1] * 0x01) + (State[1,1] * 0x02) +(State[2
11、,1] * 0x03) +(State[3,1] * 0x01)</p><p> = (0x09 * 0x01) + (0x60 * 0x02) + (0xe1 * 0x03) +(0x04 * 0x01)</p><p><b> = 0x57</b></p><p> 此處加法和乘法是專門的數(shù)學域操作,而不是平常整數(shù)的加法和乘法。
12、 SubBytes、ShiftRows、MixColumns 和 AddRoundKey 四個操作在一個執(zhí)行 Nr 次的循環(huán)里被調(diào)用,Nr 為給定密鑰大小的輪數(shù)減 1。加密算法使用的輪數(shù)要么是10,12,要么是14,這依賴于種子密鑰長度是128位、192 位還是 256 位。在這個例子中,因為 Nr 等于12, 則這四個操作被調(diào)用11次。該迭代完成后,在拷貝 State 矩陣到輸出參數(shù)前,加密算法調(diào)用 SubBytes、ShiftRo
13、ws 和 AddRoundKey 后結(jié)束?! 〈笾抡f來,AES 加密算法的核心有四個操作。AddRoundKey 使用從種子密鑰值中生成的輪密鑰代替 4 組字節(jié)。SubBytes 替換用一個代替表 替換單個字節(jié)。ShiftRows 通過旋轉(zhuǎn) 4字節(jié)行 的 4 組字節(jié)進行序列置換。MixColumns 用域加和域乘的組合來替換字節(jié)。有限域GF(28)的加法和乘法 正如你所看到的,AES 加密算法使用相當簡單明了的技術來代替和置換,
14、除 MixColumns 例程以外。MixColumns</p><p> b * 0x03 = b * (0x02 + 0x01)</p><p> = (b * 0x02) + (b * 0x01)</p><p> 這是可以行得通的,因為你知道如何用 0x02 和 0x01 相乘和相加,同哩,用0x0d去乘以任意字節(jié)b可以這樣做: </p>
15、<p> b * 0x0d = b * (0x08 + 0x04 + 0x01)</p><p> = (b * 0x08) + (b * 0x04) + (b * 0x01)</p><p> = (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x01)</p><p> 在加解密算法中
16、,AES MixColumns 例程的其它乘法遵循大體相同的模式,如下所示: </p><p> b * 0x09 = b * (0x08 + 0x01)</p><p> = (b * 0x02 * 0x02 * 0x02) + (b * 0x01)</p><p> b * 0x0b = b * (0x08 + 0x02 + 0x01)</p>
17、<p> = (b * 0x02 * 0x02 * 0x02) + (b * 0x02) + (b * 0x01)</p><p> b * 0x0e = b * (0x08 + 0x04 + 0x02)</p><p> = (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x02)</p><
18、;p> 總之,在GF(28)中,加法是異或操作。其乘法將分解成加法和用0x02做的乘法,而用0x02做的乘法是一個有條件的左移1比特位。AES規(guī)范中包括大量 有關GF(28)操作的附加信息。</p><p> 密鑰擴展 AES加密和解密算法使用了一個由種子密鑰字節(jié)數(shù)組生成的密鑰調(diào)度表。AES規(guī)范中稱之為密鑰擴展例程(KeyExpansion)。從本質(zhì)上講,從一個原始密鑰中生成多重密鑰以代替使用
19、單個密鑰大大增加了比特位的擴散。雖然不是無法抵御的困難,但理解 KeyExpansion 仍是 AES 算法中的一個難點。KeyExpansion 例程高級偽代碼如下所示: </p><p> KeyExpansion(byte[] key, byte[][4] w)</p><p><b> {</b></p><p> copy th
20、e seed key into the first rows of w</p><p> for each remaining row of w</p><p><b> {</b></p><p> use two of the previous rows to create a new row</p><p>
21、<b> }</b></p><p><b> }</b></p><p> “用前面兩行來產(chǎn)生一個新行”(“use two of the previous rows to create a new row”)的例程用到了兩個子 例程,RotWord 和 SubWord 以及一個名為“Rcon”的常數(shù)表(作為“輪常數(shù)”)。讓我們先來逐個看一
22、下這三東西,然后再回到整個 KeyExpansion 的討論中來?! otWord 例程很簡單。它接受一個4個字節(jié)的數(shù)組并將它們向左旋轉(zhuǎn)一個位置。因為輪調(diào)度表 w[] 有四列,RotWord 將 w[]的1行左旋。注意 KeyExpansion 使用的這個 RotWord 函數(shù)與加密算法使用的 ShiftRows (行位移變換)例程非常相似,只是它 處理的是單行密鑰調(diào)度 w[],而不是整個加密狀態(tài)表 State[]?! ubWo
23、rd 例程使用替換表 Sbox 對一給定的一行密鑰調(diào)度表 w[] 進行逐字節(jié)替換。KeyExpansion 操作中的替換實際上就像在加密算法中的 替換一樣。被代替的輸入字節(jié)被分成 (x,y) 對,它被當作進入替換表 Sbox 的索引。舉例來說,0x27的代替結(jié)果是 x=2 和 y=7,并且 Sb</p><p> for (row = Nk; row < (4 * Nr+1); ++row)</p&
24、gt;<p><b> {</b></p><p> temp = w[row-1]</p><p> if (row % Nk == 0) </p><p> temp = SubWord(RotWord(temp)) xor Rcon[row/Nk]</p><p> else if (Nk
25、== 8 and row % Nk == 4)</p><p> temp = SubWord(temp)</p><p> w[row] = w[row-Nk] xor temp</p><p><b> }</b></p><p> 先不要去看if子句,你將看到密鑰調(diào)度表 w[] 的每一行都是前面一行與行 N
26、k 異或的結(jié)果(4, 6, 或 8 取決于密鑰的長度)。if條件的第一部分用 SubWord、RotWord 以及與輪常數(shù)的異或修改密鑰調(diào)度表的每個第4、第6或第8行,取決于是否密鑰的長度是128、192或256位。這個條件的第二部分將修改行 12、20 和 28 等等——對于256位密鑰而言——每 一個第8行都將添加密鑰調(diào)度額外的可變性?! ∽屛覀冇帽疚拈_頭所舉的例子來考察 KeyExpansion 是如何開始的。種子密鑰是192-
27、bit / 6-word 值: </p><p> 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 </p><p> 密鑰調(diào)度字節(jié)表 w[] 的維數(shù)是 4 列并且 Nb × (Nr + 1) 等于 4 × (12 + 1),或 52 行。KeyExpansion
28、 將種子密鑰的值拷貝到密鑰調(diào)度字節(jié)表 w[] 的第一行。因為我的種子密鑰是 192 位(24字節(jié)),并且 w[] 表總是 4 列,在這種情況下KeyExapansion 將種子密鑰拷貝到 w[] 的前面 6 行?,F(xiàn)在讓我們看看 KeyExapansion 例程是如何填充密鑰調(diào)度表其余部分的。在我的例子里,第一個被計算的行是第 6 行 ,因為第0-5行已被種子密鑰的值填上了: </p><p> temp = w
29、[row-1] = 14 15 16 17</p><p> 條件 (row % Nk == 0)為真,因此首先 RotWord 子程序被應用:</p><p> temp = 15 16 17 14</p><p> 這時 SubWord 被應用: </p><p> temp = 59 47 f0 fa</p>&l
30、t;p> 用 Rcon[row / Nk] = Rcon[6 / 6] = 01 00 00 00 進行異或: </p><p> temp = 58 47 f0 fa</p><p> 這時用 w[row-Nk] = w[6-6] = 00 01 02 03 異或,產(chǎn)生了下面結(jié)果: </p><p> w[6] = 58 46 f2 f9</p
31、><p> 密鑰調(diào)度表 w[] 中其余所有行來重復這個過程本身。 總而言之,AES 加密和解密的一個重要部分就是從最初的種子密鑰中生成多重輪密鑰。這個 KeyExapansion 算法生成一個密鑰調(diào)度并 以某種方式進行替代和置換,在這種方式中,加密和解密算法極其相似。 </p><p> 用 C# 編寫 AES 類構造函數(shù) 現(xiàn)在我已研究了構成 AES 加密算法的各個成分,我將用 C
32、# 來實現(xiàn)它。官方的 AES 算法規(guī)范包含在聯(lián)邦信息處理標準出版物197 (Federal Information Processing Standards Publication 197)中。我決定盡可能貼切地以它作為我的實現(xiàn)的基礎,但是我很快發(fā)現(xiàn)這個規(guī)范更是一個理論文獻而非一個實現(xiàn)的向?qū)?。為了將這個官方規(guī)范作為資源來使用,我使用 的變量名與標準出版物中所用的相同。(即便它們是那么晦澀,如“Nr”和“W”)。我的設計使用9個數(shù)據(jù)成員
33、和一個枚舉類型,如下所示:</p><p> public enum KeySize { Bits128, Bits192, Bits256 };</p><p> private int Nb; </p><p> private int Nk; </p><p> private int Nr; </p><p
34、> private byte[] key; </p><p> private byte[,] Sbox; </p><p> private byte[,] iSbox; </p><p> private byte[,] w; </p><p> private byte[,] Rcon; </p><
35、p> private byte[,] State;</p><p> 因為密鑰長度只能是128位、192位或256位比特,它是非常適于用枚舉類型:</p><p> public enum KeySize { Bits128, Bits192, Bits256 };</p><p> 該規(guī)范文檔一般用字節(jié)作為基本儲存單元而不是用4字節(jié)的字作為兩個重要數(shù)
36、據(jù)成員的長度。這兩個成員 Nb 和 Nk 代表 以字為單位的塊長以及以字為單位的密鑰長度。Nr代表輪數(shù)。塊長度總是16字節(jié)(或這說是 128 位,即為 AES 的 4個字),因此它可以被聲明為一個常量。密鑰長度 依照枚舉參數(shù) KeySize 的值被賦值為 4、6 或 8。AES 算法強調(diào)通過大量輪數(shù)來增加加密數(shù)據(jù)的復雜性。輪數(shù)是10、12或14中的任意一個并且是基于密碼分析學理論的。它直接取決于密鑰長度?! ‘斣O計一個類接口時,我喜歡
37、向后來做。我設想從應用程序中調(diào)用構造函數(shù)和方法。使用這個辦法,我決定象下面這樣來實例化一個 AES 對象:</p><p> Aes a = new Aes(the key size, the seed key)</p><p> 我調(diào)用的加密和解密例程如下:</p><p> a.Cipher(plainText, cipherText);</p>
38、;<p> a.InvCipher(cipherText, decipheredText);</p><p> 我選擇少許笨拙的方法來命名 Cipher 和 InvCipher,因為它們是用在 AES 規(guī)范文檔中的。這里是 AES 類構造函數(shù)的代碼為:</p><p> public Aes(KeySize keySize, byte[] keyBytes)</p
39、><p><b> {</b></p><p> SetNbNkNr(keySize);</p><p> this.key = new byte[this.Nk * 4]; </p><p> keyBytes.CopyTo(this.key, 0);</p><p> BuildSbo
40、x();</p><p> BuildInvSbox();</p><p> BuildRcon();</p><p> KeyExpansion(); </p><p><b> } </b></p><p> 該構造函數(shù)首先調(diào)用一個輔助方法 SetNbNkNr 給 Nb、Nk 和
41、Nr 賦值,如 Figure 8 所示。如果考慮到效率,你可能將這些代碼直接放入構造函數(shù) 以避免方法調(diào)用的開銷?! 〗酉聛恚惚仨殞魅霕嬙旌瘮?shù)的字節(jié)拷貝到類域變量中。密鑰用其它的類域聲明,并且用如下方法獲得它的值: </p><p> this.key = new byte[this.Nk * 4]; </p><p> keyBytes.CopyTo(this.key, 0);&
42、lt;/p><p> 我決定在構造函數(shù)中調(diào)用私有輔助方法 BuildSbox 和 BuildInvSbox 來初始化替換表 Sbox[] 和 iSbox[] 。現(xiàn)在密鑰擴展例程 、Cipher 方法和 InvCipher 方法各自都需要 Sbox[] 和 iSbox[],因此我本來可以在 Cipher 和 InvCipher 兩個方法中初始化 Sbox[] 并調(diào)用 KeyExpansion 方法,但是將它們放入構造
43、函數(shù)會代碼結(jié)構更加清晰。在 Figure 9 中 sBox[] 被填充。填充 iSbox[] 代碼 類似。為了可讀性對代碼進行了結(jié)構化處理。正如后面你將看到的,還有另外一個可供選擇的令人驚訝的方法為 Sbox 和 iSbox 表提供值?! ≡跇嬙旌瘮?shù)中聲明密鑰調(diào)度表 w[]、輪常數(shù)表 Rcon[] 和狀態(tài)矩陣 State[],并用私有輔助方法來給 Rcon[] 和 w[] 賦值在我看來似乎是組織它們的最好辦法,但那主要還是個風格問題。
44、置換輪常數(shù)表 Rcon 的賦值代碼參見 Figure 7?;叵胍幌?,GF(28)中,Rcon[] 每一行左邊的字節(jié)都 2 的冪,因此這個表可用下面的方法建立:</p><p> newVal = prevVal * 0x02;</p><p> AES 構造函數(shù)在建立完密鑰調(diào)度表 w[] 后結(jié)束,而 w[] 是在 KeyExpansion 方法中完成的(參見 Figure 10)。
45、其代碼相當簡單。規(guī)范文檔使用一個假設的 4-字節(jié)的字數(shù)據(jù)類型。因為 C# 沒有那樣的類型,但可以用一個4個字節(jié)的數(shù)組來模擬。在用 new 操作符為密鑰調(diào)度 表 w[] 分配空間后,w[] 最初的 Nk(4, 6, 或 8) 行從被傳遞到構造函數(shù)的種子密鑰 key[] 數(shù)組中獲值。</p><p> this.w[row,0] = this.key[4*row];</p><p> th
46、is.w[row,1] = this.key[4*row+1];</p><p> this.w[row,2] = this.key[4*row+2];</p><p> this.w[row,3] = this.key[4*row+3];</p><p> 兩個字節(jié)相互的異或操作在這個代碼中頻頻發(fā)生。它需要一些從 byte 到 int 的強制類型轉(zhuǎn)換并轉(zhuǎn)回到
47、 byte,因為異或操作“^”是不能定義在 C# 的 byte 類型上,例如:</p><p> temp[0] = (byte)( (int)temp[0] ^ (int)this.Rcon[row/Nk,0] );</p><p><b> 用來替代:</b></p><p> temp[0] = temp[0] ^ this.Rco
48、n[row/Nk,0];</p><p> KeyExpansion 方法有條件地調(diào)用私有方法 SubWord 和 RotWord 以保持同規(guī)范命名的一致性。此外,因為在C#中沒有 word類型,我用 4字節(jié)數(shù)組實現(xiàn)了一個字。SubWord 和 RotWord 的代碼是相當簡單,參見本文附帶的 AesLib 源代碼,它應該很容易理解?! ∩晕⒕邆溆行┘记傻牟糠质窃?SubWord 中查找替代值。回想一下,為了
49、尋找代替值,你將輸入字節(jié)分成最左邊的4位比特和最右邊的4位比特。對于一個給定字節(jié),用 >> 操作符右移 4 位將得到 x 索引,并且與 0000 1111 進行邏輯與得到 y 值。雖然有些長,但比實際代碼更可讀,我可以象下面這樣:</p><p> int x = word[0] >> 4;</p><p> int y = word[0] & 0x0f
50、;</p><p> byte substitute = this.Sbox[x,y];</p><p> result[0] = substitute;</p><p> 代替我原來用的代碼:</p><p> result[0] = this.Sbox[ word[0] >> 4, word[0] & 0x0f
51、 ];</p><p> 總的來說,AES 構造函數(shù)接受一個密鑰的長度為128,192 或 256 位和一個字節(jié)數(shù)組種子密鑰值。構造函數(shù)為輸入塊長度,種子密鑰長度 以及加密算法的輪數(shù)賦值,并將種子密鑰拷貝到一個名為 key 的數(shù)據(jù)成員中。構造函數(shù)還創(chuàng)建了四個表:兩個由加密和解密方法使用的替換表,一個輪常數(shù)表,和一個輪密鑰的密鑰調(diào)度表。用C#編寫的 AES Cipher 方法 Cipher方法如 Figur
52、e 11 所示。它真的非常簡單,因為它分出了大部分的工作給私有方法AddRoundKey, SubBytes, ShiftRows 和 MixColumns?! ipher 方法以拷貝明文輸入數(shù)組到狀態(tài)矩陣 State[] 為開始。最初調(diào)用 AddRoundKey 之后,Cipher 方法比總輪數(shù)少迭代一次。在最后一輪時,正如規(guī)范中所說的那樣,MixColumns 調(diào)用被省略了?! ddRoundKey 和 SubBytes 私
53、有方法的代碼如 Figure 12 所示。AddRoundKey 方法需要知道它處在那一輪,以便它正確引用4行密鑰調(diào)度數(shù)組 w[]。請注意 State[r,c] 是用 w[</p><p> this.State[r, (c + r) % Nb ] = temp[r,c];</p><p> 這里利用%操作符的優(yōu)點抱合一行?! ixColumns 方法(Figure 14)用GF(
54、28)加和乘,以字節(jié)列中所有其它值的線性組合對每一個字節(jié)進行替換。乘法所用的常量系數(shù)基于域論的,并且是0x01, 0x02或 0x03中的任意一個值。給定某一列 c ,其替代式如下:</p><p> State[0,c] = 0x02 * State[0,c] +0x03 * State[1,c] +0x01 * State[2,c] +0x01 * State[3,c]</p><p&
55、gt; State[1,c] = 0x01 * State[0,c] +0x02 * State[1,c]+0x03 * State[2,c]+ 0x01 * State[3,c]</p><p> State[2,c] = 0x01 * State[0,c] + 0x01 * State[1,c] +0x02 * State[2,c] +0x03 * State[3,c]</p><p&
56、gt; State[3,c] = 0x03*State[0,c]+0x01 * State[1,c]+0x01*State[2,c]+0x02 * State[3,c]</p><p> 這些表達式稍微有些長,因此我決定編寫返回 GF(28)與 0x01,0x02 和 0x03 之乘積的私有輔助函數(shù)。這些輔助函數(shù)非常短。例如,一個字節(jié) b 被 0x03 域乘的代碼如下: </p><p&g
57、t; return (byte) ( (int)gfmultby02(b) ^ (int)b );</p><p> 正如我前面討論的,被 0x02 乘是所有 GF(28) 乘法的基本操作。我調(diào)用了我的 gfmultby02 方法,我改變了使用與規(guī)范相同的方法命名慣例,規(guī)范上稱此例程為 xtime。 Cipher 方法其輸入反復應用四個操作來產(chǎn)生加密的輸出。AddRoundKey 用源于單個原始種子密鑰的
58、多重輪密鑰來替代字節(jié)。SubBytes 用某個替換表中的值替代字節(jié)。ShiftRows 用移動字節(jié)行置換字節(jié),而 MixColumns 用某一列的域加和乘法值來替代字節(jié)。用C#編寫 AES InvCipher 方法 AES 解密算法背后的基本原則很簡單:解密一個加密塊,也就是以反向順序還原(Undo)每個操作。盡管這是基本概念,但仍有幾個細節(jié)要處理?! ES規(guī)范稱解密例程為 InvCipher,而不是 Decipher 或 D
59、ecrypt 中的一個。這是 AES 背后的數(shù)學基礎的反映,它基于可逆的數(shù)學操作。 如果你將這個代碼和 Cipher 代碼比較的話,你會看到它比你預期的漂亮很多,但是有兩點例外。首先,在 InvCipher 方法中逆方法調(diào)用(如 InvSubBytes)順序并不</p><p> State[0,c] = 0x0e * State[0,c] +0x0b * State[1,c] + 0x0d * State
60、[2,c] + 0x09 * State[3,c]</p><p> State[1,c] = 0x09 * State[0,c] +0x0e * State[1,c] +0x0b * State[2,c] +0x0d * State[3,c]</p><p> State[2,c] = 0x0d * State[0,c] +0x09 * State[1,c] +0x0e * Stat
61、e[2,c] +0x0b * State[3,c]</p><p> State[3,c] = 0x0b * State[0,c] +0x0d * State[1,c] +0x09 * State[2,c] +0x0e * State[3,c] </p><p> 對于 MixColumns 方法,我決定專門寫一個輔助函數(shù),而不是內(nèi)聯(lián)展開已經(jīng)較長的表達式或?qū)懸粋€普通的乘法輔助函數(shù)。讓我
62、向你展示一下我示如何編寫這個任何字節(jié) b 被常數(shù) 0x0e (在10進制中的14)乘的函數(shù),像任何數(shù)字一樣,數(shù)字 14 可以被表示成 2 的冪的和,因此,14 等于 2 + 4 + 8。并且 4 等于 2 的平方,8 等于 2 的立方,你可以將14表示為 2 + 22 + 23。記住加法就是 GF(28)中上的異或(^),既然我已經(jīng)有了 gfmultby02 函數(shù),我可以用它得到我的結(jié)果: </p><p>
63、return (byte)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ /* 23 + */</p><p> (int)gfmultby02(gfmultby02(b)) ^ /* 22 + */</p><p> (int)gfmultby02(b) ); /* 2 */</p><p> 用于 AES 加密
64、算法的所有的操作都是可逆的,因此解密算法本質(zhì)上是加密的所有操作的倒轉(zhuǎn)。使用 AES 類 用C#實現(xiàn) AES 的特色之一就簡單。看看 Figure 15,它是我用來生成輸出 Figure 1 的代碼。聲明了 16 字節(jié) 明文輸入硬代碼值和 24 字節(jié)(192位)的種子密鑰后,一個 AES 對象被初始化,加密 Cipher 方法 將明文加密成為密文,然后再用 InvCipher 將密文解密。非常清楚和簡單?! ∫驗?AES 對象針對
65、字節(jié)數(shù)組進行處理,你可以輕松地用它處理.NET的其它數(shù)據(jù)類型。我創(chuàng)建了一個基于 Windows 的小Demo程序,它接受一個 單純的字符串——有 8 個字符 (16-byte) ,對它進行加密和解密處理。運行畫面如 Figure 16。Figure 16 加密 Demo 程序因為加密和解密例程都需要知道用戶定義的密鑰長度,我把它當作一個類范圍的變量來聲明,像這樣: </p><p> private Ae
66、s.KeySize keysize;</p><p> 注意種子密鑰并不是由用戶定義的。這個 demo 程序用一個“空密鑰”(null key)作為種子密鑰,通過為構造函數(shù)提供一個啞參數(shù) new byte[16] 使得它全部由零字節(jié)組成。啞參數(shù)的長度是不相關的,因為種子密鑰還是要被初始化為零。空密鑰加密和解密是一個容易和有效的辦法來阻止外界對數(shù)據(jù)偶然的檢查。在 System.Text 中的 Encoding.U
67、nicode.GetBytes和Encoding.Unicode.GetString 方法使得將一個.NET 字符串轉(zhuǎn)換成一個字節(jié)數(shù)組變得非常容易,反之亦然。實現(xiàn)選擇 現(xiàn)在讓我們看看本文 AES 實現(xiàn)中出現(xiàn)的一些重要的變量,本文提供的代碼可能出現(xiàn)的擴展,以及針對 AES 的密碼分析學攻擊?! 『臀以?jīng)處理的任何代碼一樣,AES 算法也可以用其它可選的途徑來實現(xiàn)。為什么這很重要呢?AES 被試圖廣泛應用于各種系統(tǒng),從只有很少內(nèi)存容
68、量的智能卡(smart cards)到大型的多處理器主機系統(tǒng)。在許多情況下,性能是關鍵因素,并且有時內(nèi)存或處理器資源是有限的。事實上,AES 的每個例程都能針對非常昂貴的內(nèi)存資源進行性能優(yōu)化,反之亦然。</p><p> Encrypt It::Keep Your Data Secure with the New Advanced Encryption Standard</p><p>
69、 James McCaffrey</p><p><b> SUMMARY</b></p><p> The Advanced Encryption Standard (AES) is a National Institute of Standards and Technology specification for the encryption of elec
70、tronic data. It is expected to become the accepted means of encrypting digital information, including financial, telecommunications, and government data. This article presents an overview of AES and explains the algorith
71、ms it uses. Included is a complete C# implementation and examples of encrypting .NET data. After reading this article you will be able to encrypt dat</p><p> The National Institute of Standards and Technolo
72、gy (NIST) established the new Advanced Encryption Standard (AES) specification on May 26, 2002. In this article I will provide a working implementation of AES written in C#, and a complete explanation of exactly what AES
73、 is and how the code works. I'll show you how to encrypt data using AES and extend the code given here to develop a commercial-quality AES class. I'll also explain how and why to incorporate AES encryption into y
74、our software systems</p><p> Note that the code presented in this article and any other implementation based on this article is subject to applicable Federal cryptographic module export controls (see Commer
75、cial Encryption Export Controls for the exact regulations).</p><p> AES is a new cryptographic algorithm that can be used to protect electronic data. Specifically, AES is an iterative, symmetric-key block c
76、ipher that can use keys of 128, 192, and 256 bits, and encrypts and decrypts data in blocks of 128 bits (16 bytes). Unlike public-key ciphers, which use a pair of keys, symmetric-key ciphers use the same key to encrypt a
77、nd decrypt data. Encrypted data returned by block ciphers have the same number of bits that the input data had. Iterative ciphers use a loop s</p><p> 192-bit key.</p><p> Figure 1 Some Data&l
78、t;/p><p> AES is the successor to the older Data Encryption Standard (DES). DES was approved as a Federal standard in 1977 and remained viable until 1998 when a combination of advances in hardware, software, a
79、nd cryptanalysis theory allowed a DES-encrypted message to be decrypted in 56 hours. Since that time numerous other successful attacks on DES-encrypted data have been made and DES is now considered past its useful lifeti
80、me.</p><p> In late 1999, the Rijndael (pronounced "rain doll") algorithm, created by researchers Joan Daemen and Vincent Rijmen, was selected by the NIST as the proposal that best met the design
81、criteria of security, implementation efficiency, versatility, and simplicity. Although the terms AES and Rijndael are sometimes used interchangeably, they are distinct. AES is widely expected to become the de facto stand
82、ard for encrypting all forms of electronic data including data used in commercial applications s</p><p> Overview of the AES Algorithm</p><p> The AES algorithm is based on permutations and su
83、bstitutions. Permutations are rearrangements of data, and substitutions replace one unit of data with another. AES performs permutations and substitutions using several different techniques. To illustrate these technique
84、s, let's walk through a concrete example of AES encryption using the data shown in Figure 1.</p><p> The following is the 128-bit value that you will encrypt with the indexes array:00 11 22 33 44 55 66
85、77 88 99 aa bb cc dd ee ff</p><p> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</p><p> The 192-bit key value is:</p><p> 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
86、 12 13 14 15 16 17</p><p> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23</p><p> Figure 2 Sbox</p><p> When the AES constructor is called, two tables th
87、at will be used by the encryption method are initialized. The first table is a substitution box named Sbox. It is a 16 × 16 matrix. The first five rows and columns of Sbox are shown in Figure 2. Behind the scenes, t
88、he encryption routine takes the key array and uses it to generate a "key schedule" table named w[], shown in Figure 3.</p><p> Figure 3 Key Sched.</p><p> The first Nk (6) rows of w[
89、] are seeded with the original key value (0x00 through 0x17) and the remaining rows are generated from the seed key. The variable Nk represents the size of the seed key in 32-bit words. You'll see exactly how w[] is
90、generated later when I examine the AES implementation. The point is that there are now many keys to use instead of just one. These new keys are called the round keys to distinguish them from the original seed key.</p&
91、gt;<p> Figure 4 State</p><p> The AES encryption routine begins by copying the 16-byte input array into a 4×4 byte matrix named State (see Figure 4). The AES encryption algorithm is named Ciph
92、er and operates on State[] and can be described in pseudocode (see Figure 5).</p><p> The encryption algorithm performs a preliminary processing step that's called AddRoundKey in the specification. AddR
93、oundKey performs a byte-by-byte XOR operation on the State matrix using the first four rows of the key schedule, and XORs input State[r,c] with round keys table w[c,r].</p><p> For example, if the first row
94、 of the State matrix holds the bytes { 00, 44, 88, cc }, and the first column of the key schedule is { 00, 04, 08, 0c }, then the new value of State[0,2] is the result of XORing State[0,2] (0x88) with w[2,0] (0x08), or 0
95、x80:</p><p> 1 0 0 0 1 0 0 0</p><p> 0 0 0 0 1 0 0 0 XOR</p><p> 1 0 0 0 0 0 0 0</p><p> The main loop of the AES encryption algorithm performs four different oper
96、ations on the State matrix, called SubBytes, ShiftRows, MixColumns, and AddRoundKey in the specification. The AddRoundKey operation is the same as the preliminary AddRoundKey except that each time AddRoundKey is called,
97、the next four rows of the key schedule are used. The SubBytes routine is a substitution operation that takes each byte in the State matrix and substitutes a new byte determined by the Sbox table. For exampl</p>&l
98、t;p> ShiftRows is a permutation operation that rotates bytes in the State matrix to the left. Figure 6 shows how ShiftRows works on State[]. Row 0 of State is rotated 0 positions to the left, row 1 is rotated 1 posit
99、ion left, row 2 is rotated 2 positions left, and row 3 is rotated 3 positions left.</p><p> Figure 6 Running ShiftRows on State</p><p> The MixColumns operation is a substitution operation tha
100、t is the trickiest part of the AES algorithm to understand. It replaces each byte with the result of mathematical field additions and multiplications of values in the byte's column. I will explain the details of spec
101、ial field addition and multiplication in the next section.</p><p> Suppose the value at State[0,1] is 0x09, and the other values in column 1 are 0x60, 0xe1, and 0x04; then the new value for State[0,1] is sh
102、own in the following:</p><p> State[0,1] = (State[0,1] * 0x01) + (State[1,1] * 0x02) +(State[2,1] * 0x03) +(State[3,1] * 0x01) = (0x09 * 0x01) + (0x60 * 0x02) + (0xe1 * 0x03) +(0x04 * 0x01)</p><p
103、><b> = 0x57</b></p><p> The addition and multiplication are special mathematical field operations, not the usual addition and multiplication on integers.</p><p> The four opera
104、tions SubBytes, ShiftRows, MixColumns, and AddRoundKey are called inside a loop that executes Nr times—the number of rounds for a given key size, less 1. The number of rounds that the encryption algorithm uses is either
105、10, 12, or 14 and depends on whether the seed key size is 128, 192, or 256 bits. In this example, because Nr equals 12, the four operations are called 11 times. After this iteration completes, the encryption algorithm fi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高級加密標準AES的實現(xiàn)研究.pdf
- 基于高級加密標準AES的流媒體加密系統(tǒng)的實現(xiàn).pdf
- 高級數(shù)據(jù)加密標準AES的代數(shù)性質(zhì)研究.pdf
- 高級加密標準(AES)在IPSec協(xié)議中的應用.pdf
- 高級加密標準AES中若干問題的研究.pdf
- 數(shù)據(jù)加密標準外文翻譯
- aes加密
- 高級數(shù)據(jù)加密標準AES的Java實現(xiàn)與應用研究.pdf
- 高級加密標準(AES)算法——Rijndael的研究及FPGA上的實現(xiàn).pdf
- 基于先進加密標準(AES)算法的加密芯片設計.pdf
- 基于高級數(shù)據(jù)加密標準AES的數(shù)據(jù)庫加密技術研究與實現(xiàn).pdf
- 高級加密標準的分析.pdf
- aes課程設計報告--aes加密解密的實現(xiàn)
- 數(shù)據(jù)加密外文翻譯
- 高級加密標準研究及其FPGA設計.pdf
- 基于高級加密標準的分組加密模塊的研究與實現(xiàn).pdf
- 高級加密標準攻擊方法的性能分析.pdf
- AES加密算法的FPGA實現(xiàn).pdf
- AES加密IP軟核的研制.pdf
- 基于FPGA的AES加密系統(tǒng)設計.pdf
評論
0/150
提交評論