编程实现仿射密码,要求有加密步骤和解密步骤。若输入参数a,b不合法,则报错。C语言
时间: 2023-06-09 15:08:45 浏览: 89
fangshemima.rar_affine cipher_atbru_c语言仿射密码_dinner76u_仿射密码C语言
中的实现代码如下:
```
#include <stdio.h>
#include <stdlib.h>
int main() {
int a, b, x, y, i;
char plaintext[100], ciphertext[100], decryptedtext[100];
// 输入参数a和b
printf("请输入参数a和b:");
scanf("%d %d", &a, &b);
// 判断输入参数是否合法
if (a == 0 || a >= 26 || b >= 26) {
printf("输入参数a和b不合法!\n");
exit(1);
}
// 输入明文
printf("请输入明文:");
scanf("%s", plaintext);
// 加密
for (i = 0; plaintext[i] != '\0'; ++i) {
if (plaintext[i] >= 'a' && plaintext[i] <= 'z') {
x = plaintext[i] - 'a';
y = (a * x + b) % 26;
ciphertext[i] = y + 'a';
}
else if (plaintext[i] >= 'A' && plaintext[i] <= 'Z') {
x = plaintext[i] - 'A';
y = (a * x + b) % 26;
ciphertext[i] = y + 'A';
}
else {
ciphertext[i] = plaintext[i];
}
}
ciphertext[i] = '\0';
// 输出密文
printf("加密后的密文为:%s\n", ciphertext);
// 解密
for (i = 0; ciphertext[i] != '\0'; ++i) {
if (ciphertext[i] >= 'a' && ciphertext[i] <= 'z') {
y = ciphertext[i] - 'a';
x = (a * y - b) % 26;
if (x < 0)
x += 26;
decryptedtext[i] = x + 'a';
}
else if (ciphertext[i] >= 'A' && ciphertext[i] <= 'Z') {
y = ciphertext[i] - 'A';
x = (a * y - b) % 26;
if (x < 0)
x += 26;
decryptedtext[i] = x + 'A';
}
else {
decryptedtext[i] = ciphertext[i];
}
}
decryptedtext[i] = '\0';
// 输出解密后的明文
printf("解密后的明文为:%s", decryptedtext);
return 0;
}
```
该程序实现了仿射密码的加密和解密操作。对于输入的字符,如果是小写字母,就将其转换成0到25的数字,代表A到Z;如果是大写字母,就将其转换成26到51的数字,代表a到z。加密的过程是先将明文中的每个字符转换成数字x,然后用公式y=(a*x+b)%26计算得到密文中的数字,最后再转换成字符。解密的过程是先将密文中的每个字符转换成数字y,然后用公式x=(a^-1*(y-b))%26计算得到明文中的数字,然后再转换成字符。其中,a^-1是模26下的a的逆元,即满足aa^-1≡1(mod 26)的数。对于本程序,只要a和26互质才有逆元,所以在判断参数合法性时需要检查a是否为0或大于等于26的数,以及b是否大于等于26。
阅读全文