s盒的构造及c语言实现.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
S盒的构造及C语言实现 在AE導法中,字节代换的设计是加密算法设计的主要部分之一?其设计不仅考虑到抗差分密码 分析 和线性密码分析, 而且还考虑到抗代数计算的攻击, 目的是保证整个密码系统的安全性. 字节代 换要求Nr轮的加密过程都要对状态矩阵中的字节求其在有限域 GF(2。)上的乘法逆元和作 GF(2) 上的仿射变换,以使它的差分均匀性和线性偏差都达 到最佳,这就要多次用到大运算量的非线性字 节变换操作.由于在有限域 GF(2o )上共有256个元素,而每个元素在特定的模运算下存在逆元, 我们则可以预先通过一定的算法计算岀每个元素的乘法逆元,再经相应的仿射变换后做成一个 8 位输入8位输岀的s盒,供各轮字节代换和密钥操作的调用, 从而可以缩短明文加密时间, 提高整 体加密效率. 2. 1有限域GF(2o )乘法逆元 算法中,状态的每一个字节的 8位二进制数都可以以多项式的形式表示成有限域 GF(2 )上的元 素,如 u f 八 J fi ],表示成多项式的形式: □ 1X +血护+ 05 X5 +血兀4 +⑷『+ ?『+山工+创二 X GmX1 要计算 GE(2e) 上的乘法,必须先确定一个 GF(2吕)上的8次不可约多项式m(x ),对于AES 密码,这个8次不可约多项式确定为: ” 1二上一厂I ■-十* 一 ■!(十六进制表示为 11B”).有限域GF(2 )上的乘法取逆可用:“ ’「小I |表示,a(x)是用多 项式表示的状态字节,打 气I为乘法取逆后的输出. 2. 2 GF(2)仿射变换 仿射变换 对状态字节在有限域 GF(2o )上的乘法逆元进行字节变换操作,设输入字节为 门F门,门 —rl:g,经过仿射变换后的输岀字节为 则有下面 的变换关系: 的变换关系: 为二进制十六进制的63.用矩阵表示的仿射变换为: 抚1t.10001 1 抚1 t. 10001 1 1 ] 1 11 0 0 0 11 1 1 1110 0 0 11 ?2 0 ]1 ] ] 0 0 0 1 0 111110 0 0 04 T 0 0 111110 0 山 ] Q 0 1 1 1 1 J 0 斑1 1 Lo 0 0 1 1 1 1 1_ .0_ 此矩阵运算,实际可以转换成字节的位运算: 矩阵第一行由低位到高位二进制为: [1 0 0 0 1 1 1 1], 换成16进制为:0xF1o类似的,剩下的几行可以顺次表示成:0xe3,0xc7,0x8f,0x1f,0x3e,0x7c,0xf8 这些十六进制数存放在数组b[]中。实现上述矩阵的乘法就可以转化成 S盒的B仁b[0]Ai+b[1]Ai+ ??+b[7]Ai+0x63. S盒的 2. 3 s盒的C语言实现 unsigned char S_BOX[256] = {0};// 用于存储 S盒 void gen_table(void)〃 实现 S盒函数 { unsigned char pow_tab[256]; unsigned char log_tab[256]; unsigned char mid_tab[256]; unsigned char sbx_tab[256]; unsigned char b[8] = {0xf1,0xe3,0xc7,0x8f,0x1f,0x3e,0x7c,0xf8}; int i,j,k,p; // 求0-255的可逆项 for (i =0,p=1;i256;i++) { pow_tab[i] = p; log_tab[p] = i; p = pA(p1)A(p0x80?0x11b:0); } for (i = 0;i256;i++) { mid_tab[i] = (i?pow_tab[255-log_tab[i]]:0); } // 求0-255的可逆项 并存储在 mid_tab 中 for (i = 0;i256;i++) { int t = 0,m = 0,mid = 0,tab = 0; for (j =0;j8;j++) { m=mid=(b[j]mid_tab[i]);〃 实现公式中的 b[0]Ai+b[1]Ai+ ?- +b[7]Ai for (k=0;k8;k++) { int n=(mid1) ; if (m!=(n1)) { t++; } mid = n; m = mid; } if (t%20) int temp = 1; for (k=O;kj;k++) { temp = temp?1; } tab +=temp; } t = 0; 实现公式中的+0x63 实现公式中的+0x63 sbx_tab[i] = tabA0x63;// } //以下是拷贝存储并打印相关信息 memcpy(S_BOX,sbx_tab,256

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档