ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:19.67KB ,
资源ID:5398358      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5398358.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息安全技术RSA加密算法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息安全技术RSA加密算法.docx

1、信息安全技术RSA加密算法#include#include#include #include #include#include#define MAX 100#define LEN sizeof(struct slink)void sub(int aMAX,int bMAX ,int cMAX );struct slink int bignumMAX;/bignum98用来标记正负号,1正,0负bignum99来标记实际长 struct slink *next;/大数运算void print( int aMAX ) int i; for(i=0;il2) return 1; if (l1=0;i

2、-) if (a1ia2i) return 1 ; if (a1ia2i) return -1; return 0;void mov(int aMAX,int *b)int j;for(j=0;jMAX;j+) bj=aj; return ;/大数相乘(向左移)void mul(int a1MAX,int a2MAX,int *c)int i,j,y,x,z,w,l1,l2;l1=a1MAX-1;l2=a2MAX-1;if (a1MAX-2=-& a2MAX-2=-) cMAX-2=0;else if (a1MAX-2=-) cMAX-2=-;else if (a2MAX-2=-) cMAX-

3、2=-;for(i=0;il1;i+)for(j=0;jl2;j+) x=a1i*a2j; y=x/10; z=x%10; w=i+j; cw=cw+z; cw+1=cw+1+y+cw/10; cw=cw%10;w=l1+l2;if(cw-1=0)w=w-1;cMAX-1=w;return; /大数相加,注意进位void add(int a1MAX,int a2MAX,int *c)int i,l1,l2;int len,tempMAX;int k=0;l1=a1MAX-1;l2=a2MAX-1;if(a1MAX-2=-)&(a2MAX-2=-)cMAX-2=-;else if (a1MAX-

4、2=-)mov(a1,temp);tempMAX-2=0;sub(a2,temp,c);return;else if (a2MAX-2=-)mov(a2,temp);temp98=0;sub(a1,temp,c);return;if(l1l2)len=l1;else len=l2;for(i=0;ilen)for(i=len;il1;i+) ci=(a1i+k)%10; k=(a1i+k)/10; if(k!=0) cl1=k; len=l1+1;else len=l1;elsefor(i=len;il2;i+) ci=(a2i+k)%10; k=(a2i+k)/10; if(k!=0) cl

5、2=k; len=l2+1;else len=l2;c99=len;return;/大数相减,注意借位void sub(int a1MAX,int a2MAX,int *c)int i,l1,l2;int len,t1MAX,t2MAX;int k=0;l1=a1MAX-1;l2=a2MAX-1;if (a1MAX-2=-) & (a2MAX-2=-)mov(a1,t1); mov(a2,t2);t1MAX-2=0; t2MAX-2=0;sub(t2,t1,c);return;else if( a2MAX-2=-)mov(a2,t2);t2MAX-2=0;add(a1,t2,c);return

6、;else if (a1MAX-2=-)mov(a2,t2);t2MAX-2=-;add(a1,t2,c);return;if(cmp(a1,a2)=1)len=l2;for(i=0;ilen;i+)if (a1i-k-a2i)0)ci=(a1i-a2i-k+10)%10; k=1; else ci=(a1i-a2i-k)%10; k=0;for(i=len;il1;i+) if (a1i-k)显示为980了 len=l1-1; i=2; while (cl1-i=0)/111456-111450=00006,消除0后变成了6 len=l1-i; i+; else len=l1;elseif(

7、cmp(a1,a2)=(-1)cMAX-2=-;len=l1;for(i=0;ilen;i+)if (a2i-k-a1i)0)ci=(a2i-a1i-k+10)%10; k=1; else ci=(a2i-a1i-k)%10; k=0;for(i=len;il2;i+) if (a2i-k)0)ci=(a2i-k+10)%10; k=1; else ci=(a2i-k)%10; k=0; if(cl2-1=0) len=l2-1; i=2; while (cl1-i=0) len=l1-i; i+; else len=l2;else if(cmp(a1,a2)=0) len=1; clen-1

