#include <stdio.h>
#include <ctype.h>
#include <string.h>
//本程序特点:1.密钥的输入及检验、加密过程、解密过程都各自编写了独立的函数,使主函数更加明了,清晰!
int key1(int k1) //对函数key1的定义,key1用于密钥k1的输入和检验
{
do
{
printf("请输入密钥k1\n要求:k1为0~25之间的整数(包括0和25),并且k1不能为偶数,也不能等于13.\n");
printf("k1 = ");
scanf("%d",&k1);
if(k1<0||k1>25||k1%2==0||k1==13)
printf("k1输入有误,请重新输入\n");
}
while(k1<0||k1>25||k1%2==0||k1==13);
return(k1);
}
int key2(int k2) //对函数key2的定义,key2用于密钥k2的输入和检验
{
do
{
printf("请输入密钥k2\n要求:k2为0~25之间的整数(包括0和25)\n");
printf("k2 = ");
scanf("%d",&k2);
if(k2<0||k2>25)
printf("k2输入有误,请重新输入!");
}
while(k2<0||k2>25);
return(k2);
}
void encryption(int k1,int k2) //对函数encryption的定义,encryption用于对明文的加密,并生成密文。
{
char p[100];
int length,i;
printf("请输入明文(请省略两个单词之间的空格):\n");
scanf("%s",&p); //输入明文
length = strlen(p);
for(i=0; i<length; i++)
{
if(islower(p[i])) //检查当前字符是否为小写字母,是,返回1;不是,返回0
p[i] = (k1*(p[i]-97)+k2)%26+65;
else if(isupper(p[i])) //检查当前字符是否为大写字母,是,返回1;不是,返回0
p[i] = (k1*(p[i]-65)+k2)%26+65;
}
printf("加密之后的密文为%s\n:",p);
}
void decryption(int k1,int k2) //对函数decruption的定义,decryption用于对密文的解密,并生成明文。
{
char p[100];
int r=1,x=1;
int i,length;
printf("请输入密文:\n");
scanf("%s",&p);
while(r)
{
if((k1*x-1)%26==0)
r=0;
else
x++;
}
length = strlen(p);
for(i=0;i<length;i++)
{
if(p[i]-97-k2<0)
{
if(islower(p[i]))
p[i]=(x*((p[i])-71-k2))%26+97;
if(isupper(p[i]))
p[i]=(x*((p[i])-39-k2))%26+65;
}
else
{if(islower(p[i]))
p[i]=(x*((p[i])-97-k2))%26+97;
if(isupper(p[i]))
p[i]=(x*((p[i])-65-k2))%26+65;
}
}
printf("解密之后的明文为%s\n:",p);
}
void main()
{
int k1,k2,eway,circulate=1; //定义密钥k1,k2,eway,circulate;eway用于对进入方式的选择,当circulate=1时,该程序会循环执行,当circulate=0时,退出该程序。
printf("欢迎使用此软件!\n");
do
{
printf("请输入1~3,选择进入方式:\n1:加密 2:解密 3:退出\n");
scanf("%d",&eway);
switch(eway)
{
case 1:{
k1=key1(k1);
k2=key2(k2);
encryption(k1,k2);
break;
}
case 2:{
k1=key1(k1);
k2=key2(k2);
decryption(k1,k2);
break;
}
case 3:{
printf("谢谢您的使用!\n");
circulate=0;
break;
}
}
}
while(circulate);
}
仿射密码加解密代码
最新推荐文章于 2023-04-22 17:05:12 发布