vigenere表在C语言中如何实现加密解密?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 C语言 正文

Vigenère 表的 C 语言实现

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

vigenere表 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;
}

代码说明

  1. 生成 Vigenère 表:

    • generateVigenereTable() 函数创建一个 26x26 的表格,每个单元格的值由行和列的索引决定。
  2. 打印 Vigenère 表:

    • printVigenereTable() 函数以易读的格式打印整个表格。
  3. 加密函数:

    • vigenereEncrypt() 使用 Vigenère 算法加密明文。
    • 对于每个字母字符,计算与密钥字符的偏移量。
    • 非字母字符保持不变。
  4. 解密函数:

    vigenere表 c语言
    (图片来源网络,侵删)
    • vigenereDecrypt() 使用相同的算法反向操作来解密密文。
    • 同样处理非字母字符。
  5. 主函数:

    • 生成并显示 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 密码的基本工作原理,包括表格生成、加密和解密功能。

vigenere表 c语言
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede list如何指定id调用内容?
« 上一篇 今天
织梦前台验证码不显示怎么办?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]