#include<stdio.h>
#include<string.h>
#include<math.h>
void ss() //选择素数做私钥的函数
{
int m,n,i,flag;
i=0;
printf("---------------------------------------------------\n");
for(m=2;m<=1000;m++)
{
flag=1;
for(n=2;n<m;n++)
if(m%n==0)
flag=0;
if(flag==1)
{
printf("%-5d",m);
i++;
if(i%10==0)
{
printf("\n");
}
}
}
printf("\n");
printf("---------------------------------------------------\n");
}
void Enc() //加密函数
{
int p,q,n,f,e,x,t,i=0,k,d,w=0,c1,c2,c3,c=0,j,z,a1,a2,a3;
char M[100];
printf("0-1000之间的素数如下:\n");
ss();
printf("请从以上素数中选取两个数用做私钥p和q,并记住该私钥!\n");
printf("p=");scanf("%d",&p);
printf("q=");scanf("%d",&q);
n=p*q;
f=(p-1)*(q-1);
printf("----------------------------------------------------------\n");
for(e=2;e<f;e++)
{
t=e;
x=f%t;
while(x!=0)
{
f=t;
t=x;
x=f%t;
}
f=(p-1)*(q-1);
if(t==1)
{
printf("%-6d",e);
i++;
if(i%10==0)
{
printf("\n");
}
}
}
printf("\n----------------------------------------------------------\n");
printf("请从以上数字中选取一个数用做公钥e,并记住该公钥!\ne=");
scanf("%d",&e);
for(k=1;k<e;k++)
{
if((f*k+1)%e==0&&(f*k+1)/e<3220)
d=(f*k+1)/e;
}
printf("\t\t\t----------------------------------\n");
printf("\t\t\t 公开公钥:PU={%d,%d}\n",e,n);
printf("\t\t\t 保存私钥:PR={%d,%d,%d}\n",d,p,q);
printf("\t\t\t----------------------------------\n");
printf("请输入要加密的消息:");
scanf("%s",M);
printf("请输入分组位数(小于%d位):",sizeof(n));
scanf("%d",&w);
printf("明文为:");
puts(M);
printf("密文为:");
if(strlen(M)%w!=0) //加密算法
{
for(j=1;j<=strlen(M)/w+1;j++)
{
for(z=0;z<w;z++)
{
if(j!=strlen(M)/w+1)
{
c=c+(M[j*w-w+z]-48)*pow(10,w-(z+1));
}
else
{
c=c+(M[w*(j-1)+z]-48)*pow(10,strlen(M)-w*(j-1)-(z+1));
if(z==(strlen(M)-w*(j-1)-1))
break;
}
}
a1=e;a2=c;a3=1;
while(a1!=0)
{
if(a1%2!=0)
{
a1=a1-1;a3=(a3*a2)%n;
}
a1=a1/2;
a2=(a2*a2)%n;
}
printf("%d ",a3);
c=0;
}
}
else
{
for(j=1;j<strlen(M)/w+1;j++)
{
for(z=0;z<w;z++)
{
c=c+(M[j*w-w+z]-48)*pow(10,w-(z+1));
}
a1=e;a2=c;a3=1;
while(a1!=0)
{
if(a1%2!=0)
{
a1=a1-1;a3=(a3*a2)%n;
}
a1=a1/2;
a2=(a2*a2)%n;
}
printf("%d",a3);
c=0;
}
}
}
void Dec() //解密函数
{
int e,n,d,p,q,i,j,m=0,t,a1,a2,a3;
char C[100];
printf("请输入公钥e和n:\n");
scanf("%d %d",&e,&n);
printf("请输入私钥d、p和q:\n");
scanf("%d %d %d",&d,&p,&q);
printf("请输入密文:\n");
scanf("%s",C);
t=sizeof(n);
for(j=0;j<strlen(C)/t;j++) //解密算法
{
for(i=t-1;i>=0;i--)
{
m=m+(C[i+j*(t)]-48)*pow(10,t-i-1);
}
a1=d;a2=m;a3=1;
while(a1!=0)
{
if(a1%2!=0)
{
a1=a1-1;a3=(a3*a2)%n;
}
a1=a1/2;
a2=(a2*a2)%n;
}
printf("%d ",a3);
m=0;
}
if(strlen(C)%t!=0)
{
m=0;
for(i=0;i<strlen(C)-j*t;i++)
{
m=m+(C[j*t+i]-48)*pow(10,strlen(C)-j*t-1-i);
}
a1=d;a2=m;a3=1;
while(a1!=0)
{
if(a1%2!=0)
{
a1=a1-1;a3=(a3*a2)%n;
}
a1=a1/2;
a2=(a2*a2)%n;
}
printf("%d ",a3);
}
}
int main() //主函数
{
int i;
printf("\n\t\t\t夏雄辉 计科0804 20081183050\n");
printf("\t\t\t=========版权所有=========\n\n");
printf("\t\t\t***************************\n");
printf("\t\t\t* RSA密码的加密与解密 *\n");
printf("\t\t\t* <1>加密 *\n");
printf("\t\t\t* <2>解密 *\n");
printf("\t\t\t* <3>退出 *\n");
printf("\t\t\t***************************\n");
loop:
scanf("%d",&i);
switch(i)
{
case 1:
Enc();
goto loop;
break;
case 2:
Dec();
goto loop;
break;
case 3:
return 0;
default:
printf("输入错误,请重新输入!\n");
goto loop;
}
}
RSA.rar_rsa
版权申诉
182 浏览量
2022-09-23
12:01:45
上传
评论
收藏 1KB RAR 举报
我虽横行却不霸道
- 粉丝: 76
- 资源: 1万+