sms4算法中的s盒的构造是由三个函数复合而成的,公式为S(x)=L(I(L(x))),其中L(x)是仿射变换,而I(x)是逆变换。
仿射变换较为简单,而在模2的伽罗瓦域上求多项式的逆则比较复杂。
基本的假设是:对于数字1011,表示的是x^3+x+1,即二进制数的第n位为1时表示x^(n-1)
S盒仿射变换实现
int change(int x){ int A1=0xA7; int flag; int result=0; int tem; int flag2; for(int i=0;i<8;i++){ flag=(A1 & 0x80)>>7; tem=x & A1; flag2=0; for(int j=0;j<8;j++){ flag2^=(tem & 1); tem>>=1; } result=result | (flag2<<i); A1=(A1<<1) | flag; } result^=0xd3; return result; }
模2的伽罗瓦域上求多项式的逆
在模2的伽罗瓦域上的多项式的加法和减法都是异或运算
在模2的伽罗瓦域上的多项式乘法实现
int multiplication(int a,int b){ int tem=0; int i=0; while(b){ if(b&1){ tem^=a<<i; } i++; b>>=1; } return tem; }
在模2的伽罗瓦域上的多项式除法实现
int length(int x){ int i=0; int comp=1; while(1){ if(comp>=x){ return i; } comp=(comp<<1)+1; i++; } } void division(int a,int b,int* round,int* left){ *round=0; *left=0; int distance; while(1){ distance=length(a)-length(b); if(distance>=0 && a){ a=a ^ (b<<distance); *round=(*round) | (1<<distance); }else{ *left=a; break; } } }
在模2的伽罗瓦域上的多项式求逆(采用扩展欧几里德算法)
//该函数表示在模a的情况下,b的逆 int inverse(int a,int b){ int x2=1; int x1=0; int y2=0; int y1=1; int temX1,temY1; int q,r,x,y; int i; while(b){ division(a,b,&q,&r); //x=x2^multiplication(q,x1); y=y2^multiplication(q,y1); a=b; b=r; //x2=x1; //x1=x; y2=y1; y1=y; } return y2; }
打印S盒的结果
int main(void) { for(int i=0;i<=0xf;i++) printf("\t%x",i); printf("\n"); for(int i=0;i<=0xf;i++){ printf("%x",i); for(int j=0;j<=0xf;j++){ printf("\t%x",change(inverse(0x1f5,change((i<<4)|j)))); } printf("\n"); } return 0; }