AES对称加密算法原理C_—bit

上传人:m**** 文档编号:483681095 上传时间:2023-09-09 格式:DOC 页数:19 大小:322KB
返回 下载 相关 举报
AES对称加密算法原理C_—bit_第1页
第1页 / 共19页
AES对称加密算法原理C_—bit_第2页
第2页 / 共19页
AES对称加密算法原理C_—bit_第3页
第3页 / 共19页
AES对称加密算法原理C_—bit_第4页
第4页 / 共19页
AES对称加密算法原理C_—bit_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《AES对称加密算法原理C_—bit》由会员分享,可在线阅读,更多相关《AES对称加密算法原理C_—bit(19页珍藏版)》请在金锄头文库上搜索。

1、摘要AES (The Advaneed Encryption Standard )是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。本文展示了 AES的概貌并解析了它使用的算法。包括一个完整的C#实现和加密.NET数据的举例。在读完本文后你将能用AES加密、测试 基于AES的软件并能在你的系统中使用AES加密。美国国家标准与技术研究所 (NIST)在2002年5月26日建立了新的高级数据加密标准 (AES)规范。本文中我将提供一个用 C#编写的的能运行的 AES实现,并详细解释到底什么 是AES以及编码是如何工作的。我将向您展示如

2、何用 AES加密数据并扩展本文给出的代 码来开发一个商业级质量的 AES类。我还将解释怎样把 AES结合到你的软件系统中去 和为什么要这么做,以及如何测试基于AES的软件。注意本文提供的代码和基于本文的任何其它的实现都在联邦加密模块出口控制的适用范围之内(详情请参看Commercial En crypti on Export Con trols )。AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用 128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和

3、解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1显示 了 AES用192位密钥对一个16位字节数据块进行加密和解密的情形。Figure 1部分数据AES算法概述AES算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替 换另一个。AES使用了几种不同的技术来实现置换和替换。为了阐明这些技术,让我们用 Figure 1所示的数据讨论一个具体的AES加密例子。下面是你要加密的128位值以及它们对应的索引数组:00 11 22 33 44

4、 55 66 77 88 99 aa bb cc dd ee ff0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15192 位密钥的值是:00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 170 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-盒。它是一个16X16的矩

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加密例程开始是拷贝 16字节的输入数组到一个名为

6、State (态)的4用字节矩阵中。(参见Figure 4)。AES加密算法取名为Cipher,它操作State,其过程描述的 伪代码参见 Figure 5 。在规范中,加密算法实现的一个预备的处理步骤被称为AddRoundKey (轮密钥加)。AddRou ndKey用密钥调度表中的前四行对State矩阵实行一个字节一个字节的异或(XOR )操作,并用轮密钥表wc,r异或 输入Stater,c。举个例子,如果State矩阵的第一行保存的字节是 00, 44, 88, cc ,第一列密钥调度表是 00, 04, 08, 0c ,那么新的 State0,2值是用 w2,0( 0x08 或 0x8

7、0 )异或 State0,2(0x88) 的结果:1 0 0 0 1 0 0 00 0 0 0 1 0 0 0 XOR1 0 0 0 0 0 0 0AES算法的主循环对State矩阵执行四个不同的操作,在规范中被称为SubBytes (字 节替 换)、ShiftRows (行 位移变 换)、MixColumns (列 混合 变换) 和AddRoundKey。除了每次循环AddRoundKey都被调用并使用密钥调度表的下面四行外,AddRoundKey 与预备处理步骤中的AddRoundKey 相同。SubBytes例程是一个代替操作,它将State矩阵中的每个字节替换成一个由Sbox决定的新字

8、节。比如,如果State0,1的值是0x40如果你想找到它的代替者,你取 State0,1的值(0x40)并让x等于左边的数 字并让y等于右边的数字(0)。然后你用x和y作为索引 进到Sbox表中寻找代替值, 如Figure 2所示。ShiftRows是一个置换操作,它将State矩阵中的字节向左旋转。Figure 6示范了ShiftRows如何操作 State。State的第0行被向左旋转 0个位置,State的第1行被向左旋 转1个位置,State的第2行被向左旋转2个位置,而State的第3行被向左旋转3个位置。Figure 6 对 State 进行 ShiftRows 操作MixCol

9、umns是一个代替操作,它是理解AES算法时最具技巧(或者说是最需要动脑筋的部分)的部分。它用State字节列的值进行数学域加和域乘的结果代替每个字节。我将在下 一节中 详细解释专门的域加和域乘细节。假设State0,1的值是0x09,并且列1上的其它值分别为0x60, 0xe1和0x04,那么State0,1的新值计算如下:State0,1 = (State0,1 * 0x01) + (State1,1 * 0x02) +(State2,1 * 0x03) +(State3,1 * 0x01) =(0x09 * 0x01) + (0x60 * 0x02) + (0xe1 * 0x03) +(

10、0x04 * 0x01)=0x57此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。SubBytes、ShiftRows、MixColumns 和 AddRoundKey 四个操作在一个执行Nr 次的循环里被调用,Nr为给定密钥大小的轮数减1。加密算法使用的轮数要么是10, 12,要么是14,这依赖于种子密钥长度是128位、192位还是256位。在这个例子中,因为Nr等于12,则这四个操作被调用11次。该迭代完成后,在拷贝State矩阵到输出参数前,加密算法调用 SubBytes、ShiftRows 和 AddRoundKey 后结束。大致说来,AES加密算法的核心有四个操作。Ad

11、dRoundKey使用从种子密钥值中生成 的轮密钥代替 4组字节。SubBytes替换用一个代替表替换单个字节。ShiftRows通过旋转4字节行的4组字节进行序列置换。MixColumns用域加和域乘的组合来替换字节。有限域GF(28)的加法和乘法正如你所看到的,AES加密算法使用相当简单明了的技术来代替和置换,除 MixColumns例程以外。MixColumns使用特殊的加法和乘法。AES所用的加法和乘法是基 于数学(译者注:近世代数)的域论。尤其是AES基于有限域GF(28)。GF(28)由一组从 0x00至U 0xff的256个值组成,加上加法和乘法,因此是 (28)。GF代 表伽罗

12、瓦域,以发明这一理论的数学家的名字命名。GF(28)的一个特性是一个加法或乘法的操作的结果必须是在0x00 . 0xff这组数中。虽然域论是相当深奥的,但GF(28)加法的最终结果却很简单。GF(28)加法就是异或(XOR )操作。然而,GF(28)的乘法有点繁难。正如你稍后将在C#实现中所看到的,AES的加密和解密例程需要知道怎样只用七个常量0x01、0x02、0x03、0x09、0x0b 0x0d和0x0e来相乘。所以我不全面介绍 GF(28)的乘法,而只是针对这七种特殊情况进行说明。在GF(28)中用0x01的乘法是特殊的;它相当于普通算术中用1做乘法并且结果也同样任何值乘0x01等于其

13、自身。现在让我们看看用 0x02做乘法。和加法的情况相同,理论是深奥的,但最终结果十分 简单。只要被乘的值小于0x80,这时乘法的结果就是该值左移1比特位。如果被乘的值大于或等于0x80,这时乘法的结果就是左移1比特位再用值0x1b异或。它防止了 域溢出”并保持乘法的乘积在范围以内。一旦你在 GF(28)中用0x02建立了加法和乘法,你就可以用任何常量去定义乘法。用0x03做乘法时,你可以将 0x03分解为2的幕之和。为了用 0x03乘以任意字节b,因为0x03 =0x02 + 0x01,因此: b * 0x03 = b * (0x02 + 0x01)=(b * 0x02) + (b * 0x

14、01)这是可以行得通的,因为你知道如何用0x02和0x01相乘和相加,同哩,用0x0d去乘以任意字节b可以这样做:b * 0x0d = b * (0x08 + 0x04 + 0x01)=(b * 0x08) + (b * 0x04) + (b * 0x01)=(b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x01)在加解密算法中,AES MixColu mns例程的其它乘法遵循大体相同的模式,如下所示:b * 0x09 = b * (0x08 + 0x01)=(b * 0x02 * 0x02 * 0x02) + (b * 0x01)b

15、* 0x0b = b * (0x08 + 0x02 + 0x01)=(b * 0x02 * 0x02 * 0x02) + (b * 0x02) + (b * 0x01)b * 0x0e = b * (0x08 + 0x04 + 0x02)=(b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x02)总之,在GF(28)中,加法是异或操作。其乘法将分解成加法和用0x02做的乘法,而用0x02做的乘法是一个有条件的左移 1比特位。AES规范中包括大量 有关GF(28)操作的附 加信息。密钥扩展AES加密和解密算法使用了一个由种子密钥字节数组生成的密钥调度表。AES规范中称之为密钥扩展例程(KeyExpansion )。从本质上讲,从一个原始密钥中生成多重密钥以代 替使用单个密钥大大增加了比特位的扩散。虽然不是无法抵御的困难,但理解KeyExpansion仍是AES算法中的一个难点。KeyExpansion例程高级伪代码如下所示:KeyExpa nsio n(byte key, byte4 w)copy the seed key in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号