用C语言编写该程序设明文字母表为:p={p0,p1,…,pn-1}密文字母表:c={c0,c1,…,cn-1} 引入两个参数 a、b,要求a和n互素,即gcd(a,n)=1;加密算法:ci=E(Pi)=(a*pi+b)modn在解密时,首先需求解a在有限域Zn上的乘法逆元a-1∈Zn,可用欧几里得算法求解;解密算法:pi=D(ci)=a-1(ci-b)modn(1)取明文空间和密文空间为26个英文字母表,其大小为n=26;(2)求出集合{0,1,2,3,…,25}中所有与26互素的数,并从中任取一个,作为a。另外,任取b∈{0,1,2,3,…,25};输出a和b;(3)求出a在有限域Zn上的乘法逆元a-1∈Zn;(4)从键盘输入一个字符串,长度约为15字符。然后按照a b c d e f g h i j k l m n o p q r s t u v w x y z分别对应0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25的方式,将明文转换为数字序列(不区分大小写,并忽略空格);(5)对第(4)步得到的数字序列逐数字加密,得到密文数字序列;(6)按照第(4)步中的映射方式,将第(5)步得到的数字序列映射为字母序列(即密文),并输出密文;(7)按照第(4)步中的映射方式,将第(6)步得到的密文序列映射为数字序列;(8)按照解密算法,对第(7)步得到的数字序列逐数字解密,得到明文数字序列;(9)按照第(4)步中的映射方式,将第(8)步得到的数字序列映射为字母序列(即明文),并输出。
时间: 2023-06-13 13:08:27 浏览: 192
以下是用C语言编写的程序:
```
#include <stdio.h>
#include <string.h>
// 明文字母表和密文字母表
char plaintext[] = "abcdefghijklmnopqrstuvwxyz";
char ciphertext[] = "cdefghijklmnopqrstuvwxyzab";
// 求a在有限域Zn上的乘法逆元a^-1
int mod_inverse(int a, int n) {
int t, t1 = 0, t2 = 1, r, r1 = n, r2 = a;
while (r2 != 0) {
t = r1 / r2;
r = r1 - t * r2;
r1 = r2;
r2 = r;
t = t1 - t2 * t;
t1 = t2;
t2 = t;
}
if (r1 > 1) {
printf("Error: a is not invertible.\n");
return -1;
}
if (t1 < 0) t1 += n;
return t1;
}
int main() {
// 取a和b
int a, b;
printf("Please enter a and b (1 <= a <= 25, 0 <= b <= 25, and a is coprime with 26):\n");
scanf("%d %d", &a, &b);
// 判断a是否与26互质
int i, flag = 0;
for (i = 1; i < 26; i++) {
if ((a * i) % 26 == 1) {
flag = 1;
break;
}
}
if (!flag) {
printf("Error: a is not coprime with 26.\n");
return 0;
}
// 输入明文字符串
char input_str[16];
printf("Please enter the plaintext (max length: 15):\n");
scanf("%s", input_str);
// 明文转数字序列
int len = strlen(input_str);
int plain_num[len];
for (i = 0; i < len; i++) {
if (input_str[i] >= 'a' && input_str[i] <= 'z')
plain_num[i] = input_str[i] - 'a';
else if (input_str[i] >= 'A' && input_str[i] <= 'Z')
plain_num[i] = input_str[i] - 'A';
else
plain_num[i] = -1;
}
// 加密数字序列
int cipher_num[len];
for (i = 0; i < len; i++) {
if (plain_num[i] == -1)
cipher_num[i] = -1;
else
cipher_num[i] = (a * plain_num[i] + b) % 26;
}
// 数字序列转密文
char ciphertext_str[len + 1];
for (i = 0; i < len; i++) {
if (cipher_num[i] == -1)
ciphertext_str[i] = ' ';
else
ciphertext_str[i] = ciphertext[cipher_num[i]];
}
ciphertext_str[len] = '\0';
// 输出密文
printf("Ciphertext: %s\n", ciphertext_str);
// 密文转数字序列
int cipher_num2[len];
for (i = 0; i < len; i++) {
if (ciphertext_str[i] == ' ')
cipher_num2[i] = -1;
else {
int j;
for (j = 0; j < 26; j++) {
if (ciphertext_str[i] == ciphertext[j]) {
cipher_num2[i] = j;
break;
}
}
}
}
// 解密数字序列
int plain_num2[len];
for (i = 0; i < len; i++) {
if (cipher_num2[i] == -1)
plain_num2[i] = -1;
else
plain_num2[i] = (mod_inverse(a, 26) * (cipher_num2[i] - b + 26)) % 26;
}
// 数字序列转明文
char plaintext_str[len + 1];
for (i = 0; i < len; i++) {
if (plain_num2[i] == -1)
plaintext_str[i] = ' ';
else
plaintext_str[i] = plaintext[plain_num2[i]];
}
plaintext_str[len] = '\0';
// 输出明文
printf("Plaintext: %s\n", plaintext_str);
return 0;
}
```
阅读全文