📄 s-box.h
字号:
char WeightB[256];
unsigned char NB256[256];
unsigned char S_Box[256];
unsigned char S_BoxN[256];
//造8比特01表
void Weight01()
{
int i,j;
memset(WeightB,0,256);
for(i=0;i<256;i++)
for(j=0;j<8;j++) WeightB[i]^=i>>j&1;
}
//多项式乘法 (a*b)mod m
inline unsigned char Multi_poly(unsigned char a,unsigned char b)
{
unsigned short c=0;
char i;
for(i=0;i<8;i++)
if(b>>i&1) c^=a<<i;
for(i=15;i>7;i--)
if(c>>i&1) c^=0x11b<<(i-8);
return((unsigned char) c);
}
//仿射变换
unsigned char FS_function(unsigned char a)
{
//unsigned char fsb[8]={0x52,0x29,0x94,0x4a,0x25,0x92,0x45,0xa4},tmp=0,i;
unsigned char fsb[8]={0xf8,0x7c,0x3e,0x1f,0x8f,0xc7,0xe3,0xf1},tmp=0,i;
//unsigned char fsb[8]={0x8f,0xc7,0xe3,0xf1,0xf8,0x7c,0x3e,0x1f},tmp=0,i;
for(i=0;i<8;i++)
tmp|=WeightB[a&fsb[i]]<<(7-i);
tmp^=0x63;
return(tmp);
}
//求逆表
void QNB()
{
int i,j;
memset(NB256,0,sizeof(NB256));
for(i=0;i<256;i++)
for(j=i;j<256;j++)
if(Multi_poly(i,j)==1) {NB256[i]=j;NB256[j]=i;}
}
//求S-盒
void QiuS_box()
{
Weight01();
QNB();
unsigned char tmpch;
for(int i=0;i<256;i++)
{
tmpch=FS_function(NB256[i]);
S_Box[i]=tmpch;
S_BoxN[tmpch]=i;
//printf("%02x ",S_Box[i]);
//if(i%16==15) printf("\n");
}
//printf("\n\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -