用c语言实现五行五列棋盘密码的加密和解密,要求支持自定义输入,输入长度无限制 。
时间: 2024-05-07 15:20:52 浏览: 175
五行五列棋盘密码是一种基于置换密码的加密算法,它的加密和解密过程都是通过将明文按照规则转化成密文或者将密文按照规则转化成明文来实现的。下面是用 C 语言实现五行五列棋盘密码的加密和解密的代码:
```c
#include <stdio.h>
#include <string.h>
// 五行五列棋盘密码加密函数
void encrypt(char *plain, char *key, char *cipher)
{
int i, j, k, n, m;
int len_plain = strlen(plain);
int len_key = strlen(key);
char code[5][5];
// 构建棋盘密码表
for (i = 0; i < len_key; i++) {
code[i / 5][i % 5] = key[i];
}
n = i / 5;
for (i = 'A'; i <= 'Z'; i++) {
if (i == 'J') {
continue;
}
code[n / 5][n % 5] = i;
n++;
}
// 替换明文中的字符
k = 0;
for (i = 0; i < len_plain; i++) {
if (plain[i] == 'J') {
plain[i] = 'I';
}
for (j = 0; j < len_key; j++) {
if (plain[i] == key[j]) {
cipher[k++] = code[j / 5][j % 5];
break;
}
}
if (j == len_key) {
cipher[k++] = plain[i];
}
}
cipher[k] = '\0';
}
// 五行五列棋盘密码解密函数
void decrypt(char *cipher, char *key, char *plain)
{
int i, j, k, n, m;
int len_cipher = strlen(cipher);
int len_key = strlen(key);
char code[5][5];
// 构建棋盘密码表
for (i = 0; i < len_key; i++) {
code[i / 5][i % 5] = key[i];
}
n = i / 5;
for (i = 'A'; i <= 'Z'; i++) {
if (i == 'J') {
continue;
}
code[n / 5][n % 5] = i;
n++;
}
// 替换密文中的字符
k = 0;
for (i = 0; i < len_cipher; i++) {
for (j = 0; j < 5; j++) {
for (m = 0; m < 5; m++) {
if (cipher[i] == code[j][m]) {
plain[k++] = key[j * 5 + m];
break;
}
}
if (m < 5) {
break;
}
}
if (j == 5) {
plain[k++] = cipher[i];
}
}
plain[k] = '\0';
}
int main()
{
char plain[1000], key[10], cipher[1000], plain2[1000];
int choice;
printf("请选择操作:\n");
printf("1. 加密\n");
printf("2. 解密\n");
scanf("%d", &choice);
printf("请输入密钥:\n");
scanf("%s", key);
if (choice == 1) {
printf("请输入明文:\n");
scanf("%s", plain);
encrypt(plain, key, cipher);
printf("密文:%s\n", cipher);
} else if (choice == 2) {
printf("请输入密文:\n");
scanf("%s", cipher);
decrypt(cipher, key, plain2);
printf("明文:%s\n", plain2);
} else {
printf("无效的选择!\n");
}
return 0;
}
```
在上面的代码中,我们通过 `encrypt` 函数实现了五行五列棋盘密码的加密过程,通过 `decrypt` 函数实现了解密过程。在加密过程中,我们首先根据输入的密钥构建了棋盘密码表,然后对明文中的每个字符进行替换,替换规则是将明文中的字符按照密钥的顺序映射到棋盘密码表上的位置,将对应位置的字符作为替换后的字符。在解密过程中,我们同样根据输入的密钥构建了棋盘密码表,然后对密文中的每个字符进行替换,替换规则是将密文中的字符在棋盘密码表上的位置映射到密钥的位置,将对应位置的字符作为替换后的字符。
阅读全文