RSA加解密算法.docx
- 文档编号:10393909
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:40
- 大小:49.59KB
RSA加解密算法.docx
《RSA加解密算法.docx》由会员分享,可在线阅读,更多相关《RSA加解密算法.docx(40页珍藏版)》请在冰豆网上搜索。
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;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");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RSA 解密 算法