程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用新的高級加密標准(AES)保持你的數據安全(7)

用新的高級加密標准(AES)保持你的數據安全(7)

編輯:關於C語言

用C#編寫 AES InvCipher 方法

AES 解密算法背後的基本原則很簡單:解密一個加密塊,也就是以反向順序還原(Undo)每個操作。盡管這是基本概念,但仍有幾個細節要處理。

AES規范稱解密例程為InvCipher,而不是 Decipher 或 Decrypt中的一個。這是 AES 背後的數學基礎的反映,它基於可逆的數學操作。

如果你將這個代碼和 Cipher 代碼比較的話,你會看到它比你預期的漂亮很多,但是有兩點例外。首先,在InvCipher 方法中逆方法調用(如 InvSubBytes)順序並不完全與在Cipher 方法中相應調用(如 SubBytes)的逆向順序正好相同。其次,InvCipher 調用的是一個 AddRoundKey 方法而不是 InvAddRoundKey 方法。值得注意的是 InvCipher 算法用密鑰調度表並不是從較高編號的索引處開始向下處理至第0行。

InvSubBytes,InvShiftRows和InvMixColumns 方法的代碼和與之有關的 SubBytes,ShiftRows和 MixColumns 方法的代碼非常接近。InvSubBytes 方法幾乎就是 SubBytes 方法,只是它用逆替換表 iSbox[] 而不是 Sbox[] 表。

正如你可能猜測到的,iSbox[] 就是還原任何被 Sbox[] 處理的對應操作。比如,如果你有字節 b 等於0x20,並在Sbox[]中找到其代替值,你得到 0xb7。如果你在iSbox[]中找到 0xb7的替代值,你便可得到 0x20。

相似地,InvShiftRows 方法還原 ShiftRows 方法—— row[0] 被右移了 0 個位置,row[1] 被右移了 1個位置,row[2] 被右移了 2 個位置,而 row[3] 被右移了 3個位置。

InvMixColumns 方法還原 MixColumns的工作,但沒有用顯而易見的方法。回想一下,MixColumns 用原始字節列中的字節線性組合替換狀態矩陣中的每個字節,並且系數是 0x01,0x02,和 0x03,域論再一次得到應用。它證明逆運算是相似的,只是被 0x09,0x0b,0x0d和0x0e 乘,如下所示:


State[0,c] = 0x0e * State[0,c] +
    0x0b * State[1,c] +
    0x0d * State[2,c] +
       0x09 * State[3,c]
State[1,c] = 0x09 * State[0,c] +
       0x0e * State[1,c] +
       0x0b * State[2,c] +
       0x0d * State[3,c]
State[2,c] = 0x0d * State[0,c] +
       0x09 * State[1,c] +
       0x0e * State[2,c] +
       0x0b * State[3,c]
State[3,c] = 0x0b * State[0,c] +
       0x0d * State[1,c] +
       0x09 * State[2,c] +
       0x0e * State[3,c]

對於MixColumns 方法,我決定專門寫一個輔助函數,而不是內聯展開已經較長的表達式或寫一個普通的乘法輔助函數。讓我向你展示一下我示如何編寫這個任何字節 b 被常數 0x0e (在10進制中的14)乘的函數,像任何數字一樣,數字 14 可以被表示成 2的冪的和,因此,14 等於2 + 4 + 8。並且 4 等於2的平方,8 等於2的立方,你可以將14表示為2 + 22 + 23。記住加法就是 GF(28)中上的異或(^),既然我已經有了 gfmultby02 函數,我可以用它得到我的結果:

return (byte)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ /* 23 + */
(int)gfmultby02(gfmultby02(b)) ^ /* 22 + */
(int)gfmultby02(b) ); /* 2 */

用於AES 加密算法的所有的操作都是可逆的,因此解密算法本質上是加密的所有操作的倒轉。

使用 AES 類

用C#實現 AES的特色之一就簡單。看看 Figure 15,它是我用來生成輸出 Figure 1的代碼。聲明了 16 字節 明文輸入硬代碼值和 24 字節(192位)的種子密鑰後,一個 AES 對象被初始化,加密 Cipher 方法 將明文加密成為密文,然後再用 InvCipher 將密文解密。非常清楚和簡單。

因為AES 對象針對字節數組進行處理,你可以輕松地用它處理.Net的其它數據類型。我創建了一個基於Windows的小Demo程序,它接受一個 單純的字符串——有 8 個字符 (16-byte) ,對它進行加密和解密處理。運行畫面如 Figure 16。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved