AES加密算法原理(图文).pdf

上传人:tbuqq 文档编号:5493486 上传时间:2020-05-23 格式:PDF 页数:15 大小:2.60MB
返回 下载 相关 举报
AES加密算法原理(图文).pdf_第1页
第1页 / 共15页
AES加密算法原理(图文).pdf_第2页
第2页 / 共15页
AES加密算法原理(图文).pdf_第3页
第3页 / 共15页
AES加密算法原理(图文).pdf_第4页
第4页 / 共15页
AES加密算法原理(图文).pdf_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《AES加密算法原理(图文).pdf》由会员分享,可在线阅读,更多相关《AES加密算法原理(图文).pdf(15页珍藏版)》请在三一文库上搜索。

1、标准实用 文案大全 AES加密算法原理(图文) 随着对称密码的发展 ,DES数据加密标准算法由于密钥长度较小(56 位), 已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997 年 NIST 公开征集新的数据加密标准, 即 AES1。经过三轮的筛选 , 比利时 Joan Daeman 和 Vincent Rijmen 提交的 Rijndael算法被提议为 AES的最终算法。 此算法将成 为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对 AES还有不同 的看法 , 但总体来说 ,AES作为新一代的数据加密标准汇聚了强安全性、高性能、 高效率、易用和灵活等优点。 AES设计有

2、三个密钥长度 :128,192,256位,相对而 言, AES的 128 密钥比 DES的 56 密钥强 1021 倍2 。 AES算法主要包括三个方面: 轮变化、圈数和密钥扩展。 AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一 个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且 用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同, 对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换 (permutations )和替换 (sub

3、stitutions)输入数据。Figure 1 显示了 AES 用 192 位密钥对一个 16位字节数据块进行加密和解密的情形。 Figure 1 部分数据 AES算法概述 AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用 一个单元数据替换另一个。 AES 使用了几种不同的技术来实现置换和替换。为了 阐明这些技术, 让我们用 Figure 1 所示的数据讨论一个具体的 AES 加密例子。 下面是你要加密的128 位值以及它们对应的索引数组: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff0 1 2 3 4 5 6 7 8 9 1

4、0 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 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-盒。它是一个 1616的矩阵。 S-盒的前 五行和前五列如 Figure 2 所示。在幕后,加密例程

5、获取该密钥数组并用它来生 成一个名为 w 的密钥调度表, Figure 3 所示。 Figure 3 密钥调度表( Key Sched) w 最初的 Nk (6) 行被作为种子,用原始密钥值(0x00 到 0x17)。 剩余行从种子密钥来产生。 变量 Nk 代表以 32 位字为单位的种子密钥长度。 稍 后我分析 AES 实现时你将清楚地看到 w 是怎样产生的。关键是这里现在有 许多密钥使用而不只是一个。这些新的密钥被称为轮密钥(round keys)以将它 们与原始种子密钥区别开来。 Figure 4 State (态)数组 AES 加密例程开始是拷贝 16 字节的输入数组到一个名为State

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

7、的 State0,2 值是用 w2,0( 0x08 或 0x80 ) 异或 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 0 AES 算法的主循环对 State 矩阵执行四个不同的操作,在规范中被称为 SubBytes(字节替换)、 ShiftRows(行位移变换)、 MixColumns (列混合变换) 和 AddRoundKey 。除了每次循环 AddRoundKey 都被调用并使用密钥调度表的下 面四行外,AddRoundKey 与预备处理步骤中的 AddRoundKey 相同。SubBytes 例

8、程是一个代替操作,它将 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 的第 1 行被向左旋转

9、 1 个位置, State 的第 2 行被向左旋转 2 个位置,而 State 的第 3 行被向左旋转 3 个 位置。 Figure 6 对 State 进行 ShiftRows 操作 MixColumns 是一个代替操作,它是理解 AES 算法时最具技巧(或者 说是最需要动脑筋的部分)的部分。它用 State 字节列的值进行数学域加和域 乘的结果代替每个字节。我将在下一节中详细解释专门的域加和域乘细节。 假设 State0,1 的值是 0x09,并且列 1 上的其它值分别为 0x60 , 0xe1 和 0x04 ,那么 State0,1的新值计算如下: cppview plaincopy 1

