AES高级加密标准

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10001000 0 0 0 0 1 0 0 0 XOR
10000000
AES 加密算法的主循环针对 State 矩阵执行四种不同的运算,在规范中,这些运算的名称分别为 SubBytes、ShiftRows、MixColumns 和 AddRoundKey。AddRoundKey 运算与先前的 AddRoundKey 基本相同,唯一的区别在于当 AddRoundKey 每次被调用时,会使用密钥次序表 的下四行。SubBytes 例程是置换操作,它提取 State 矩阵中的每个字节,并置换由 Sbox 表确 定的新字节。例如,如果 State[0,1] 的值为 0x40,而且您希望查找它的置换值,则可以在 State[0,1] (0x40) 获取值,并让 x 等于 left digit (4),让 y 等于 right digit (0)。然后将 x 和 y 用作 Sbox 表的索引,以查找置换值,如图 2 所示。
正如您已经看到的那样,除了 MixColumns 例程以外,AES 加密算法使用相当简单的置换和排列 方法。MixColumns 例程使用特殊的加法和乘法。由 AES 使用的加法和乘法基于数学域理论。特 别是,AES 基于名为 GF(28) 的域。
GF(28) 域包括一组从 0x00 到 0xff(共 256 个)的值以及加法和乘法,因而得出 (28)。GF 代 表伽罗华域,它以创建域理论的数学家命名。GF(28) 有一个特征就是,加法或乘法运算的结果必须 位于集合 {0x00 ...0xff} 中。尽管域理论相当深奥,但是 GF(28) 加法的最终结果非常简单:GF(28) 加法只是 XOR 运算。
AES 算法概述
AES 算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。 AES 使用几种不同的方法来执行排列和置换运算。为了说明这些方法,让我们演示一个具体的示例, 该示例使用图 1 中显示的数据执行 AES 加密。
将使用索引数组对下面的 128 位值进行加密:
图 1 某个数据
AES 是旧式数据加密标准 (DES) 的后续标准。DES 于 1977 年被批准为联邦标准,它在 1998 年之前一直是可行的,从那时起,硬件、软件和密码分析学理论的组合发展允许将用 DES 加密的消 息在 56 小时内解密。在那以后,已经针对用 DES 加密的数据成功进行了许多其他攻击,现在, DES 已过了其有用的生存期。
发布日期 : 12/6/2004 | 更新日期 : 12/6/2004
James McCaffrey
本文假设您熟悉 C# 和位操作。
下载本文的代码: AES.exe (143KB)
摘要
高级加密标准 (AES) 是美国标准与技术研究院针对电子数据的加密所制定的规范,它将要成为公认 的数字信息(包括财务数据、电信数据和政府数据)加密方法。本文概述了 AES 并解释了它所使用 的算法。本文还包括一个完整的 C# 实现以及 .NET 数据加密的示例。在阅读完本文后,您将能够 使用 AES 对数据进行加密,测试基于 AES 的软件,并在自己的系统中使用 AES 加密方法。
图2
图3
图4 图 4 StateAES 加密例程首先将 16 字节的输入数组复制到名为 State 的 4×4 字节矩阵中 (请参阅图 4)。该 AES 加密算法名为 Cipher 并针对 State[] 执行运算,可在伪代码(请参阅 图 5)中描述。 加密算法执行预处理步骤(在规范中称为 AddRoundKey)。AddRoundKey 使用密钥次序表的前 四行针对 State 矩阵执行逐字节 XOR 运算,并使用轮回密钥表 w[c,r] 针对 input State[r,c] 执行 XOR 运算。 例如,如果 State 矩阵的第一行存放字节 { 00, 44, 88, cc },密钥次序表的第一列是 { 00, 04, 08, 0c },则 State[0,2] 的新值是将 State[0,2] (0x88) 与 w[2,0] (0x08) 执行 XOR 运算 的结果,即 0x80:
= (0x09 * 0x01) + (0x60 * 0x02) + (0xe1 * 0x03) + (0x04 * 0x01)
= 0x57
加法和乘法是特殊的数学域运算,而不是通常的整数加法和乘法。
在一个执行 Nr 次的循环中调用四个运算(SubBytes、ShiftRows、MixColumns 和 AddRoundKey),Nr 等于给定密钥大小的循环次数减去 1。加密算法使用的循环次数是 10、12 或 14,具体值取决于种子密钥的大小是 128、192 还是 256 位。在本例中,因为 Nr 等于 12, 所以这四个运算被调用 11 次。在该迭代运算完成之后,加密算法在将 State 矩阵复制到输出参数 之前,最终调用 SubBytes、ShiftRows 和 AddRoundKey。
AES 加密算法总共有四个核心运算。AddRoundKey 使用从种子密钥值生成的轮回密钥来替换 4 个字节的组。SubBytes 使用置换表来替换单个字节。ShiftRows 通过旋转 4-字节行来对 4 个字 节的组进行排列。MixColumns 使用域的加法和乘法组合来置换字节。
返回页首
GF(28) 中的域加法和乘法
加密和解密算法中 AES MixColumns 例程所需的其他乘法遵循同样的一般模式,如下所示:
b * 0x09 = b * (0x08 + 0x01)
= (b * 0x02 * 0x02 * 0x02) + (b * 0x01)
ShiftRows 是排列运算,它将 State 矩阵中的字节向左旋转位移。图 6 显示了 ShiftRows 如何 作用于 State[]。State 的行 0 向左旋转位移 0 个位置,行 1 向左旋转位移 1 个位置,行 2 向 左旋转位移 2 个位置,行 3 向左旋转位移 3 个位置。
图6
图 6 针对 State 运行 ShiftRowsMixColumns 运算是置换运算,它是 AES 算法最难懂的部分。 它将每个字节替换为字节列中值的数学域加法和乘法的结果。我将在下一节中详细解释特殊域的加法 和乘法。
图 2 Sbox 在 AES 构造函数被调用时,会初始化加密方法将使用的两个表。第一个表是名为 Sbox 的置换盒。它是一个 16 × 16 矩阵。图 2 显示了 Sbox 的前五行和前五列。在幕后,加密例程 提取密钥数组,并使用它来生成图 3 中所示的名为 w[] 的“密钥次序表”。
图 3 密钥次序表在 w[] 中,前 Nk (6) 行基于初始密钥值(0x00 到 0x17),其余各行是从种 子密钥生成的。变量 Nk 用 32 位字来表示种子密钥的大小。在我以后介绍 AES 实现时,您将确 切了解 w[] 的生成方式。要点在于,现在可以使用许多密钥,而不是只使用一个密钥。这些新密钥 被称作轮回密钥,以便将它们与初始的种子密钥区分开。
请注意,本文中提供的代码以及基于本文的任何其他实现都受制于适用的联邦加密模块出口控制(有 关确切的规章,请参阅 Commercial Encryption Export Controls)。
AES 是一种可用来保护电子数据的新型加密算法。特别是,AES 是可以使用 128、192 和 256 位 密钥的迭代式对称密钥块密码,并且可以对 128 位(16 个字节)的数据块进行加密和解密。与使 用密钥对的公钥密码不同的是,对称密钥密码使用同一个密钥来对数据进行加密和解密。由块密码返 回的加密数据与输入数据具有相同的位数。迭代式密码使用循环结构来针对输入数据反复执行排列和 置换运算。图 1 显示了操作中的 AES,它使用 192 位密钥对 16 个字节的数据块先后进行加密 和解密。
因为您知道如何与 0x02 和 0x01 相乘以及如何执行加法,所以上述运算可以完成。同样,要将任 意字节 b 与 0x0d 相乘,则可以执行以下运算:
b * 0x0d = b * (0x08 + 0x04 + 0x01) = (b * 0x08) + (b * 0x04) + (b * 0x01) = (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x01)
一旦建立了与 GF(28) 中的 0x02 的加法和乘法,就可以使用它们来定义与任何常数的乘法。要与 GF(28) 中的 0x03 相乘,可以将 0x03 分解为 2 的幂和加法。要将任意字节 b 与 0x03 相乘, 会看到 0x03 = 0x02 + 0x01。因此:
b * 0x03 = b * (0x02 + 0x01) = (b * 0x02) + (b * 0x01)
在 1999 年下半年,由研究员 Joan Daemen 和 Vincent Rijmen 创建的 Rijndael(读为“rain doll”)算法被 NIST 选作最符合安全性、实现效率、多功能性和简单性等设计准则的提议。尽管 AES 和 Rijndael 这两个术语有时会互换使用,但它们截然不同。AES 正日益成为加密各种形式的电子 数据的实际标准,这些数据包括用于商业应用程序(如银行和金融交易、电信以及私有和联邦信息) 中的数据。
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
192Biblioteka Baidu位密钥值是:
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 11 12 13 14 15 16 17 18 19 20 21 22 23
本页内容
AES 算法概述 GF(28) 中的域加法和乘法 密钥扩展 C# 中的 AES 类构造函数 C# 中的 AES Cipher 方法 C# 中的 AES InvCipher 方法 使用 AES 类 实现替换方法 小结
美国标准与技术研究院 (NIST) 于 2002 年 5 月 26 日制定了新的高级加密标准 (AES) 规范。 在本文中,我将提供用 C# 编写的 AES 的工作实现,并将完整解释到底什么是 AES 以及代码如 何工作。我将向您展示如何使用 AES 来加密数据,并扩展此处给出的代码以开发商用质量的 AES 类。我还将解释如何以及为何将 AES 加密合并到软件系统中,以及如何测试基于 AES 的软件。
假设 State[0,1] 的值是 0x09,列 1 中的其他值是 0x60、0xe1 和 0x04,那么,State[0,1] 的新值将按如下方式显示:
State[0,1] = (State[0,1] * 0x01) + (State[1,1] * 0x02) + (State[2,1] * 0x03) + (State[3,1] * 0x01)
但是,GF(28) 中的乘法却比较复杂。正如您将在后来的 C# 实现中看到的那样,AES 加密和解密 例程需要知道如何乘以仅有的七个常数 0x01、0x02、0x03、0x09、0x0b、0x0d 和 0x0e。因 此,我不会泛泛地介绍 GF(28) 乘法理论,而是只针对这七种特殊情况对其进行介绍。
在 GF(28) 中与 0x01 相乘是特殊的,它与普通算术中的乘以 1 相对应且工作方式也相同 — 任 何值与 0x01 相乘都等于它本身。
现在,让我们看看与 0x02 相乘会怎样。正如加法的情况一样,理论是深奥的,但是最终结果却相 当简单。如果被乘的值小于 0x80,那么,乘法结果只是向左位移 1 位的值。如果被乘的值大于或 等于 0x80,那么,乘法结果将是向左位移 1 位后再与 0x1b 值执行 XOR 运算的值。这将防止 出现“域溢出”,并使乘法结果落在范围内。
相关文档
最新文档