8、=0; cMAX-1=len;return;/取模数void mod(int aMAX,int bMAX,int *c)/c=a mod b,注意:经检验知道此处A和C的数组都改变了 int dMAX;mov (a,d);while (cmp(d,b)!=(-1)/c=a-b-b-b-b-b.until(cb) sub(d,b,c); mov(c,d);/c复制给a return ;/大数相除(向右移)/试商法,调用以后w为a mod b, C为a div bvoid divt(int tMAX,int bMAX,int *c ,int *w)int a1,b1,i,j,m;/w用于暂时保存数

9、据int dMAX,eMAX,fMAX,gMAX,aMAX;mov(t,a); for(i=0;iMAX;i+) ei=0;for(i=0;iMAX;i+) di=0;for(i=0;i=0;i-)/例如341245/3=341245-300000*1-41245-30000*1-11245-3000*3-2245-300*7-145-30*4=25-25-3*8=1 for(j=0;jMAX;j+) dj=0; di=1; dMAX-1=i+1; mov(b,g); mul(g,d,e); while (cmp(a,e)!=(-1) ci+; sub(a,e,f); mov(f,a);/f复

10、制给g for(j=i;jMAX;j+)/高位清零 ej=0;mov(a,w);if (cm=0) cMAX-1=m;else cMAX-1=m+1;return;/解决了 m=a*b mod nvoid mulmod(int aMAX ,int bMAX ,int nMAX,int *m)int cMAX,dMAX;int i;for(i=0;iMAX;i+) di=ci=0;mul(a,b,c); divt(c,n, d,m); for(i=0;imMAX-1;i+)printf(%d,mmMAX-1-i-1); printf(nm length is : %d n,mMAX-1);/解决

11、了 m=ap mod n的函数问题。void expmod(int aMAX ,int pMAX ,int nMAX,int *m)int tMAX,lMAX,tempMAX; /t放入2,l放入1int wMAX,sMAX,cMAX,bMAX,i;for(i=0;iMAX-1;i+) bi=li=ti=wi=0;t0=2;tMAX-1=1;l0=1;lMAX-1=1; mov(l,temp);mov(a,m); mov(p,b);while(cmp(b,l)!=0) for(i=0;iMAX;i+)wi=ci=0; divt(b,t,w,c);/ c=p mod 2 w= p /2 mov(

12、w,b);/p=p/2if(cmp(c,l)=0) /余数c=1for(i=0;iMAX;i+)wi=0;mul(temp,m,w);mov(w,temp);for(i=0;iMAX;i+)wi=ci=0;divt(temp,n,w,c);/c为余c=temp % n,w为商w=temp/nmov(c,temp);for(i=0;iMAX;i+)si=0;mul(m,m,s);/s=a*afor(i=0;iMAX;i+)ci=0;divt(s,n,w,c);/w=s/n;c=s mod nmov (c,m);for(i=0;iMAX;i+)si=0;mul(m,temp,s);for(i=0;

13、iMAX;i+)ci=0;divt(s,n,w,c);mov (c,m);/余数s给mmMAX-2=aMAX-2;/为后面的汉字显示需要,用第99位做为标记return;/k=temp*k%nint is_prime_san(int pMAX ) int i,aMAX,tMAX,sMAX,oMAX; for(i=0;iMAX;i+) si=oi=ai=ti=0; t0=1; tMAX-1=1; a0=2;/ 2,3,5,7 aMAX-1=1; sub(p,t,s); expmod ( a, s, p ,o); if ( cmp(o,t) != 0 ) return 0; a0=3; for(i

14、=0;iMAX;i+) oi=0; expmod ( a, s, p ,o); if ( cmp(o,t) != 0 ) return 0; a0=5; for(i=0;iMAX;i+) oi=0; expmod ( a, s, p ,o); if ( cmp(o,t) != 0 ) return 0; a0=7; for(i=0;iMAX;i+) oi=0; expmod ( a, s, p ,o);if ( cmp(o,t) != 0 ) return 0;return 1;/检测两个大数之间是否互质int coprime(int eMAX,int sMAX) int aMAX,bMAX,

15、cMAX,dMAX,oMAX,lMAX; int i;for(i=0;iMAX;i+) li=oi=ci=di=0;o0=0;oMAX-1=1;l0=1;lMAX-1=1;mov(e,b);mov(s,a);doif(cmp(b,l)=0) return 1;for(i=0;iamov(c,b);/c-bwhile(cmp(c,o)!=0);/printf(They are not coprime!n)return 0;/产生随机素数p和qvoid prime_random(int *p,int *q)int i,k;time_t t; p0=1;q0=3;/ p19=1;/ q18=2;pM

16、AX-1=10; qMAX-1=11;do t=time(NULL); srand(unsigned long)t);for(i=1;ipMAX-1-1;i+)k=rand()%10;pi=k;k=rand()%10;while (k=0) k=rand()%10;ppMAX-1-1=k;while(is_prime_san(p)!=1); printf(素数 p 为 : ); for(i=0;ipMAX-1;i+)printf(%d,ppMAX-1-i-1); printf(nn); do t=time(NULL); srand(unsigned long)t);for(i=1;iqMAX-

17、1;i+)k=rand()%10;qi=k;while(is_prime_san(q)!=1); printf(素数 q 为 : ); for(i=0;iqMAX-1;i+)printf(%d,qqMAX-1-i-1); printf(nn);return;/产生与(p-1)*(q-1)互素的随机数void erand(int eMAX,int mMAX)int i,k;time_t t;eMAX-1=5;printf(随机产生一个与(p-1)*(q-1)互素的 e :); do t=time(NULL); srand(unsigned long)t);for(i=0;ieMAX-1-1;i+

18、)k=rand()%10;ei=k;while(k=rand()%10)=0) k=rand()%10;eeMAX-1-1=k;while(coprime( e, m)!=1); for(i=0;ieMAX-1;i+)printf(%d,eeMAX-1-i-1); printf(nn);return ;/根据上面的p、q和e计算密钥dvoid rsad(int eMAX,int gMAX,int *d)int rMAX,n1MAX,n2MAX,kMAX,wMAX;int i,tMAX,b1MAX,b2MAX,tempMAX;mov(g,n1);mov(e,n2);for(i=0;iMAX;i+

19、) ki=wi=ri=tempi=b1i=b2i=ti=0;b1MAX-1=0;b10=0;/b1=0;b2MAX-1=1;b20=1;/b2=1;while(1)for(i=0;iMAX;i+) ki=wi=0; divt(n1,n2,k,w);/k=n1/n2;for(i=0;iMAX;i+) tempi=0; mul(k,n2,temp);/temp=k*n2; for(i=0;iMAX;i+) ri=0; sub(n1,temp,r); if(rMAX-1=1) & (r0=0)/r=0 break; else mov(n2,n1);/n1=n2; mov( r,n2);/n2=r;