10、. State0,1 = (State0,1 * 0x01) + (State1,1 * 0x02) +(State2,1 * 0x03) +(State3,1 * 0x01)= (0x09 * 0x 01) + (0x60 * 0x02) + (0xe1 * 0x03) +(0x04 * 0x01)= 0x57 标准实用 文案大全 此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。 SubBytes、ShiftRows 、MixColumns 和 AddRoundKey 四个操作在一个执行 Nr 次的循环里被调用, Nr 为给定密钥大小的轮数减 1 。加密算法使用的轮数要 么是

11、10,12,要么是 14,这依赖于种子密钥长度是128 位、192 位还是 256 位。 在这个例子中,因为 Nr 等于 12, 则这四个操作被调用11 次。该迭代完成后, 在拷贝 State 矩阵到输出参数前,加密算法调用 SubBytes 、ShiftRows 和 AddRoundKey 后结束。 大致说来, AES 加密算法的核心有四个操作。AddRoundKey 使用从种子密 钥值中生成的轮密钥代替 4 组字节。 SubBytes 替换用一个代替表替换单个字 节。ShiftRows 通过旋转 4 字节行 的 4 组字节进行序列置换。 MixColumns 用 域加和域乘的组合来替换字节

12、。 有限域 GF(28)的加法和乘法 正如你所看到的, AES 加密算法使用相当简单明了的技术来代替和置 换,除 MixColumns 例程以外。 MixColumns 使用特殊的加法和乘法。 AES 所用 的加法和乘法是基于数学(译者注:近世代数)的域论。尤其是 AES 基于有限 域 GF(28)。 GF(28)由一组从 0x00 到 0xff 的 256 个值组成,加上加法和乘法,因此 是(28) 。GF代表伽罗瓦域,以发明这一理论的数学家的名字命名。GF(28) 的一 个特性是一个加法或乘法的操作的结果必须是在0x00 . 0xff这组数中。虽 然域论是相当深奥的,但GF(28)加法的最

13、终结果却很简单。GF(28) 加法就是异 或(XOR )操作。 然而,GF(28)的乘法有点繁难。 正如你稍后将在 C# 实现中所看到的, AES 的加密和解密例程需要知道怎样只用七个常量 0x01 、0x02、0x03、0x09、0x0b、 0x0d 和 0x0e 来相乘。所以我不全面介绍GF(28)的乘法,而只是针对这七种特 殊情况进行说明。 在 GF(28)中用 0x01 的乘法是特殊的;它相当于普通算术中用1 做乘法并 且结果也同样任何值乘0x01 等于其自身。 现在让我们看看用 0x02 做乘法。和加法的情况相同, 理论是深奥的, 但最 终结果十分简单。只要被乘的值小于0x80,这时

14、乘法的结果就是该值左移1 比 特位。如果被乘的值大于或等于0x80,这时乘法的结果就是左移1 比特位再用 值 0x1b 异或。它防止了“域溢出”并保持乘法的乘积在范围以内。 一旦你在 GF(28)中用 0x02 建立了加法和乘法,你就可以用任何常量去定 义乘法。用 0x03 做乘法时,你可以将 0x03 分解为 2 的幂之和。为了用 0x03 乘 以任意字节 b, 因为 0x03 = 0x02 + 0x01,因此: b * 0x03 = b * (0x02 + 0x01) = (b * 0x02) + (b * 0x01) 这是可以行 得通的,因为你知道如何用 0x02 和 0x01 相乘和相

15、加,同哩,用0x0d 去乘以 任意字节 b 可以这样做: 标准实用 文案大全 cppview plaincopy 1. b * 0x0d 2.= b * (0x08 + 0x04 + 0x01) 3.= (b * 0x08) + (b * 0x04) + (b * 0x01) 4.= (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0 x02) + (b * 0x01) 在加解密算法中, AES MixColumns 例程的其它乘法遵循大体相同的模 式,如下所示: cppview plaincopy 1. b * 0x09 2.= b * (0x08 + 0x01

16、) 3.= (b * 0x02 * 0x02 * 0x02) + (b * 0x01)b * 0x0b 4.= b * (0x08 + 0x02 + 0x01) = (b * 0x02 * 0 x02 * 0x02) + (b * 0x02) + (b * 0x01)b * 0x0e 5.= b * (0x08 + 0x04 + 0x02) 6.= (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0 x02) + (b * 0x02) 总之,在 GF(28)中,加法是异或操作。 其乘法将分解成加法和用0x02 做的乘法,而用 0x02 做的乘法是一个有条件的左移1

