您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > RSA的C语言算法实现
RSARSARSARSA算法的CCCC语言实现一、RSA算法的描述1、选取长度相等的两个大素数p和q,计算其乘积:n=pq然后随机选取加密密钥e,使e和(p–1)(q–1)互素。最后用欧几里德扩展算法计算解密密钥d,以满足ed=1(mod(p–1)(q–1))即d=e–1mod((p–1)(q–1))e和n是公钥,d是私钥2、加密公式如下:ci=mi^e(modn)3、解密时,取每一密文分组ci并计算:mi=ci^d(modn)Ci^d=(mi^e)^d=mi^(ed)=mi^[k(p–1)(q–1)+1]=mimi^[k(p–1)(q–1)]=mi*1=mi4、消息也可以用d加密用e解密二、C源程序//RSA算法的C程序实现#includestdio.hintcandp(inta,intb,intc)//数据处理函数,实现幂的取余运算{intr=1;b=b+1;while(b!=1){r=r*a;r=r%c;b--;}printf(%d\n,r);returnr;}intfun(intx,inty)//公钥e与t的互素判断{intt;while(y){t=x;x=y;y=t%y;}if(x==1)return0;//x与y互素时返回0elsereturn1;//x与y不互素时返回1}voidmain(){intp,q,e,d,m,n,t,c,r;printf(请输入两个素数p,q:);scanf(%d%d,&p,&q);n=p*q;printf(计算得n为%3d\n,n);t=(p-1)*(q-1);//求n的欧拉数printf(计算得t为%3d\n,t);printf(请输入公钥e:);scanf(%d,&e);if(e1||et||fun(e,t)){printf(e不合要求,请重新输入:);//e1或et或e与t不互素时,重新输入scanf(%d,&e);}d=1;while(((e*d)%t)!=1)d++;//由公钥e求出私钥dprintf(经计算d为%d\n,d);printf(加密请输入1\n);//加密或解密选择printf(解密请输入2\n);scanf(%d,&r);switch(r){case1:printf(请输入明文m:);//输入要加密的明文数字scanf(%d,&m);c=candp(m,e,n);printf(密文为%d\n,c);break;case2:printf(请输入密文c:);//输入要解密的密文数字scanf(%d,&c);m=candp(c,d,n);printf(明文为%d\n,m);break;}}三、程序运行结果及相关说明主函数实现求N的欧拉数、由公钥求解私钥、加密解密选择以及相应的密文明文输出。子函数candp实现加密解密时的求幂取余运算,fun实现e与t的互素判断,已验证e是否符合要求。程序主体参考了网上的相关RSA算法程序,我对其中e的合法性判断、主函数实现的顺序以及相关提示信息做了补充与修改并加上了注释,这样程序可读性更强,运行时更容易操作,思路也更加严密。当P=43,q=59时,对134进行加密,运行结果如下:第一次取e为15,与t不互素,提示需重新输入,输入13后,便可以进行正确操作。由于int型变量为十六位,因此n最大只能小于65536,此程序只是对RSA算法的入门,无法实现达到安全要求的数据位数。
本文标题:RSA的C语言算法实现
链接地址:https://www.777doc.com/doc-5395183 .html