RSA加解密算法Word文档下载推荐.docx
- 文档编号:22918800
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:41
- 大小:74.88KB
RSA加解密算法Word文档下载推荐.docx
《RSA加解密算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《RSA加解密算法Word文档下载推荐.docx(41页珍藏版)》请在冰豆网上搜索。
q[i]=k;
}while((is_prime_san(q))!
素数q为:
q[q[MAX-1]-i-1]);
return;
3.2选择整数e
整数e满足
//产生与(p-1)*(q-1)互素的随机数
voiderand(inte[MAX],intm[MAX])
e[MAX-1]=5;
随机产生一个与(p-1)*(q-1)互素的e:
"
for(i=0;
e[MAX-1]-1;
e[i]=k;
while((k=rand()%10)==0)
e[e[MAX-1]-1]=k;
}while(coprime(e,m)!
e[MAX-1];
e[e[MAX-1]-i-1]);
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);
MAX;
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)
k[i]=w[i]=0;
divt(n1,n2,k,w);
//k=n1/n2;
temp[i]=0;
mul(k,n2,temp);
//temp=k*n2;
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;
mul(k,b2,temp);
//b2=b1-k*b2;
b2[i]=0;
sub(b1,temp,b2);
mov(t,b1);
t[i]=0;
add(b2,g,t);
temp[i]=d[i]=0;
divt(t,g,temp,d);
由以上的(p-1)*(q-1)和e计算得出的d:
d[MAX-1];
d[d[MAX-1]-i-1]);
3.4加密函数
利用上面的函数我们可以得到
加密使用的公钥
加密函数如下所示:
加密函数:
//加密模块儿,例如C=P^emodn
structslink*jiami(inte[MAX],intn[MAX],structslink*head)
structslink*p;
structslink*h;
structslink*p1,*p2;
intm=0,i;
\n"
加密后形成的密文内容:
p1=p2=(structslink*)malloc(LEN);
h=NULL;
p=head;
if(head!
=NULL)
do
expmod(p->
bignum,e,n,p1->
bignum);
p1->
bignum[MAX-1];
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;
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!
do
p1->
bignum[i]=0;
bignum,d,n,p1->
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++;
}while(p!
解密密文后所生成的明文:
j;
%c"
ch[i]);
4实验结果
运行程序,系统自动生成公钥和私钥:
公钥为:
私钥为:
加密操作:
输入明文:
wangxinijfioajfioahgiuhaijfalijgoaijrgfiahguajdnandijuhaifhfuiah
输出密文,程序运行结果如下所示:
解密操作:
解密所用的密文就是上面加密得到的密文。
输出明文,程序运行结果如下所示:
5实验完整代码
#include<
stdio.h>
string.h>
stdlib.h>
time.h>
math.h>
malloc.h>
#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;
a[99];
a[a[99]-i-1]);
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]<
return0;
voidmov(inta[MAX],int*b)
intj;
for(j=0;
j<
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]=='
l1;
l2;
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;
}
//大数相加,注意进位
voidadd(inta1[MAX],inta2[MAX],int*c)
inti,l1,l2;
intlen,temp[MAX];
intk=0;
if((a1[MAX-2]=='
)&
(a2[MAX-2]=='
))
c[MAX-2]='
mov(a1,temp);
temp[MAX-2]=0;
sub(a2,temp,c);
mov(a2,temp);
temp[98]=0;
sub(a1,temp,c);
if(l1<
l2)len=l1;
elselen=l2;
len;
c[i]=(a1[i]+a2[i]+k)%10;
k=(a1[i]+a2[i]+k)/10;
if(l1>
len)
for(i=len;
c[i]=(a1[i]+k)%10;
k=(a1[i]+k)/10;
if(k!
=0)
c[l1]=k;
len=l1+1;
elselen=l1;
else
c[i]=(a2[i]+k)%10;
k=(a2[i]+k)/10;
c[l2]=k;
len=l2+1;
c[99]=len;
//大数相减,注意借位
voidsub(inta1[MAX],inta2[MAX],int*c)
intlen,t1[MAX],t2[MAX];
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);
elseif(a2[MAX-2]=='
mov(a2,t2);
t2[MAX-2]=0;
add(a1,t2,c);
t2[MAX-2]='
if(cmp(a1,a2)==1)
len=l2;
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;
if((a1[i]-k)<
c[i]=(a1[i]-k+10)%10;
c[i]=(a1[i]-k)%10;
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;
if(cmp(a1,a2)==(-1))
len=l1;
if((a2[i]-k-a1[i])<
c[i]=(a2[i]-a1[i]-k+10)%10;
c[i]=(a2[i]-a1[i]-k)%10;
if((a2[i]-k)<
c[i]=(a2[i]-k+10)%10;
c[i]=(a2[i]-k)%10;
if(c[l2-1]==0)
len=l2-1;
while(c[l1-i]==0)
elseif(cmp(a1,a2)==0)
len=1;
c[len-1]=0;
c[MAX-1]=len;
//取模数
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<
b)
sub(d,b,c);
mov(c,d);
//c复制给a
//大数相除(向右移)
//试商法,调用以后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);
e[i]=0;
d[i]=0;
i++)g[i]=0;
a1=a[MAX-1];
b1=b[MAX-1];
if(cmp(a,b)==(-1))
c[0]=0;
c[MAX-1]=1;
mov(t,w);
elseif(cmp(a,b)==0)
c[0]=1;
w[0]=0;
w[MAX-1]=1;
m=(a1-b1);
for(i=m;
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;
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;
//解决了m=a*bmodn
voidmulmod(inta[MAX],intb[MAX],intn[MAX],int*m)
intc[MAX],d[MAX];
d[i]=c[i]=0;
mul(a,b,c);
divt(c,n,d,m);
m[MAX-1];
m[m[MAX-1]-i-1]);
\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;
MAX-1;
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)!
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
w[i]=0;
mul(temp,m,w);
mov(w,temp);
divt(temp,n,w,c);
//c为余c=temp%n,w为商w=temp/n
mov(c,temp);
s[i]=0;
mul(m,m,s);
//s=a*a
c[i]=0;
divt(s,n,w,c);
//w=s/n;
c=smodn
mov(c,m);
mul(m,temp,s);
//余数s给m
m[MAX-2]=a[MAX-2];
//为后面的汉字显示需要,用第99位做为标记
//k=temp*k%n
intis_prime_san(intp[MAX])
inti,a[MAX],t[MAX],s[MAX],o[MAX];
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)
a[0]=3;
i++)o[i]=0;
a[0]=5;
{
a[0]=7;
if(cmp(o,t)!
re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RSA 解密 算法