- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)