17、 比特位。 AES规范中包括 大量 有关 GF(28)操作的附加信息。 密钥扩展 AES加密和解密算法使用了一个由种子密钥字节数组生成的密钥调度表。 AES规范中称之为密钥扩展例程(KeyExpansion)。从本质上讲,从一个原始密 钥中生成多重密钥以代替使用单个密钥大大增加了比特位的扩散。虽然不是无法 抵御的困难,但理解 KeyExpansion 仍是 AES 算法中的一个难点。KeyExpansion 例程高级伪代码如下所示: KeyExpansion(byte key, byte4 w) copy the seed key into the first rows of w for ea

18、ch remaining row of w use two of the previous rows to create a new row “用前面两行来产生一个新行”(“use two of the previous rows to create a new row”)的例程用到了两个子例程, RotWord 和 SubWord 以及一个名为“ Rcon ”的常数表(作为“轮常数”)。让我们先来 逐个看一下这三东西,然后再回到整个 KeyExpansion 的讨论中来。 标准实用 文案大全 RotWord 例程很简单。它接受一个4 个字节的数组并将它们向左旋转一个 位置。因为轮调度表 w

19、有四列, RotWord 将 w 的 1 行左旋。注意 KeyExpansion 使用的这个 RotWord 函数与加密算法使用的ShiftRows (行 位移变换)例程非常相似,只是它处理的是单行密钥调度 w ,而不是整个加 密状态表 State。 SubWord 例程使用替换表 Sbox 对一给定的一行密钥调度表 w 进行逐 字节替换。 KeyExpansion 操作中的替换实际上就像在加密算法中的替换一样。 被代替的输入字节被分成 (x,y) 对,它被当作进入替换表 Sbox 的索引。举例 来说, 0x27 的代替结果是 x 2 和 y 7,并且 Sbox2,7 返回 0xcc 。 Ke

20、yExpansion 例程使用一个被称为轮常数表的数组 Rcon 。这些常数都 是 4 个字节,每一个与密钥调度表的某一行相匹配。AES 的 KeyExpansion 例程 需要 11 个轮常数。你可以在 Figure 7 中看到这些常数清单。 每个轮常数的最左边的字节是GF(28)域中 2 的幂次方。 它的另一个表示方 法是其每个值是前一个值乘上0x02,正如前一部分讨论 GF(28) 乘法 时所描述 的那样。注意 0x80 0x02 = 0x1b 是 0x80 左移 1 个比特位后紧接着与 0x1b 进行异或,如前所述。 现在让我们更进一步看看 KeyExpansion 内幕中的循环。这里

