#include <math.h>
#include <stdio.h>
void main()
{
long p,q,n,t,e,d,i;
/*定义明文的长度及内容*/
char m[50] = {"Hello,Nice to meet you!"};
long encrypt[50];
char decrypt[50];
p=149,q=193;
n=p*q;
t=(p-1)*(q-1);
/*取得 e*/
i=2;
while(1)
{
long a=t,b=i,c;
a,b=t>i?t,i:i,t;
while(1)
{
if(b==0) break;
c=a%b;
a=b;
b=c;
}
if(a==1)
{
e=i;
break;
}
i++;
}
/*取得 d*/
i=1;
while(1)
{
if((t*i+1)%e==0)
{
d=(t*i+1)/e;
break;
}
i++;
}
/*输出数据与明文*/
printf(" 两个大素数:p=%d, q=%d ;\n 公钥:n=%d, e=%d ;\n 私钥:d=%d \n\n",p,q,n,e,d);
printf(" 明文: %s\n",m);
/*加密*/
for(i=0;i<50;i++)
{
long a=e,b=1,c;
for(c=m[i];a>0;a>>=1)
{
if(a%2==1) b=(b*c)%n;
c=(c*c)%n;
}
encrypt[i]=b;
}
/*十六进形式输出密文*/
printf("\n 利用公钥加密后的密文为: ");
for(i=0;i<50;i++)
printf("%x",encrypt[i]);
/*解密*/
for(i=0;i<50;i++)
{
long a=d,b=1,c;
for(c=encrypt[i];a>0;a>>=1)
{
if(a%2==1) b=(b*c)%n;
c=(c*c)%n;
}
decrypt[i]=(char)b;
}
/*输出解密后的消息*/
printf("\n\n 利用私钥解密后的密文: %s\n",decrypt);
}