




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实用标准文档AES加密算法原理(图文)随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位), 已经不适应当今分布式开放网络对数据加密安全性的要求,因此 1997年NIST 公开征集新的数据加密标准,即AES1。经过三轮的筛选,比利时Joan Daeman 和Vincent Rijmen提交的Rijndael算法被提议为AES的最终算法。此算法将成 为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、 高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256位,相对而
2、言,AES的128密钥比DES的56密钥强1021倍2。AESB法主要包括三个方面: 轮变化、圈数和密钥扩展。AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同, 对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换 (permutations )和替换(substitutions )输入数据。Figure 1 显示了 AES 用 192位密钥对一个1
3、6位字节数据块进行加密和解密的情形。Figure 1部分数据AESB法概述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 78 9 10 11 12 13 14 15192位密钥的值是:00 01 02 03 04 05 06 07 08 09 0a 0b
4、0c 0d 0e 0f 10 11 12 13 14 1516 170 1 2 3 4 5 67 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23Figure 2 S- 盒(Sbox )当AES的构造函数(constructor )被调用时,用于加密方法的两个 表被初始化。第一个表是代替盒称为S-盒。它是一个16X16的矩阵。S-盒的前五行和前五列如Figure 2所示。在幕后,加密例程获取该密钥数组并用它来生 成一个名为w的密钥调度表,Figure 3所示。Figure 3 密钥调度表(Key Sched)w口最初的Nk (6)行被作为种子,用原始密钥
5、值(0x00到0x17)。 剩余行从种子密钥来产生。变量Nk代表以32位字为单位的种子密钥长度。稍 后我分析AES实现时你将清楚地看到 w口是怎样产生的。 关键是这里现在有 许多密钥使用而不只是一个。这些新的密钥被称为轮密钥(round keys)以将它 们与原始种子密钥区别开来。Figure 4 State (态)数组AES加密例程开始是拷贝16字节的输入数组到一个名为State(态)的4 X4字节矩阵中。(参见Figure 4)。AES加密算法 取名为Cipher , 它操作State口 ,其过程描述的伪代码参见Figure 5。在规范中,加密算法实现的一个预备的处理步骤被称为 AddRo
6、undKey (轮 密钥加)。AddRoundKey用密钥调度表中的前四行对State矩阵实行一个字节 一个字节的异或(XOR操作,并用轮密钥表 wc,r 异或输入Stater,c。举个例子,如果State矩阵的第一行保存的字节是 00,44, 88, cc ,第一列密钥调度表是 00, 04, 08, 0c ,那么新的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 0AES算法的主循环对State 矩阵执行四个不同的操作,在规范中被称为 S
7、ubBytes (字节替换)、ShiftRows (行位移变换)、MixColumns (列混合变换) 和AddRoundKey除了每次循环AddRoundKey都被调用并使用密钥调度表的下 面四行外,AddRoundKey与预备处理步骤中的 AddRoundKey相同。SubBytes例 程是一个代替操作,它将 State矩阵中的每个字节替换成一个由 Sbox决定的 新字节。比如,如果State0,1的值是0x40如果你想找到它的代替者,你取 State0,1 的值(0x40)并让x等于左边的数字(4)并让y等于右边的数字 (0)。然后你用x和y作为索引进到Sbox表中寻找代替值,如Figu
8、re 2所 示。ShiftRows是一个置换操作,它将State矩阵中的字节向左旋转。 Figure 6示范了 ShiftRows 如何操作State口 。 State 的第0行被向左旋转0 个位置,State的第1行被向左旋转1个位置,State的第2行被向左旋转2 个位置,而State的第3行被向左旋转3个 位置。Figure 6 对 State 进行 ShiftRows 操作文案大全MixColumns是一个代替操作,它是理解 AES算法时最具技巧(或者 说是最需要动脑筋的部分)的部分。它用 State字节列的值进行数学域加和域 乘的结果代替每个字节。我将在下一节中 详细解释专门的域加和
9、域乘细节。假设State0,1 的值是0x09,并且列1上的其它值分别为0x60 , 0xe1和0x04,那么State0,1的新值计算如下: cpp view plaincopy1. State0,1 = +(State2,1 01) + (0x60 0x57(State0,1* 0x01)* 0x03) +(State3,1* 0x02) + (0xe1 *+ (State1,1* 0x02)* 0x01)= (0x09 * 0x 0x03) +(0x04 * 0x01)=此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。SubBytes、ShiftRows、MixColumn
10、s 和 AddRoundKey 四个操作在一个执行 Nr次的循环里被调用,Nr为给定密钥大小的轮数减1。加密算法使用的轮数要 么是10, 12,要么是14,这依赖于种子密钥长度是128位、192位还是256位。 在这个例子中,因为Nr等于12,则这四个操作被调用11次。该迭代完成后, 在拷贝State 矩阵到输出参数前,加密算法调用 SubBytes、ShiftRows和 AddRoundKey 后结束。大致说来,AES加密算法的核心有四个操作。AddRoundKey使用从种子密 钥值中生成的轮密钥代替4组字节。SubBytes替换用一个代替表替换单个字 节。ShiftRows通过旋转4字节行
11、的4组字节进行序列置换。MixColumns用 域加和域乘的组合来替换字节。有限域GF(28)的加法和乘法正如你所看到的,AES加密算法使用相当简单明了的技术来代替和置 换,除MixColumns例程以外。MixColumns使用特殊的加法和乘法。AES所用 的加法和乘法是基于数学(译者注:近世代数)的域论。尤其是 AES基于有限 域 GF(28)。GF(28)由一组从0x00到0xff 的256个值组成,加上加法和乘法,因此 是(28)。GF代表伽罗瓦域,以发明这一理论的数学家的名字命名。GF(28)的一个特性是一个加法或乘法的操作的结果必须是在 0x00 . 0xff这组数中。虽然域论是相
12、当深奥的,但GF(28)加法的最终结果却很简单。GF(28)加法就是异 或(XOR操作。然而,65(28)乘乘法有点繁难。正如你稍后将在C#实现中所看到的,AES 的加密和解密例程需要知道怎样只用七个常量0x01、0x02、0x03、0x09、0x0b、0x0d和0x0e来相乘。所以我不全面介绍 GF(28)的乘法,而只是针对这七种特 殊情况进行说明。在GF(28)中用0x01的乘法是特殊的;它相当于普通算术中用1做乘法并且结果也同样一任何值乘0x01等于其自身。现在让我们看看用0x02做乘法。和加法的情况相同,理论是深奥的,但最 终结果十分简单。只要被乘的值小于 0x80,这时乘法的结果就是
13、该值左移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相乘和相加,同哩,用0x0d去乘以 任意字节b可以这样做:cpp
14、 view plaincopy1. b *2.3.0x0d=b * (0x08 + 0x04 + 0x01)4.x02)=(b * 0x02 * 0x02 *+ (b * 0x01)0x02) + (b * 0x02 * 0=(b * 0x08) + (b * 0x04) + (b * 0x01)在加解密算法中,AESMixColumns例程的其它乘法遵循大体相同的模式,如下所示:cpp view plaincopy1.b * 0x092.=b * (0x08 + 0x01)3.=(b * 0x02 * 0x02 * 0x02) + (b0x0b4.=b * (0x08 + 0x02 + 0x
15、01) = (bx02 * 0x02) + (b * 0x02) + (b * 0x01)b5.=b * (0x08 + 0x04 + 0x02)6.=(b * 0x02 * 0x02 * 0x02) + (bx02) + (b * 0x02)*0x01)b0x020x0e0x02总之,在GF(28)中,力口法是异或操作。其乘法将分解成加法和用0x02 做的乘法,而用0x02做的乘法是一个有条件的左移1比特位。AES规范中包括 大量 有关GF(28)操作的附加信息。密钥扩展AE劭口密和解密算法使用了一个由种子密钥字节数组生成的密钥调度表。AES规范中称之为密钥扩展例程(KeyExpansion
16、)。从本质上讲,从一个原始密 钥中生成多重密钥以代替使用单个密钥大大增加了比特位的扩散。虽然不是无法抵御的困难,但理解KeyExpansion 仍是AES算法中的一个难点。KeyExpansion 例程高级伪代码如下所示:KeyExpansion(byte口 key, byte4 w) copy the seed key intothe first rows of w for each remaining row of w use two of the previous rows to create a new row “用前面两行来产生一个新行” (“ use two ofthe previ
17、ous rows to create a newrow")的例程用到了两个子 例程,RotWord 和SubWord以及一个名为“ Rcon”的常数表(作为“轮常数”)。让我们先来 逐个看一下这三东西,然后再回到整个KeyExpansion的讨论中来。RotWord例程很简单。它接受一个4个字节的数组并将它们向左旋转一个 位置。因为轮调度表 w口有四列,RotWord将w口的1行左旋。注意 KeyExpansion使用的这个RotWord函数与加密算法使用的ShiftRows (行位移变换)例程非常相似,只是它处理的是单行密钥调度 w口,而不是整个加密状态表State口 。SubWo
18、rd例程使用替换表Sbox对一给定的一行密钥调度表w口进行逐 字节替换。KeyExpansion操作中的替换实际上就像在加密算法中的 替换一样。 被代替的输入字节被分成(x,y) 对,它被当作进入替换表Sbox的索引。举例 来说,0x27的代替结果是x = 2和y =7,并且Sbox2,7 返回0xcc。KeyExpansion例程使用一个被称为轮常数表的数组 Rcon口。这些常数都 是4个字节,每一个与密钥调度表的某一行相匹配。 AES的KeyExpansion例程 需要11个轮常数。你可以在Figure 7 中看到这些常数清单。每个轮常数的最左边的字节是GF(28)域中2的幕次方。它的另一
19、个表示方 法是其每个值是前一个值乘上0x02,正如前一部分讨论GF(28)乘法时所描述 的那样。注意0x80 X 0x02 = 0x1b是0x80左移1个比特位后紧接着与0x1b 进行异或,如前所述。现在让我们更进一步看看 KeyExpansion内幕中的循环。这里所用的伪码 比以前更为详细,这个循环是:cpp view plaincopy1. for (row = Nk; row < (4 * Nr+1); +row)2. 3. temp = wrow-14. if (row % Nk = 0)5. temp = SubWord(RotWord(temp) xor Rconrow/Nk
20、6. else if (Nk = 8 and row % Nk = 4)temp = SubWord(temp) wrow = wrow-Nk xor temp7. 先不要去看if子句,你将看到密钥调度表 w的每一行都是前面一 行与行Nk异或的结果(4, 6,或8取决于密钥的长度)。if条件的第一部分 用SubWord RotWord以及与轮常数的异或修改密钥调度表的每个第4、第6或第8行,取决于是否密钥的长度是128、192或256位。这个条件的第二部分将 修改行12、20和28等等一一对于256位密钥而言一一每一个第8行都将添 加密钥调度额外的可变性。让我们用本文开头所举的例子来考察Key
21、Expansion是如何开始的。种子密钥是 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 17密钥调度字节表 w的维数是4列并且Nb x (Nr + 1) 等于 4 x (12 + 1),或 52 行。KeyExpansion 将种子密钥的值拷贝到密钥调度字节表 w口的第一行。因为我的种子密钥是192位(24字 节),并且w口 表总是4歹!J,在这种情况下KeyExapansion将种子密钥拷贝 到w口的前面6行。现在让我们看看KeyExapansion例程是如何填
22、充密钥调 度表其余部分的。在我的例子里,第一个被计算的行是第6行,因为第0-5行已被种子密钥的值填上了 :temp = wrow-1 = 14 15 16 17 条件(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 = 5846 f2 f9 密钥调度表w口中
23、其余所有行来重复这个过程本身。总而言之,AES加密和解密的一个重要部分就是从最初的种子密钥中 生成多重轮密钥。这个KeyExapansion算法生成一个密钥调度并以某种方式进 行替代和置换,在这种方式中,加密和解密算法极其相似。.AES对称加密:0和1组成的串明文块密钥I密文块0 |闱文块11密文块2 |密文块3 | , : 明文分解为多个块7加192r尬或256位AES加密器所以4ES是分组密码,也称块密码 -AES! 密卜一128位I I I I I I I I I I I I I I I I I二块是N个石:还至存节二|分组密码的填充I 口 I I KFI 吓Fl新问题:如果刚好不用填充
24、怎么办I 口 I I I I I “ I II I I口+16 |16 | 16 16 16 16 16 16 16 (77PKCS#驮充方式流密码明文1,密文 j h密钥流1 1密钥流P,11,1,密钥流生成器1密钥源生成器1密相K卜.a|密加K密钥K长度短,好记 二四.分组密码加密中的四种模式:3.1 ECB模式电T明文 d k相同的K生成tT1同的流J钥流生成器必算有生成一定随机流 的能力Jw优点:1.简单;2.有利于并行计算;3.误差不会被彳专迭;缺点:1.不能隐藏 明文的模式;2.可能对明文进行主动攻击;银行A向银行B的帐号K打入钱1 窃贼C怎么得到密块帐号二ri 日 I_ R Q
25、一银行口银行B对ECB模式分组重放攻击3.2 CBC 模式:明文块0密文块0这种模式称为CBC模式,又密码分组链接优点:1.不容易主动攻击,安全性好于ECB适合传输长度长的报文,是SSL IPSec的标准。缺点:1.不利于并行计算;2.误差传递;3.需要初始化向量IV 3.3CFBf式:高11位 高口位蕨它/"块明文块1 Y)f密文块1匚 这种模式称为OFB模式,又称输出反馈模W优点:1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送小于分组的数据;缺点:1.不利于并行计算;2.对明文的主动攻击是可能的;3.误差传送:一个明文单元损坏影响多个单元;K高口位明文块1-密
26、文块ci高口位明文块1bGH 密文块1这种模式称为CFB模式,又称密码反馈模式优点:1.隐藏了明文模式;2.分组密码转化为流模式;3.可以及时加密传送 小于分组的数据;缺点:1.不利于并行计算;2.误差传送:一个明文单元损坏影响多个单元;3.唯一的IV; 3.4 OFB 模式:卜面是示例代码:javaview plaincopy1. package2.3. import4. import5.6. public7. 8.9.10.length 11.mini.code.test.t20120810;javax.crypto.*;javax.crypto.spec.*;class AESpubli
27、c static String asHex(byte buf) StringBuffer strbuf = new StringBuffer(buf. * 2);int i;12. for (i = 0; i < buf.length; i+)13. 14. if ( int ) bufi & 0xff )< 0x10)15. strbuf.append( "0");16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.strbuf.append(Long.toString( in t) bufi & 0
28、xff ,16); return strbuf.toString(); public static void main(String口 args) throws Exc eptionString message :System.out.println(=”这是个加密的例子""原文:"+ message);System.out.println("原文转换格式显示:+asHex(message.getBytes(); / string/= = = = = =生成密码=byte =Hex("AES"); /获取密匙生成器KeyGenerator kgen = KeyGene
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电瓶车保险相关知识培训课件
- 北京五年级考试数学题及答案
- 电焊工职业健康知识培训课件
- 高温防护安全知识培训课件
- 2-Ethyl-ss-ketobutiryl-SCoA-2-Ethyl-ss-ketobutiryl-coenzyme-A-生命科学试剂-MCE
- 新解读《GB-T 25122.1-2018轨道交通 机车车辆用电力变流器 第1部分:特性和试验方法》
- 会考物理考试题及答案
- 电焊学徒基础知识培训总结
- 保定动力技校考试题目及答案
- 蚌埠四中近期考试试卷及答案
- 国家职业技术技能标准 6-28-01-03 汽轮机运行值班员 人社厅发202226号
- GB/T 44633-2024电力突发事件信息报送技术规范
- 虹桥商务区核心区一期及南北片区集中供能专项规划
- 新人教版八年级数学上册教学计划及进度表
- 2024年新人教版地理七年级上册全册课件
- 灌浆施工工艺
- 古诗词诵读《无衣》课件+2024-2025学年统编版高中语文选择性必修上册
- 北京市西城外国语学校2024-2025学年高三上学期开学测试 数学试题含答案
- 实验室程序文件
- 北师大版数学三年级上册全册教案【完整版】
- GB/T 44260-2024虚拟电厂资源配置与评估技术规范
评论
0/150
提交评论