Vigenère 表的 C 语言实现
Vigenère 密码是一种多表替换密码,使用一个关键词对明文进行加密和解密,下面是一个完整的 C 语言实现,包括加密和解密功能。

(图片来源网络,侵删)
完整代码
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define ALPHABET_SIZE 26
// 生成 Vigenère 表
void generateVigenereTable(char table[ALPHABET_SIZE][ALPHABET_SIZE]) {
for (int i = 0; i < ALPHABET_SIZE; i++) {
for (int j = 0; j < ALPHABET_SIZE; j++) {
table[i][j] = 'A' + (i + j) % ALPHABET_SIZE;
}
}
}
// 打印 Vigenère 表
void printVigenereTable(char table[ALPHABET_SIZE][ALPHABET_SIZE]) {
printf(" ");
for (int i = 0; i < ALPHABET_SIZE; i++) {
printf("%c ", 'A' + i);
}
printf("\n");
for (int i = 0; i < ALPHABET_SIZE; i++) {
printf("%c: ", 'A' + i);
for (int j = 0; j < ALPHABET_SIZE; j++) {
printf("%c ", table[i][j]);
}
printf("\n");
}
}
// 加密函数
void vigenereEncrypt(const char *plaintext, const char *key, char *ciphertext) {
int keyLength = strlen(key);
int keyIndex = 0;
for (int i = 0; plaintext[i] != '\0'; i++) {
if (isalpha(plaintext[i])) {
char plainChar = toupper(plaintext[i]);
char keyChar = toupper(key[keyIndex % keyLength]);
// 计算加密后的字符
ciphertext[i] = 'A' + (plainChar - 'A' + keyChar - 'A') % ALPHABET_SIZE;
keyIndex++;
} else {
ciphertext[i] = plaintext[i]; // 非字母字符保持不变
}
}
ciphertext[strlen(plaintext)] = '\0';
}
// 解密函数
void vigenereDecrypt(const char *ciphertext, const char *key, char *plaintext) {
int keyLength = strlen(key);
int keyIndex = 0;
for (int i = 0; ciphertext[i] != '\0'; i++) {
if (isalpha(ciphertext[i])) {
char cipherChar = toupper(ciphertext[i]);
char keyChar = toupper(key[keyIndex % keyLength]);
// 计算解密后的字符
plaintext[i] = 'A' + (cipherChar - 'A' - (keyChar - 'A') + ALPHABET_SIZE) % ALPHABET_SIZE;
keyIndex++;
} else {
plaintext[i] = ciphertext[i]; // 非字母字符保持不变
}
}
plaintext[strlen(ciphertext)] = '\0';
}
int main() {
char vigenereTable[ALPHABET_SIZE][ALPHABET_SIZE];
// 生成并打印 Vigenère 表
generateVigenereTable(vigenereTable);
printf("Vigenère 密码表:\n");
printVigenereTable(vigenereTable);
printf("\n");
char plaintext[100], key[100], ciphertext[100], decryptedText[100];
// 输入明文和密钥
printf("请输入明文: ");
fgets(plaintext, sizeof(plaintext), stdin);
plaintext[strcspn(plaintext, "\n")] = '\0'; // 去除换行符
printf("请输入密钥: ");
fgets(key, sizeof(key), stdin);
key[strcspn(key, "\n")] = '\0'; // 去除换行符
// 加密
vigenereEncrypt(plaintext, key, ciphertext);
printf("加密结果: %s\n", ciphertext);
// 解密
vigenereDecrypt(ciphertext, key, decryptedText);
printf("解密结果: %s\n", decryptedText);
return 0;
}
代码说明
-
生成 Vigenère 表:
generateVigenereTable()函数创建一个 26x26 的表格,每个单元格的值由行和列的索引决定。
-
打印 Vigenère 表:
printVigenereTable()函数以易读的格式打印整个表格。
-
加密函数:
vigenereEncrypt()使用 Vigenère 算法加密明文。- 对于每个字母字符,计算与密钥字符的偏移量。
- 非字母字符保持不变。
-
解密函数:
(图片来源网络,侵删)vigenereDecrypt()使用相同的算法反向操作来解密密文。- 同样处理非字母字符。
-
主函数:
- 生成并显示 Vigenère 表。
- 从用户获取明文和密钥。
- 执行加密和解密操作并显示结果。
使用示例
Vigenère 密码表:
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
A: 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
B: 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 A
C: C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E: E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F: F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G: G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H: H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I: I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J: J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K: K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L: L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M: M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N: N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O: O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P: P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q: Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R: R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S: S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T: T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U: U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V: V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W: W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X: X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y: Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z: Z 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
请输入明文: Hello World
请输入密钥: KEY
加密结果: Rijvs Evjwa
解密结果: Hello World
这个实现展示了 Vigenère 密码的基本工作原理,包括表格生成、加密和解密功能。

(图片来源网络,侵删)
