AES中构造s盒中的乘法逆元的c语言实现

来源:互联网 发布:c 小程序源码下载 编辑:程序博客网 时间:2024/05/21 02:52
#include<stdio.h>#include<string.h>//二进制字符串转化成十进制int bits_dec(char binary[]){    int len=strlen(binary);    int i;    int sum=0,value=1;    for (i=len-1;i>=0;i--)    {        if(binary[i]=='1')            sum+=value;        value*=2;    }    return sum;}//计算一个十进制数的二进制表示时的位数有多大//直接计算右移了多少位就可int numb_bits(int v){    int count=0;    while(v>0)    {        v=v>>1;        count++;    }    return count;}//输出一个十进制数的二进制表示void printf_bit(int a){    int n=numb_bits(a);    int i;    for(i=n-1;i>=0;i--)    {        if(1<<i & a)            printf("1");        else            printf("0");    }}//多项式除法int polydivide(int a,int b,int *remainder ){    int tmp;    int c=numb_bits(a)-numb_bits(b);    int value=0;    while(c>=0)    {        value=(1<<c) | value; //计算商,这时计算的c值就是每一个是1的位置,直接与1相与,就可以将其设置为1        tmp=b;//将被除数向左移c位再与a相与,并赋给a        tmp=tmp<<c;        a=a^tmp;        c=numb_bits(a)-numb_bits(b);    }    *remainder=a;    return value;    }//多项式乘法,算法就是书上96的算法int polyMulti(int a,int b){    int value=a;    int result=a;    int r;    if(a==0 || b==0)        return 0;    r=b%2;    b=b/2;    if(!r)  //判断最后一位是0还是1,是0的话result就等于0        result=0;    while(b)    {        r=b%2;        b=b/2;        if(value>>7) //b7为1,就要与00011011相与            value=(value<<1) & 0xff ^27;        else            value=(value<<1) & 0xff;        if(r) //位为1的结果就参加异或运算            result=result ^ value;    }         return result;}//扩展的欧几里德算法int Ext_Euclid(int a,int b){    int tmp;    if(a<b)    {        tmp=a;        a=b;        b=tmp;    }    int x0,y0,x1,y1;//初始化条件    x0=1;    y0=0;    x1=0;    y1=1;    int tmp1,tmp2;    int r1,r2,q1;    r1=a;    r2=b;    int i=1;    //下面直接用扩展欧几里德算法来做    while(r2)    {        tmp1=r2;        q1=polydivide(r1,r2,&r2);//r1对r2进行多项式除法,商存在q1,余数存在r2        r1=tmp1;//这步比较重要,就是r1要变成上一次除法的被除数        printf("q%d:\t",i);        printf_bit(q1);        printf("\tr%d:\t",i);        printf_bit(r2);        tmp1=x1;        tmp2=y1;        x1=x0 ^ polyMulti(q1,x1);  //计算v,w;每一个v(x)*f(x)+w(x)*g(x)=1成立        y1=y0 ^ polyMulti(q1,y1);        printf("\tv%d:\t",i);        printf_bit(x1);        printf("\tw%d:\t",i);        printf_bit(y1);        printf("\n\n");        x0=tmp1;        y0=tmp2;        i++;    }    return y0;}int  main(){    char c1[64],c2[64];    printf("请输入两个二进串(中间以空格隔开):\n");    scanf("%s%s",c1,c2);    printf_bit(Ext_Euclid(bits_dec(c1),bits_dec(c2)));    printf("\n");}

测试结果:


0 0
原创粉丝点击