d=rand()%eular;
x=pubKey*d%eular;
if(x==1)
{
return d;
}
}
}
//加密函数
void jiami()
{
str_read_len = strlen(str_read);//从参数表示的地址往后找,找到第一个’\0’,即串尾.计算’\0’至首地址的“距离”,即隔了几个字符,从而得出长度.
printf(“密文是:”);
for(int i=0;i<str_read_len;i++)
{
int C=1;
int a=str_read[i],b=a%mod;
for(int j=0;j<pubKey;j++) //实现加密
{
C=(C*b)%mod;
}
str_encrypt[i]=C;
printf(“%d”,str_encrypt[i]);
}
printf(“\n”);
}
//解密函数
void jiemi()
{
int i=0;
for(i=0;i<str_read_len;i++)
{
int C=1;
int a=str_encrypt[i],b=a%mod;
for(int j=0;j<priKey;j++)
{
C=(C*b)%mod;
}
str_decrypt[i]=C;
}
str_decrypt[i]=‘\0’;
printf(“解密文是:%s\n”,str_decrypt);
}
//主函数
int main()
{
srand(time(NULL));
while (1)
{
prime1=randPrime();
prime2=randPrime();
printf(“随机产生两个素数:prime1=%d,prime2=%d”,prime1,prime2);
mod=prime1*prime2;
printf(“模数:mod=prime1*prime2=%d\n”,mod);
if(mod>Element_Max)
break; //模数要大于每个加密单元的值
}
eular=(prime1-1)*(prime2-1);
printf(“欧拉数:eular=(prime1-1)*(prime2-1)=%d\n”,eular);
pubKey=randExponent();
printf(“公钥指数pubKey=%d\n”,pubKey);
priKey=inverse();
printf(“私钥指数:priKey=%d\n 私钥为(%d, %d)\n”, priKey, priKey, mod);
jiami();
jiemi();
return 0;
}
流程图:

2.elgamal
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//模重复平方算法,计算a^b mod p
int pow_mod(int a,int b,int p)
{
int ans=1;
int tmp=a%p;
while(b){
if(b&1)
ans=