21、所用的伪码 比以前更为详细,这个循环是: cppview plaincopy 1. for(row = Nk; row (4 * Nr+1); +row) 2. 3.temp = wrow-1 4.if(row % Nk = 0) 5.temp = SubWord(RotWord(temp) xor Rconrow/Nk 6.elseif(Nk = 8 and row % Nk = 4) temp = SubWord(temp) wrow = wrow-Nk xor temp 7. 先不要去看 if子句,你将看到密钥调度表 w 的每一行都是前面一 行与行 Nk 异或的结果( 4, 6, 或 8

22、 取决于密钥的长度)。 if条件的第一部分 用 SubWord、RotWord 以及与轮常数的异或修改密钥调度表的每个第4、第 6 或 第 8 行,取决于是否密钥的长度是128、192 或 256 位。这个条件的第二部分将 修改行 12 、20 和 28 等等对于 256 位密钥而言每一个第 8 行都将添 加密钥调度额外的可变性。 让我们用本文开头所举的例子来考察 KeyExpansion 是如何开始的。种子 密钥是 192-bit / 6-word 值: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16

23、17 密钥调度字节表 w 的维数是 4 列并且 Nb (Nr + 1) 等于 4 (12 + 1),或 52 行。KeyExpansion 将种子密钥的 标准实用 文案大全 值拷贝到密钥调度字节表 w 的第一行。因为我的种子密钥是 192 位(24 字 节),并且 w 表总是 4 列,在这种情况下KeyExapansion 将种子密钥拷贝 到 w 的前面 6 行。现在让我们看看 KeyExapansion 例程是如何填充密钥调 度表其余部分的。在我的例子里,第一个被计算的行是第 6 行 ,因为第 0-5 行已被种子密钥的值填上了: temp = wrow-1 = 14 15 16 17 条件

24、(row % Nk = 0) 为真,因此首先 RotWord 子程序被应用: temp = 15 16 17 14 这时 SubWord 被应用: temp = 59 47 f0 fa 用 Rconrow / Nk = Rcon6 / 6 = 01 00 00 00 进行异或: temp = 58 47 f0 fa 这时用 wrow-Nk = w6-6 = 00 01 02 03 异或,产生了下面结果: w6 = 58 46 f2 f9 密钥调度表 w 中其余所有行来重复这个过程本身。 总而言之, AES 加密和解密的一个重要部分就是从最初的种子密钥中 生成多重轮密钥。这个 KeyExapan

25、sion 算法生成一个密钥调度并以某种方式进 行替代和置换,在这种方式中,加密和解密算法极其相似。 一. AES 对称加密 : AES加密 标准实用 文案大全 分组 二. 分组密码的填充 分组密码的填充 标准实用 文案大全 PKCS#5 填充方式 三. 流密码 四. 分组密码加密中的四种模式:3.1 ECB 模式 标准实用 文案大全 优点:1. 简单; 2. 有利于并行计算; 3. 误差不会被传送;缺点 :1. 不能隐藏 明文的模式; 2. 可能对明文进行主动攻击; 3.2 CBC 模式: 标准实用 文案大全 优点:1. 不容易主动攻击 , 安全性好于 ECB,适合传输长度长的报文 , 是 S

26、SL 、 IPSec 的标准。缺点:1. 不利于并行计算; 2. 误差传递;3. 需要初始化向量 IV 3.3 CFB模式: 标准实用 文案大全 优点:1. 隐藏了明文模式 ;2. 分组密码转化为流模式;3. 可以及时加密传送 小于分组的数据 ; 缺点:1. 不利于并行计算 ;2. 对明文的主动攻击是可能的;3. 误 差传送:一个明文单元损坏影响多个单元; 标准实用 文案大全 优点: 1. 隐藏了明文模式 ;2. 分组密码转化为流模式 ;3. 可以及时加密传送 小于分组的数据 ; 缺点:1. 不利于并行计算 ;2. 误差传送:一个明文单元损坏影响 多个单元 ;3. 唯一的 IV; 3.4 OF

27、B模式: 下面是示例代码: javaview plaincopy 1. packagemini.code.test.t20120810; 2. 3. importjavax.crypto.*; 4. importjavax.crypto.spec.*; 5. 6. publicclassAES 7. 8.publicstaticString asHex(bytebuf) 9. 10.StringBuffer strbuf = newStringBuffer(buf. length * 2); 11.inti; 标准实用 文案大全 12.for(i = 0; i buf.length; i+)

28、13. 14.if( int ) bufi 16.strbuf.append(Long.toString(in t ) bufi 17. 18.returnstrbuf.toString(); 19. 20. 21.publicstaticvoidmain(String args) throwsExc eption 22. 23. 24.String message = “ 这是个加密的例子 “ ; 25.System.out.println(“ 原 文: “+ message); 26.System.out.println(“ 原文转换格式显示: “+ asHex(message.getBy

29、tes();/ string byte Hex 27./ 生成密码 28.KeyGenerator kgen = KeyGenerator.getInstance ( “AES“); / 获取密匙生成器 29.kgen.init(128); / 生成 128 位的 AES密码生成 器 30.SecretKey skey = kgen.generateKey();/ 生成 密匙 31.byte raw = skey.getEncoded();/ 编码格 式 32.SecretKeySpec skeySpec = newSecretKeySpec( raw, “AES“); / 生成一组扩展密钥,

30、并放入一个数组之中 33.Cipher cipher = Cipher.getInstance(“AES“); 34.cipher.init(Cipher.ENCRYPT_MODE, skeySpec); / 用 ENCRYPT_MODE模式,用 skeySpec 密码组,生成 AES加密方法 35./ 加密message 36.byte encrypted = cipher.doFinal(message.ge tBytes();/ 加密 message 37.System.out.println(“ 加密 后: “+ encrypted);/ 打印密文 38.System.out.prin

31、tln(“ 密文转换格式后: “+ asHex(encrypted);/ 把密文转换成 16 进制格式 39./ 解密 标准实用 文案大全 40.cipher.init(Cipher.DECRYPT_MODE, skeySpec); 41.byte original = cipher.doFinal(encrypted); / 解密 42.String originalString = newString(original , “UTF8“); / 重新显示明文 43.System.out.println(“ 解密 后:“+ originalString); 44.System.out.println(“ 解密出的消息转换格式显 示:“+ asHex(original);/ byte 型原文 45. 46.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1