- 1、本文档共169页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SMS4解密的合理性 SMS4的密钥扩展算法 设加密密钥 ,其中 为字。轮密钥为 。轮密钥的生成方法如图4.11所示,具体为: MK0 MK1 MK1 MK1 K0 K1 K2 K3 FK1 FK2 FK3 Ki+4 Ki Ki+1 Ki+2 Ki+3 cki a0 a1 a2 a3 b0 b1 b2 b3 s s s s B13 B23 C A τ B rki SMS4的S盒构造 由三个函数复合而成 L1是仿射变换,I是逆变换 SMS4的安全性 差分故障攻击概述 SMS4安全性(续) SMS4安全性(续) SMS4安全性(续) * * 9,18,22,25,35,38,43,54 * * Stallings Fig 3.15 * * * * * * 上述S-盒对状态的所有字节所做的变换记为 ByteSub (State) 图3.19 字节代换示意图 行移位 将状态阵列的各行进行循环移位,不同行的移位量不同 0行:不动 1行:循环左移C1字节 2行:循环左移C2字节 3行:循环左移C3字节 记为:ShiftRow(State) 图3.20 行移位示意图 行移位 移位量与分组长度的关系 Nb C1 C2 C3 4 1 2 3 6 1 2 3 8 1 3 4 逆行移位InvShiftRows() 逆行移位变换是行移位变换的逆变换,它对状态的每一行进行循环右移,其中第一行保持不变,第二行循环右移1个字节,第三行循环右移2个字节,第四行循环右移3个字节。 列混合 将每列视为GF(28)上多项式,与固定的多项式c(x)进行模x4+1乘法,要求c(x)模x4+1可逆。 表示为MixColumn(State) c(x)是与x4+1互素的,因此是模x4+1可逆的。列混合运算也可写为矩阵乘法。设b(x)= c(x) a(x),则 图3.21 列混合运算示意图 逆列混合InvMixColumns() 逆列混合变换是列混合变换的逆,它将状态矩阵中的每一列视为系数在 上的次数小于4的多项式与同一个固定的多项式 d(x)相乘。 d(x)满足 (‘03’x3+‘01’x2+‘01’x+‘02’) d(x)=‘01’ 由此可得 d(x)=‘0B’x3+‘0D’x2+‘09’x+‘0E’ 同样,逆列混合可以写成矩阵乘法形式 密钥加 轮密钥与状态进行逐比特异或。 轮密钥由种子密钥通过密钥编排算法得到 轮密钥长度与分组密钥长度相同 表示为AddRoundKey(State,RoundKey) AES加密过程的伪代码 Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*Nr+1]) begin byte state[4,Nb] state = in AddRoundKey(state, w[0, Nb-1]) for round = 1 step 1 to Nr-1 SubBytes(state) ShiftRows(state) MixColumns(state) AddRoundKey(state, w[round*Nb, (round+1)*Nb-1]) end for SubBytes(state) ShiftRows(state) AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) Out = state end 轮函数的伪C代码 Round(State,RoundKey) { ByteSub(State); ShiftRow(State); MixColumn(State); AddRoundKey(State,Roundkey); } 结尾轮的轮函数 Round(State,RoundKey) { ByteSub(State); ShiftRow(State); AddRoundKey(State,Roundkey); } AES解密过程的伪代码 InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*Nr+1]) begin byte state[4,Nb] state = in AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) for round = Nr-1 step -1 downto 1 InvShiftRows(sta
文档评论(0)