c语言实现代码如下:
#include<stdio.h>
#include<string.h>
void jiami(int e,int n,int len,int *zminw,int *miw)//加密算法
{
int e1=e;
for(int i=0;i<len;i++){
int r=1;
e=e+1;
while(e!=1)
{
r=zminw[i]*r;
r=r%n;
e--;
}
miw[i]=r;
e=e1;}
}
void jiemi(int d,int n,int len,int *miw,int *jmw)//解密算法
{
int d1=d;
for(int i=0;i<len;i++){
int r=1;
d=d+1;
while(d!=1)
{
r=r*miw[i];
r=r%n;
d--;
}
jmw[i]=r;
d=d1;}
}
void mwcf(int *miw,int len,int *bj,int *len2)//将密文转化为个位数的数组
{
int k=0,j,h=0;
for(int i=0;i<len;i++){
if(miw[i]>100&&miw[i]<110)
{int a=miw[i]/100;int b=0;int c=miw[i]%100;k+=3;
for(j=h;j<k;j++) {
*
```c
if(j==h) bj[j]=a; *斜体样式*
if(j==h+1) bj[j]=b;
if(j==h+2) bj[j]=c;}
h=k;
}
if(miw[i]<100&&miw[i]>10) {int a=miw[i]/10;int b=miw[i]%10;k+=2;
for(j=h;j<k;j++){
if(j==h) bj[j]=a;
if(j==h+1) bj[j]=b;}
h=k;
}
if(miw[i]>110){int a=miw[i]/100;int b=(miw[i]%100)/10;
int c=(miw[i]%100)%10;k+=3;
for(int j=h;j<k;j++){
if(j==h) bj[j]=a;
if(j==h+1) bj[j]=b;
if(j==h+2) bj[j]=c;}
h=k;
}
if(miw[i]<10) {k+=1;bj[h]=miw[i];h++;}
}
*len2=k;
}
void miwzh(int *bj,char *miw3,int len2)//密文转化为字符串形式
{
for(int i=0;i<len2;i++)
{
miw3[i]=bj[i]+'0';
}
}
int main()//0<minwen<n,也就是说明文M需要大于零,并且小于指数n。
{
int p=7,q=19;int fn,e,d=0,n;
long int minwen,miwen,jmh;//单个数字加密测试
char minw[1000],len,jmw1[1000],miw3[1000];//明文、长度、解密后的明文、密文的字符串表示
int zminw[1000],miw[1000],jmw[1000];//ascall码值、密文、解密后的ascall码值
int bj[1000],srmw[1000],len2;//才分后的密文、输入的带空格式密文、拆分后的长度
char srdmiw[1000];//输入的字符串式密文
n=p*q; //pq的乘积
fn=(p-1)*(q-1); //n的欧拉函数φ(n)的值
printf("φ(n)=%d,请输入一个与Φn互为质数且小于φ(n)的数e:",fn);
scanf("%d",&e);
for(int k=1;true;k++) //计算模反元素d
{for(;(e*d-1)<=k*fn;d++)
{if((e*d-1)==k*fn) break;}
if((e*d-1)==k*fn) break;
}
int t2;int k2;
for(;true;){
printf("1.加密明文 2.解密已加密明文 3.退出\n");
printf("请选择操作:");
scanf("%d",&t2);
if(t2==1)
{printf("请输入要加密的明文(一串字母):");
scanf("%s",minw);
len=strlen(minw);
for(int i=0;i<len;i++)
{zminw[i]=(int)minw[i];}//将明文转化为ascall码值
jiami(e,n,len,zminw,miw);
printf("加密后的密文:");
for(int i=0;i<len;i++)
printf("%d",miw[i]);
putchar('\n');
mwcf(miw,len,bj,&len2);
printf("拆分后的密文:");
for(int i=0;i<len2;i++)
printf("%d",bj[i]);
putchar('\n');}
if(t2==2){
printf("请输入要解密的密文:");
miwzh(bj,miw3,len2);
getchar();
for(int i=0;i<len2;i++)
scanf("%c",&srdmiw[i]);
printf("miw3的输出:");
for(int i=0;i<len2;i++)
printf("%c",miw3[i]);
putchar('\n');
printf("srdmiw的输出:");
for(int i=0;i<len2;i++)
printf("%c",srdmiw[i]);
putchar('\n');
k2=0;//每一次循环都还回k2的值
for(int i=0;i<len2;i++)
{if(miw3[i]==srdmiw[i]) k2++;}
if(k2==len2)
{
jiemi(d,n,len,miw,jmw);
printf("解密后的明文(ascall码值):");
for(int i=0;i<len;i++)
printf("%d",jmw[i]);
putchar('\n');
for(int i=0;i<len;i++)
jmw1[i]=(char)jmw[i];
printf("解密后的明文原文:");
for(int i=0;i<len;i++)
printf("%c",jmw1[i]);
putchar('\n');}
else printf("没有任何明文加密后为此密文。\n");}
if(t2==3) break;}
return 0;
}
运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201107002115605.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubm0L20wXzUxMTg0MzI3,size_16,color_FFFFFF,t_70#pic_center)