- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * (4) 密钥加(AddRoundKey) 密钥加是将轮密钥简单地与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。 状态State与轮密钥RoundKey的密钥加运算表示为: AddRoundKey (State, RoundKey) 密钥加运算示意图 密钥加运算的逆运算是其自身。 综上所述,组成Rijndael轮函数的计算部件简捷快速,功能互补。轮函数的伪C代码如下: Round (State, RoundKey) { ByteSub (State); ShiftRow (State); MixColumn (State); AddRoundKey (State, RoundKey) } 结尾轮的轮函数与前面各轮不同,将MixColumn这一步去掉,其伪C代码如下: FinalRound (State, RoundKey) { ByteSub (State); ShiftRow (State); AddRoundKey (State, RoundKey) } 在以上伪C代码记法中,State、RoundKey 可用指针类型,函数Round、FinalRound、ByteSub、ShiftRow、MixColumn、AddRoundKey都在指针State、RoundKey所指向的阵列上进行运算。 3. 密钥编排 密钥编排指从种子密钥得到轮密钥的过程,它由密钥扩展和轮密钥选取两部分组成。其基本原则如下: 轮密钥的比特数等于分组长度乘以轮数加1; 种子密钥被扩展成为扩展密钥; 轮密钥从扩展密钥中取,其中第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)。 可以看出,扩展密钥的前Nk个字即为种子密钥,之后的每个字W[i]等于前一个字W[i-1]与Nk个位置之前的字W[i- Nk]的异或;不过当i/Nk为整数时,须先将前一个字W[i-1]经过以下一系列的变换: 1字节的循环移位RotByte→用S盒进行变换SubByte→异或轮常数Rcon[i/Nk]。 ② 当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* 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]; else if (i % Nk==4) temp=SubByte (temp); W[i]=W[i - Nk]^ temp; } } Nk6与Nk≤6的密钥扩展算法的区别在于:当i为N
您可能关注的文档
最近下载
- 机械CAD:CAM(UG)教案新模板(课次4)2-3 压板的草图绘制.doc VIP
- 富士XA5说明书.pdf VIP
- 针灸学习题集全.pdf VIP
- 固相反应第一节引言第二节固相反应机理第三节固相反应动.ppt VIP
- 肇兴侗寨旅游地用地格局演变.docx VIP
- 2025至2030年中国硼-10酸行业竞争格局及投资战略规划研究报告.docx
- GB_T13077—2024铝合金无缝气瓶定期检验与评定.pdf VIP
- 贝克休斯钻井堵漏材料及工艺.pdf VIP
- 红树林生态系统预警监测与评估体系技术指南.docx
- (高清版)DB1310∕T 286-2022 林木食叶害虫防治效果评价验收规范.pdf VIP
文档评论(0)