- 1、本文档共46页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四讲:分组密码3.ppt
分组密码(三) 上讲内容回顾 DES算法的整体结构——Feistel结构 DES算法的轮函数 DES算法的密钥编排算法 DES的解密变换 本节主要内容 AES算法的整体结构 AES算法的轮函数 AES算法的密钥编排算法 AES的解密变换 DES的扩散和AES的扩散 AES算法的整体结构 Rijndael 由比利时的Joan Daemen和Vincent Rijmen设计,算法的原型是Square算法,经过修改后确定为高级数据加密标准AES. 典型的SPN结构 有较好的数学理论作为基础;结构简单、速度快 AES算法的整体结构 AES算法的轮函数 Rijndael的轮函数由4个变换组成,依次为: 1)字节代换(SubByte) 2)行移位(ShiftRow) 3)列混合(MixColumn) 4)密钥加(AddRoundKey) 1) 字节代换(ByteSub) 字节代换是非线形变换,独立地对状态的每个字节进行,代换表(即S-盒)是可逆的. 2) 行移位(ShiftRow) 行移位是将状态阵列的各行进行循环移位,不同状态行的位移量不同: 第0行不移动, 第1行循环左移C1个字节, 第2行循环左移C2个字节, 第3行循环左移C3个字节。 位移量C1、C2、C3的取值与Nb有关,由下表给出: 3)列混合(MixColumn) 列混合变换中,将状态阵列的每列视为GF((28)4)上的多项式,再与一个固定的多项式c(x)进行模x4+1乘法. Rijndael的设计者给出的c(x)为(系数用十六进制数表示): c(x)=‘03’x3+‘01’x2+‘01’x+‘02’ 列混合运算示意图 列混合运算也可写为矩阵乘法. 设b(x)= c(x)a(x),则 AES算法的轮函数 GF(28)的多项式乘法,约化多项式为 m(x)=x8+x4+x3+x+1 例:57x乘以83x (x6+x4+x2+x+1) × (x7+x+1) = (x13+x11+x9+x8+x7)^ (x7+x5+x3+x2+x)^ (x6+x4+x2+x+1) = x13+x11+x9+x8+x6+x5+x4+x3+1 =x7+x6+1 mod m(x) 4) 密钥加(AddRoundKey) 密钥加是将轮密钥简单地与状态进行逐比特异或. 轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb. 注. 结尾轮的轮函数与前面各轮不同,将MixColumn这一步去掉. 密钥编排指从种子密钥得到轮密钥的过程,AES的密钥编排由密钥扩展和轮密钥选取两部分组成,其基本原则如下: 1)轮密钥的总比特数等于轮数加1再乘以分组长度;如128比特的明文经过10轮的加密,则总共需要(10+1)*128=1408比特的密钥. 2)种子密钥被扩展成为扩展密钥; 3)轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前Nb个字,第2轮轮密钥取接下来的Nb个字,依次类推. 1) 密钥扩展 扩展密钥是以4字节字为元素的一维阵列,表示为W[Nb* (Nr+1)],其中前Nk个字取为种子密钥,以后每个字按递归方式定义.扩展算法根据Nk≤6和Nk6有所不同。 当Nk≤6时,扩展算法如下: 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] ); for (i =Nk; i Nb*(Nr+1); i ++) { temp=W[i-1]; if (i % Nk= =0) temp=SubByte (RotByte (temp))^Rcon[i /Nk]; W[i]=W[i-Nk]^ temp; } } Key[4*Nk]为种子密钥,看作以字为元素的一维阵列; 函数SubByte ( )返回4字节字,其中每一个字节都是用Rijndael的S盒作用到输入字对应的字节得到; 函数RotByte ( ) 也返回4字节字,该字由输入的字循环移位得到,即当输入字为(a, b, c, d)时,输出字为 (b, c, d, a). 当Nk6时,扩展算法如下: 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[4*
文档评论(0)