RSA加解密算法.docx

上传人:b****4 文档编号:4242627 上传时间:2023-05-06 格式:DOCX 页数:40 大小:49.59KB
下载 相关 举报
RSA加解密算法.docx_第1页
第1页 / 共40页
RSA加解密算法.docx_第2页
第2页 / 共40页
RSA加解密算法.docx_第3页
第3页 / 共40页
RSA加解密算法.docx_第4页
第4页 / 共40页
RSA加解密算法.docx_第5页
第5页 / 共40页
RSA加解密算法.docx_第6页
第6页 / 共40页
RSA加解密算法.docx_第7页
第7页 / 共40页
RSA加解密算法.docx_第8页
第8页 / 共40页
RSA加解密算法.docx_第9页
第9页 / 共40页
RSA加解密算法.docx_第10页
第10页 / 共40页
RSA加解密算法.docx_第11页
第11页 / 共40页
RSA加解密算法.docx_第12页
第12页 / 共40页
RSA加解密算法.docx_第13页
第13页 / 共40页
RSA加解密算法.docx_第14页
第14页 / 共40页
RSA加解密算法.docx_第15页
第15页 / 共40页
RSA加解密算法.docx_第16页
第16页 / 共40页
RSA加解密算法.docx_第17页
第17页 / 共40页
RSA加解密算法.docx_第18页
第18页 / 共40页
RSA加解密算法.docx_第19页
第19页 / 共40页
RSA加解密算法.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

RSA加解密算法.docx

《RSA加解密算法.docx》由会员分享,可在线阅读,更多相关《RSA加解密算法.docx(40页珍藏版)》请在冰点文库上搜索。

RSA加解密算法.docx

RSA加解密算法

RSA加解密算法

1实验目的

了解RSA加解密算法

2实验内容

编程实现RSA加解密算法

3实验步骤

3.1选择素数p,q

选择p,q,p,q都是素数,

由于P和q都是大素数,所以为了方便由程序自动生成。

//产生随机素数p和q

voidprime_random(int*p,int*q)