20、mov(b2, t);/t=b2; for(i=0;iMAX;i+) tempi=0; mul(k,b2,temp);/b2=b1-k*b2; for(i=0;iMAX;i+) b2i=0; sub(b1,temp,b2); mov(t,b1); for(i=0;iMAX;i+) ti=0; add(b2,g,t); for(i=0;iMAX;i+) tempi=di=0; divt(t,g,temp,d); printf(由以上的(p-1)*(q-1)和 e 计算得出的 d : ); for(i=0;idMAX-1;i+)printf(%d,ddMAX-1-i-1); printf(nn);

21、/求解密密钥d的函数(根据欧几里得算法)unsigned long rsa(unsigned long p,unsigned long q,unsigned long e) /求解密密钥d的函数(根据欧几里得算法)unsigned long g,k,r,n1,n2,t;unsigned long b1=0,b2=1;g=(p-1)*(q-1);n1=g;n2=e; while(1) k=n1/n2; r=n1-k*n2;if(r!=0) n1=n2; n2=r; t=b2; b2=b1-k*b2; b1=t;else break; return (g+b2)%g;/加密和解密void prin

22、tbig(struct slink *h)struct slink *p; int i;p=(struct slink * )malloc(LEN);p=h; if(h!=NULL)do for(i=0;ibignumMAX-1;i+) printf(%d,p-bignump-bignumMAX-1-i-1); p=p-next;while(p!=NULL); printf(nn);struct slink *input(void)/输入明文并且返回头指针,没有加密时候转化的数字 struct slink *head;struct slink *p1,*p2; int i,n,c,temp;

23、char ch; n=0;p1=p2=(struct slink * )malloc(LEN);head=NULL;printf(n请输入你所要加密的内容 : n);while(ch=getchar()!=n) i=0;c=ch;if(cbignumMAX-2=0; else p1-bignumMAX-2=1;while(c/10!=0) temp=c%10; c=c/10; p1-bignumi=temp; i+;p1-bignumi=c; p1-bignumMAX-1=i+1;n=n+1;if(n=1) head=p1;else p2-next=p1;p2=p1; p1=(struct slink * )malloc(LEN);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1