版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YangZuo_Chester/article/details/76728695
一种加密方法
来源:小学期题目
直接贴代码咯
#include<stdio.h>
#include<stdlib.h>
int JudgeK1(int k1) //判断密钥k1是否与26互素
{
int i;
int iTempS, iTempB;
if (k1 == 26)
{
return 0;
}
if (k1>26)
{
iTempS = 26;
iTempB = k1;
}
else
{
iTempS = k1;
iTempB = 26;
}
for (i = 2; i <= iTempS; i++)
{
if (iTempB%i == 0 && iTempS%i == 0)
{
return 0;
}
}
return 1;
}
int Decode(char toDecode, int k1, int k2)//算是暴力枚举了……知道k1,k2解密密文
{
int n;//倍数
for (n = 0; n <= 5000; n++)
{
if ((toDecode - k2 + 26 * n) % k1 == 0)
{
return (toDecode - k2 + 26 * n) / k1;
}
}
}
int main()
{
int k1;
int k2;//k1与26互素
int i;
int iTimes = 0;
char cString[50];//明文
char cSafeString[50];//密文
char cDeString[50];//解密后的明文
puts("输入明文:");
gets_s(cString,50);//!项目写于visual studio,其他编译器可能是用gets(cString)写法
puts("输入密钥k1 k2:");
scanf("%d %d", &k1, &k2);
while (JudgeK1(k1) == 0)
{
puts("K1要与26互素!请重新输入K1:");
scanf("%d", &k1);
}
//加密明文
for (i = 0; cString[i] != '\0'; i++)
{
if (cString[i] >= 'a'&&cString[i] <= 'z')//小写
{
cSafeString[i] = ((cString[i] - 'a')*k1 + k2) % 26 + 'a';
}
else if (cString[i] >= 'A'&&cString[i] <= 'Z')//大写
{
cSafeString[i] = ((cString[i] - 'A')*k1 + k2) % 26 + 'A';
}
else
{
cSafeString[i] = cString[i];
}
}
cSafeString[i] = '\0';
//结束
puts("\n密文:");//打印密文
puts(cSafeString);
for (i = 0; cSafeString[i] != '\0'; ++i)//解密密文
{
if (cSafeString[i] >= 'a'&&cSafeString[i] <= 'z')
{
cDeString[i] = 'a' + Decode(cSafeString[i] - 'a', k1, k2);
}
else if (cSafeString[i] >= 'A'&&cSafeString[i] <= 'Z')
{
cDeString[i] = 'A' + Decode(cSafeString[i] - 'A', k1, k2);
}
else
{
cDeString[i] = cSafeString[i];
}
}
cDeString[i] = '\0';
//解密结束
puts("解密密文:");
puts(cDeString);
system("pause");
return 0;
}