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
- AES中构造s盒中的乘法逆元的c语言实现
- AES:有限域的多项式乘法逆元求解
- c实现的求两个数的乘法逆元
- AES 加密算法的 C 语言实现
- AES 加密算法的 C 语言实现
- 矩阵的乘法和求逆(C语言实现)
- 矩阵乘法的C语言实现
- AES的S盒
- C语言中的高精度乘法
- 矩阵乘法C语言实现
- C语言实现矩阵乘法
- C语言实现矩阵乘法
- C语言实现AES(标准方法)
- C语言实现AES加密解密
- C语言实现AES-128 CMAC算法
- 【密码学】C语言实现AES核心步骤
- 乘法逆元的求法
- 乘法逆元的作用
- 黑马程序员---Java基础编程
- 子节点与父节点错误总结
- VS中使用sqlite静态连接
- HONGJIN2只需要按照他原来的设计继续码代码
- 程序自定义加载log4j配置文件
- AES中构造s盒中的乘法逆元的c语言实现
- VC2008 Express +OpenCV2.0使用CameraDS类的调试经历
- 将研发分为研究和开发
- 更改Wamp下网站地址栏图标的显示
- Struts1中ActionForward的技巧介绍
- HTTP访问的两种方式(HttpClient和HttpURLConnection)
- IOS开发笔记 代码篇
- Cocos2d-x 3.0 cocostudio骨骼动画的动态换肤
- 怎么样在真机测试ios APP