用c语言分别实现仿射密码和希尔密码,要求能够手动输入数值
时间: 2024-09-27 16:14:12 浏览: 53
在C语言中,我们可以分别通过编写函数来实现仿射密码(Caesar Cipher)和希尔密码(Vigenere Cipher),因为这两种都是基于替换加密的简单形式。以下是两个基本版本的实现:
**1. 仿射密码(Caesar Cipher)**
```c
#include <stdio.h>
#include <string.h>
// 仿射变换函数
char caesar_cipher(char c, int shift) {
if (c >= 'a' && c <= 'z') {
return ((c - 'a' + shift) % 26) + 'a';
} else if (c >= 'A' && c <= 'Z') {
return ((c - 'A' + shift) % 26) + 'A';
}
// 对于非字母字符不做处理并直接返回
return c;
}
int main() {
char plaintext[100], ciphertext[100];
printf("请输入明文: ");
fgets(plaintext, sizeof(plaintext), stdin);
plaintext[strlen(plaintext) -25): ");
scanf("%d", &shift);
for (int i = 0; plaintext[i]; ++i) {
ciphertext[i] = caesar_cipher(plaintext[i], shift);
}
printf("加密后的密文: %s\n", ciphertext);
return 0;
}
```
**2. 希尔密码(Vigenere Cipher)**
由于希尔密码涉及到字符数组和矩阵操作,实现起来稍微复杂一些,这里给出一个基础的版本,仅用于演示核心思想,实际应用可能需要更复杂的算法和数据结构。
```c
#include <stdio.h>
#include <stdlib.h>
// 希尔密码加密函数
void vigenere_encrypt(char *plaintext, char *key, char *ciphertext) {
int key_length = strlen(key);
for (int i = 0; plaintext[i]; ++i) {
if (plaintext[i] >= 'a' && plaintext[i] <= 'z') {
ciphertext[i] = (plaintext[i] + key[i % key_length]) % 26 + 'a';
} else if (plaintext[i] >= 'A' && plaintext[i] <= 'Z') {
ciphertext[i] = (plaintext[i] + key[i % key_length]) % 26 + 'A';
} else {
ciphertext[i] = plaintext[i];
}
}
}
int main() {
char plaintext[100], key[100], ciphertext[100];
printf("请输入明文: ");
fgets(plaintext, sizeof(plaintext), stdin);
plaintext[strlen(plaintext) - 1] = '\0';
printf("请输入密钥: ");
fgets(key, sizeof(key), stdin);
key[strlen(key) - 1] = '\0';
vigenere_encrypt(plaintext, key, ciphertext);
printf("加密后的密文: %s\n", ciphertext);
return 0;
}
```
这两个例子都假设用户手动输入文本。运行程序时,会提示用户输入明文和相应的参数。注意,这里的实现没有考虑错误处理和边界条件,实际应用中需要添加。
阅读全文