- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AES算法描
分组密码 AES 算法 本节主要内容 1 AES 候选算法产生过程 2 Rijndael 的数学基础和设计思想 3 Rijndael 的算法说明 2.2 Rijndael 的设计思想 Rijndael 密码的设计力求满足以下 3 条标准: ①抵抗所有已知的攻击。 ②在多个平台上速度快,编码紧凑。 ③ 设计简单。 2.2 Rijndael 的设计思想 为实现宽轨迹策略,轮函数 3 个层中的每一层都有它自己的功能: 线性混合层:确保多轮之上的高度扩散; 非线性层:将具有最优的 最坏情况非线性特性 的 S 盒并行使用; 密钥加层:单轮子密钥简单地异或到中间状态上,实现一次性掩盖。 Rijndael 是一个迭代型分组密码,其分组长度和密钥长度都可变,各自可以独立地指定为 128 比特, 192 比特,256 比特。 1、AES 的数据处理方式 ①字节 ②字 ③状态 2 、状态 ①加解密过程中的中间数据。 ②以字节为元素的矩阵,或二维数组。 所有的操作都在状态上进行。 状态可以用以字节为元素的矩阵阵列表示,该阵列有 4 行,列数记为 Nb , Nb 等于分组长度除以 32 。 算法的输入(包括最初的明文输入和中间过程的轮输入)以字节为单位一 a00a10a20a30a01a11a21a31 … 的顺序放置到状态阵列中。 种子密钥以字节为单位按 k00k10k20k30k 01k11k21k31 … 的顺序放置到种子密钥阵列中 输出(包括中间过程的轮输出和最后的密文输出)也是以字节为单位按相同的顺序从状态阵列中取出 AES算法描述 见WORD图片 AES的算法结构不是Fesitel结构,它每一轮使用代换和混淆并行处理整个分组。因而扩散比DES算法更快。 Rijndael 的轮函数由 4 个不同的计算部件组成 分别是: 字节代换 BS ( ByteSub ),非线性层 行移位 SR ( ShiftRow ),线性层 列混合 MC ( MixColumn ),线性层 密钥加ARK( AddRoundKey ),线性层 字节代换是非线性变换,独立地对状态的每个字节进行。代换表(即 S-盒) ① S 盒变换是 AES 的唯一非线性变换,是 AES 安全的关键。 ② AES 使用 16 个相同的 S 盒, DES 使用 8 个不相同的 S 盒。 ③ AES 的 S 盒有 8 位输入,8 位输出, DES 的 S 盒有 6 位输入,4 位输出。 S-盒是可逆的,由以下两个变换的合成得到: ①首先,将字节看作 GF(28) 上的元素,映射到自己的乘法逆元, 00 映射到自己。 ②其次,对字节做如下的仿射变换: 图 3.20 行移位示意图( Nb=6 ) 设 b(x)= c(x) a (x) ,则 图 3.21 列混合运算示意图 密钥加是将轮密钥简单地与状态进行逐比特异或。 轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度 Nb 。 状态说与轮密钥 RoundKey 的密钥加运算表示为 AddRoundKey(State, RoundKey) 密钥编排指从种子密钥得到轮密钥的过程 它由密钥扩展和轮密钥选取两部分组成 其基本原则如下: (1)轮密钥的比特数等于分组长度乘以轮数加1; 例如要将 128 比特的明文经过 10 轮的加密,则总共需要( 10+1 )*128=1408 比特的密钥。 ( 2 )种子密钥被扩展成为扩展密钥; ( 3 )轮密钥从扩展密钥中取,其中第轮轮密钥取扩展密钥的前 Nb 个字,第 2 轮轮密钥取接下来的 Nb 个字,如此下去。 KeyExpansion (byteKey[4*Nk] , W[Nb*(Nr+1)]) { for (i =0; i Nk; i ++) W[i]=(Key[4* i],Key[4* i +1],Key[4* i +2],Key[4* i +3] ); //扩展密钥的前面4个字由种子密钥组成 for (i =Nk; i Nb*(Nr+1); i ++) { temp=W[i-1]; if (i % Nk= =0) temp=SubByte (RotByte (temp))^Rcon[i /Nk]; //i是NK的整数倍是要特殊处理 W[i]=W[i-Nk]^ temp; } } KeyExpansion (byte Key[4*Nk] , W[Nb*(Nr+1)]) { for (i=0; i Nk; i ++) W[i]=(Key[4* i], Key[4* i +1], Key[4* i +2], Key
文档评论(0)