#include<stdio.h>#include<string.h>
//辗转相除求最大公因子
int gcd(int a,int b)
{
int k=0;
do
{
k=a%b;
a=b;
b=k;
}while(k!=0);
return a;
}
//求解a相对于b的逆元
int ni(int a,int b)
{
int i=0;
while(a*(++i)%b!=1);
return i;
}
//加密函数
void jia()
{
char c[100];
int len,ka,kb;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
//秘钥ka,kb必须互素
while(gcd(ka,kb)!=1)
{
printf("秘钥错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=97&&c[i]<=122)
c[i]=(ka*(c[i]-97)+kb)%26+97;
else if(c[i]>=65&&c[i]<=90)
c[i]=(ka*(c[i]-65)+kb)%26+65;
}
printf("%s\n",c);
}
//解密函数
void jie()
{
char c[100];
int ka,kb,len,tmp;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
while(gcd(ka,kb)!=1)
{
printf("秘钥输入错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=65&&c[i]<=90)
{
tmp=ni(ka,26)*(c[i]-65-kb);
if(tmp<0)
c[i]=tmp%26+26+65;
else
c[i]=tmp%26+65;
}
if(c[i]>=97&&c[i]<=122)
{
tmp=ni(ka,26)*(c[i]-97-kb);
if(tmp<0)
c[i]=tmp%26+26+97;
else
c[i]=tmp%26+97;
}
}
printf("%s\n",c);
}
int main()
{
int i;
printf("1.加密\n2.解密\n");
scanf("%d",&i);
while(i>0&&i<=3)
{
if(i==1)
jia();
else if(i==2)
jie();
}
return 0;
//辗转相除求最大公因子
int gcd(int a,int b)
{
int k=0;
do
{
k=a%b;
a=b;
b=k;
}while(k!=0);
return a;
}
//求解a相对于b的逆元
int ni(int a,int b)
{
int i=0;
while(a*(++i)%b!=1);
return i;
}
//加密函数
void jia()
{
char c[100];
int len,ka,kb;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
//秘钥ka,kb必须互素
while(gcd(ka,kb)!=1)
{
printf("秘钥错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=97&&c[i]<=122)
c[i]=(ka*(c[i]-97)+kb)%26+97;
else if(c[i]>=65&&c[i]<=90)
c[i]=(ka*(c[i]-65)+kb)%26+65;
}
printf("%s\n",c);
}
//解密函数
void jie()
{
char c[100];
int ka,kb,len,tmp;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
while(gcd(ka,kb)!=1)
{
printf("秘钥输入错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=65&&c[i]<=90)
{
tmp=ni(ka,26)*(c[i]-65-kb);
if(tmp<0)
c[i]=tmp%26+26+65;
else
c[i]=tmp%26+65;
}
if(c[i]>=97&&c[i]<=122)
{
tmp=ni(ka,26)*(c[i]-97-kb);
if(tmp<0)
c[i]=tmp%26+26+97;
else
c[i]=tmp%26+97;
}
}
printf("%s\n",c);
}
int main()
{
int i;
printf("1.加密\n2.解密\n");
scanf("%d",&i);
while(i>0&&i<=3)
{
if(i==1)
jia();
else if(i==2)
jie();
}
return 0;
}
如若有不正确的地方,欢迎各位大牛指正,不胜感激!
本文介绍了一个基于C语言实现的仿射密码加解密程序。该程序使用辗转相除法求最大公约数,并通过求逆元进行解密操作。用户可以输入明文和密钥,程序将验证密钥是否互质并完成加密或解密过程。
1546

被折叠的 条评论
为什么被折叠?



