1、加密它:用新的高级加密标准( AES)保持你的数据安全 James McCaffrey 摘要 AES( The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。本文展示了 AES 的概貌并解析了它使用的算法。包括一个完整的 C#实现和加密 .NET 数据的举例。在读完本文后你将能用 AES 加密、测试 基于 AES 的软件并能在你的系统中使用 AES 加密。 美国国家标准与技术研究所 (NIST)在 2002年 5月 26日建立了新的高级数据加密标准 (AES)规范。本文
2、中我将提供一个用 C#编写的的能运行的 AES 实现,并详细解释到底什么是 AES 以及编码是如何工作的。我将向您展示如何用 AES 加密数据并扩展本文给出的代码来开发一个商业级质量的 AES 类。我 还将解释怎样把 AES 结合到你的软件系统中去和为什么要这么做,以及如何测试基于 AES 的软件。 AES 是一个新的可以用于保护电子数据的加密算法。明确地说, AES 是一个迭代的、对称密钥分组的密码,它可以使用 128、 192 和 256 位 密钥,并且用 128 位( 16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的
3、加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换( permutations )和替换 (substitutions)输入数据。 Figure 1 显示了 AES 用192位密钥对一个 16位字节数据块进行加密和解密的情形。 AES 算法概述 AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。 AES 使用了几种不同的技术来实现置换和替换。为了阐明这些技术,让我们用 Figure 1 所示的数据讨论一个具体的 AES 加密例子。下面是你要加密的 128位值以及它们对应的索引数组: 00 11 22 33 44 55 66 77
4、88 99 aa bb cc dd ee ff 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 192位密钥的值是: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23 Figure 2 S-盒( Sbox ) 当 AES 的构造函数( constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为 S-盒。它是一个 1616的矩阵。
5、 S-盒的前五行和前五列如 Figure 2 所示。在幕后,加密例程获取该密钥数组并用它来生成一个名为 w的密钥调度表, Figure 3 所示。 Figure 3 密钥调度表( Key Sched) w 最初的 Nk (6) 行被作为种子,用原始密钥值( 0x00 到 0x17)。剩余行从种子密钥来产生。变量 Nk 代表以 32 位字为单位的种子密钥长度。稍后我分析 AES 实现时你将清楚地看到 w 是怎样产生的。 关键是这里现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥( round keys)以将它们与原始种子密钥区别开来。 Figure 4 State (态)数组 AES 加
6、密例程开始是拷贝 16 字节的输入数组到一个名为 State (态)的 44 字节矩阵中。(参见 Figure 4)。 AES 加密算法 取名为 Cipher,它操作 State,其过程描述的伪代码参见 Figure 5 。 在规范中,加密算法实现的一个预备的处理步骤被称为 AddRoundKey(轮密钥加)。 AddRoundKey 用密钥调度表中的前四行对 State 矩阵实行一个字节一个字节的异或( XOR)操作,并用轮密钥表 wc,r 异或 输入 Stater,c。 举个例子,如果 State 矩阵的第一行保存的字节是 00, 44, 88, cc ,第一列密钥调度表是 00, 04,
7、 08, 0c ,那么新的 State0,2 值是用 w2,0( 0x08 或 0x80 )异或 State0,2(0x88)的结果: 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 XOR 1 0 0 0 0 0 0 0 AES 算法的主循环对 State 矩阵执行四个不同的操作,在规范中被称为 SubBytes(字节替换)、 ShiftRows(行位移变换)、 MixColumns(列混合变换) 和 AddRoundKey。除了每次循环 AddRoundKey 都被调用并使用密钥调度表的下面四行外, AddRoundKey 与预备处理步骤中的 AddRoundKey 相同。SubBytes 例程是一个代替操作,它将 State 矩阵中的每个字节替换成一个由 Sbox 决定的新字节。比如,如果 State0,1的值是 0x40 如果你想找到它的代替者,你取 State0,1 的值 (0x40) 并让 x 等于左边的数字 (4)并让 y 等于右边的数字 (0)。然后你用 x 和 y 作为索引 进到 Sbox 表中寻找代替值,如 Figure 2 所示。 ShiftRows 是一个置换操作,它将 State 矩阵中的字节 向左旋转。 Figure 6 示范了 ShiftRows 如何操作 State。 State 的第 0行被向左旋转 0个位置, State