{

inti,k;

time_tt;

p[0]=1;

q[0]=3;

//p[19]=1;

//q[18]=2;

p[MAX-1]=10;

q[MAX-1]=11;

do

{

t=time(NULL);

srand((unsignedlong)t);

for(i=1;i

{

k=rand()%10;

p[i]=k;

}

k=rand()%10;

while(k==0)

{

k=rand()%10;

}

p[p[MAX-1]-1]=k;

}while((is_prime_san(p))!

=1);

printf("素数p为:

");

for(i=0;i

{

printf("%d",p[p[MAX-1]-i-1]);

}

printf("\n\n");

do

{

t=time(NULL);

srand((unsignedlong)t);

for(i=1;i

{

k=rand()%10;

q[i]=k;

}

}while((is_prime_san(q))!

=1);

printf("素数q为:

");

for(i=0;i

{

printf("%d",q[q[MAX-1]-i-1]);

}

printf("\n\n");

return;

}

3.2选择整数e

整数e满足

//产生与(p-1)*(q-1)互素的随机数

voiderand(inte[MAX],intm[MAX])

{

inti,k;

time_tt;

e[MAX-1]=5;

printf("随机产生一个与(p-1)*(q-1)互素的e:

");

do

{

t=time(NULL);

srand((unsignedlong)t);

for(i=0;i

{

k=rand()%10;

e[i]=k;

}

while((k=rand()%10)==0)

k=rand()%10;

e[e[MAX-1]-1]=k;

}while(coprime(e,m)!

=1);

for(i=0;i

{

printf("%d",e[e[MAX-1]-i-1]);

}

printf("\n\n");

return;

}

3.3确定d

确定d使得

//根据上面的p、q和e计算密钥d

voidrsad(inte[MAX],intg[MAX],int*d)

{

intr[MAX],n1[MAX],n2[MAX],k[MAX],w[MAX];

inti,t[MAX],b1[MAX],b2[MAX],temp[MAX];

mov(g,n1);

mov(e,n2);

for(i=0;i

k[i]=w[i]=r[i]=temp[i]=b1[i]=b2[i]=t[i]=0;

b1[MAX-1]=0;b1[0]=0;//b1=0;

b2[MAX-1]=1;b2[0]=1;//b2=1;

while

(1)

{

for(i=0;i

k[i]=w[i]=0;

divt(n1,n2,k,w);//k=n1/n2;

for(i=0;i

temp[i]=0;

mul(k,n2,temp);//temp=k*n2;

for(i=0;i

r[i]=0;

sub(n1,temp,r);

if((r[MAX-1]==1)&&(r[0]==0))//r=0

{

break;

}

else

{

mov(n2,n1);//n1=n2;

mov(r,n2);//n2=r;

mov(b2,t);//t=b2;

for(i=0;i

temp[i]=0;

mul(k,b2,temp);//b2=b1-k*b2;

for(i=0;i

b2[i]=0;

sub(b1,temp,b2);

mov(t,b1);

}

}

for(i=0;i

t[i]=0;

add(b2,g,t);

for(i=0;i

temp[i]=d[i]=0;

divt(t,g,temp,d);

printf("由以上的(p-1)*(q-1)和e计算得出的d:

");

for(i=0;i

printf("%d",d[d[MAX-1]-i-1]);

printf("\n\n");

}

3.4加密函数

利用上面的函数我们可以得到

加密使用的公钥

加密函数如下所示:

加密函数:

//加密模块儿,例如C=P^emodn

structslink*jiami(inte[MAX],intn[MAX],structslink*head)

{

structslink*p;

structslink*h;

structslink*p1,*p2;

intm=0,i;

printf("\n");

printf("加密后形成的密文内容:

\n");

p1=p2=(structslink*)malloc(LEN);

h=NULL;

p=head;

if(head!

=NULL)

do

{

expmod(p->bignum,e,n,p1->bignum);

for(i=0;ibignum[MAX-1];i++)

{

printf("%d",p1->bignum[p1->bignum[MAX-1]-1-i]);

}

m=m+1;

if(m==1)

h=p1;

elsep2->next=p1;

p2=p1;

p1=(structslink*)malloc(LEN);

p=p->next;

}while(p!

=NULL);

p2->next=NULL;

p=h;

printf("\n");

return(h);

}

3.5解密函数

利用之前的函数我们可以得到

解密的私钥为

解密函数如下:

解密函数:

//解密模块儿,例如P=C^dmodn

voidjiemi(intd[MAX],intn[MAX],structslink*h)

{

inti,j,temp;

structslink*p,*p1;

charch[65535];

p1=(structslink*)malloc(LEN);

p=h;

j=0;

if(h!

=NULL)

do

{

for(i=0;i

p1->bignum[i]=0;

expmod(p->bignum,d,n,p1->bignum);

temp=p1->bignum[0]+p1->bignum[1]*10+p1->bignum[2]*100;

if((p1->bignum[MAX-2])=='0')

{

temp=0-temp;

}

ch[j]=temp;

j++;

p=p->next;

}while(p!

=NULL);

printf("\n");

printf("解密密文后所生成的明文:

\n");

for(i=0;i

printf("%c",ch[i]);

printf("\n");

return;

}

4实验结果

运行程序,系统自动生成公钥和私钥:

公钥为:

私钥为:

加密操作:

输入明文:

wangxinijfioajfioahgiuhaijfalijgoaijrgfiahguajdnandijuhaifhfuiah

输出密文,程序运行结果如下所示:

解密操作:

解密所用的密文就是上面加密得到的密文。

输出明文,程序运行结果如下所示:

5实验完整代码

#include

#include

#include

#include

#include

#include

#defineMAX100

#defineLENsizeof(structslink)

voidsub(inta[MAX],intb[MAX],intc[MAX]);

structslink

{

intbignum[MAX];

//bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长

structslink*next;

};

//大数运算

voidprint(inta[MAX])

{

inti;

for(i=0;i

printf("%d",a[a[99]-i-1]);

printf("\n\n");

return;

}

intcmp(inta1[MAX],inta2[MAX])

{intl1,l2;

inti;

l1=a1[99];

l2=a2[99];

if(l1>l2)

return1;

if(l1

return-1;

for(i=(l1-1);i>=0;i--)

{

if(a1[i]>a2[i])

return1;

if(a1[i]

return-1;

}

return0;

}

voidmov(inta[MAX],int*b)

{

intj;

for(j=0;j

b[j]=a[j];

return;

}

//大数相乘(向左移)

voidmul(inta1[MAX],inta2[MAX],int*c)

{

inti,j,y,x,z,w,l1,l2;

l1=a1[MAX-1];

l2=a2[MAX-1];

if(a1[MAX-2]=='-'&&a2[MAX-2]=='-')

c[MAX-2]=0;

elseif(a1[MAX-2]=='-')

c[MAX-2]='-';

elseif(a2[MAX-2]=='-')

c[MAX-2]='-';

for(i=0;i

{

for(j=0;j

{

x=a1[i]*a2[j];

y=x/10;

z=x%10;

w=i+j;

c[w]=c[w]+z;

c[w+1]=c[w+1]+y+c[w]/10;

c[w]=c[w]%10;

}

}

w=l1+l2;

if(c[w-1]==0)w=w-1;

c[MAX-1]=w;

return;

}

//大数相加,注意进位

voidadd(inta1[MAX],inta2[MAX],int*c)

{

inti,l1,l2;

intlen,temp[MAX];

intk=0;

l1=a1[MAX-1];

l2=a2[MAX-1];

if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-'))

{

c[MAX-2]='-';

}

elseif(a1[MAX-2]=='-')

{

mov(a1,temp);

temp[MAX-2]=0;

sub(a2,temp,c);

return;

}

elseif(a2[MAX-2]=='-')

{

mov(a2,temp);

temp[98]=0;

sub(a1,temp,c);

return;

}

if(l1

elselen=l2;

for(i=0;i

{

c[i]=(a1[i]+a2[i]+k)%10;

k=(a1[i]+a2[i]+k)/10;

}

if(l1>len)

{

for(i=len;i

{

c[i]=(a1[i]+k)%10;

k=(a1[i]+k)/10;

}

if(k!

=0)

{

c[l1]=k;

len=l1+1;

}

elselen=l1;

}

else

{

for(i=len;i

{

c[i]=(a2[i]+k)%10;

k=(a2[i]+k)/10;

}

if(k!

=0)

{

c[l2]=k;

len=l2+1;

}

elselen=l2;

}

c[99]=len;

return;

}

//大数相减,注意借位

voidsub(inta1[MAX],inta2[MAX],int*c)

{

inti,l1,l2;

intlen,t1[MAX],t2[MAX];

intk=0;

l1=a1[MAX-1];

l2=a2[MAX-1];

if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-'))

{

mov(a1,t1);

mov(a2,t2);

t1[MAX-2]=0;

t2[MAX-2]=0;

sub(t2,t1,c);

return;

}

elseif(a2[MAX-2]=='-')

{

mov(a2,t2);

t2[MAX-2]=0;

add(a1,t2,c);

return;

}

elseif(a1[MAX-2]=='-')

{

mov(a2,t2);

t2[MAX-2]='-';

add(a1,t2,c);

return;

}

if(cmp(a1,a2)==1)

{

len=l2;

for(i=0;i

{

if((a1[i]-k-a2[i])<0)

{

c[i]=(a1[i]-a2[i]-k+10)%10;

k=1;

}

else

{

c[i]=(a1[i]-a2[i]-k)%10;

k=0;

}

}

for(i=len;i

{

if((a1[i]-k)<0)

{

c[i]=(a1[i]-k+10)%10;

k=1;

}

else

{

c[i]=(a1[i]-k)%10;

k=0;

}

}

if(c[l1-1]==0)//使得数组C中的前面所以0字符不显示了,如1000-20=0980--->显示为980了

{

len=l1-1;

i=2;

while(c[l1-i]==0)//111456-111450=00006,消除0后变成了6

{

len=l1-i;

i++;

}

}

else

{

len=l1;

}

}

else

if(cmp(a1,a2)==(-1))

{

c[MAX-2]='-';

len=l1;

for(i=0;i

{

if((a2[i]-k-a1[i])<0)

{

c[i]=(a2[i]-a1[i]-k+10)%10;

k=1;

}

else

{

c[i]=(a2[i]-a1[i]-k)%10;

k=0;

}

}

for(i=len;i

{

if((a2[i]-k)<0)

{

c[i]=(a2[i]-k+10)%10;

k=1;

}

else

{

c[i]=(a2[i]-k)%10;

k=0;

}

}

if(c[l2-1]==0)

{

len=l2-1;

i=2;

while(c[l1-i]==0)

{

len=l1-i;

i++;

}

}

elselen=l2;

}

elseif(cmp(a1,a2)==0)

{

len=1;

c[len-1]=0;

}

c[MAX-1]=len;

return;

}

//取模数

voidmod(inta[MAX],intb[MAX],int*c)//c=amodb,注意:

经检验知道此处A和C的数组都改变了

{intd[MAX];

mov(a,d);

while(cmp(d,b)!

=(-1))//c=a-b-b-b-b-b.......until(c

{

sub(d,b,c);

mov(c,d);//c复制给a

}

return;

}

//大数相除(向右移)

//试商法,调用以后w为amodb,C为adivb

voiddivt(intt[MAX],intb[MAX],int*c,int*w)

{

inta1,b1,i,j,m;//w用于暂时保存数据

intd[MAX],e[MAX],f[MAX],g[MAX],a[MAX];

mov(t,a);

for(i=0;i

e[i]=0;

for(i=0;i

d[i]=0;

for(i=0;i

a1=a[MAX-1];

b1=b[MAX-1];

if(cmp(a,b)==(-1))

{

c[0]=0;

c[MAX-1]=1;

mov(t,w);

return;

}

elseif(cmp(a,b)==0)

{

c[0]=1;

c[MAX-1]=1;

w[0]=0;

w[MAX-1]=1;

return;

}

m=(a1-b1);

for(i=m;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;j

d[j]=0;

d[i]=1;

d[MAX-1]=i+1;

mov(b,g);

mul(g,d,e);

while(cmp(a,e)!

=(-1))

{

c[i]++;

sub(a,e,f);

mov(f,a);//f复制给g

}

for(j=i;j

e[j]=0;

}

mov(a,w);

if(c[m]==0)c[MAX-1]=m;

elsec[MAX-1]=m+1;

return;

}

//解决了m=a*bmodn

voidmulmod(inta[MAX],intb[MAX],intn[MAX],int*m)

{

intc[MAX],d[MAX];

inti;

for(i=0;i

d[i]=c[i]=0;

mul(a,b,c);

divt(c,n,d,m);

for(i=0;i

printf("%d",m[m[MAX-1]-i-1]);

printf("\nmlengthis:

%d\n",m[MAX-1]);

}

//解决了m=a^pmodn的函数问题。

voidexpmod(inta[MAX],intp[MAX],intn[MAX],int*m)

{

intt[MAX],l[MAX],temp[MAX];//t放入2,l放入1

intw[MAX],s[MAX],c[MAX],b[MAX],i;

for(i=0;i

b[i]=l[i]=t[i]=w[i]=0;

t[0]=2;t[MAX-1]=1;

l[0]=1;l[MAX-1]=1;

mov(l,temp);

mov(a,m);

mov(p,b);

while(cmp(b,l)!

=0)

{

for(i=0;i

w[i]=c[i]=0;

divt(b,t,w,c);//c=pmod2w=p/2

mov(w,b);//p=p/2

if(cmp(c,l)==0)//余数c==1

{

for(i=0;i

w[i]=0;

mul(temp,m,w);

mov(w,temp);

for(i=0;i

w[i]=c[i]=0;

divt(temp,n,w,c);//c为余c=temp%n,w为商w=temp/n

mov(c,temp);

}

for(i=0;i

s[i]=0;

mul(m,m,s);//s=a*a

for(i=0;i

c[i]=0;

divt(s,n,w,c);//w=s/n;c=smodn

mov(c,m);

}

for(i=0;i

s[i]=0;

mul(m,temp,s);

for(i=0;i

c[i]=0;

divt(s,n,w,c);

mov(c,m);//余数s给m

m[MAX-2]=a[MAX-2];//为后面的汉字显示需要,用第99位做为标记

return;

//k=temp*k%n

}

intis_prime_san(intp[MAX])

{

inti,a[MAX],t[MAX],s[MAX],o[MAX];

for(i=0;i

s[i]=o[i]=a[i]=t[i]=0;

t[0]=1;

t[MAX-1]=1;

a[0]=2;//{2,3,5,7}

a[MAX-1]=1;

sub(p,t,s);

expmod(a,s,p,o);

if(cmp(o,t)!

=0)

{

return0;

}

a[0]=3;

for(i=0;i

expmod(a,s,p,o);

if(cmp(o,t)!

=0)

{

return0;

}

a[0]=5;

for(i=0;i

expmod(a,s,p,o);

if(cmp(o,t)!

=0)

{

return0;

}

a[0]=7;

for(i=0;i

expmod(a,s,p,o);

if(cmp(o,t)!

=0)

{

return0;

}

return1;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2