用c语言写一个维吉尼亚算法
时间: 2024-05-14 22:16:21 浏览: 18
下面是一个简单的C语言实现维吉尼亚算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TEXT_SIZE 1000
#define MAX_KEY_SIZE 100
char* encrypt_vigenere(char* plaintext, char* key);
char* decrypt_vigenere(char* ciphertext, char* key);
int main()
{
char plaintext[MAX_TEXT_SIZE];
char key[MAX_KEY_SIZE];
char* ciphertext;
char* decrypted_text;
printf("Enter plaintext: ");
fgets(plaintext, MAX_TEXT_SIZE, stdin);
printf("Enter key: ");
fgets(key, MAX_KEY_SIZE, stdin);
// Remove newline characters
plaintext[strcspn(plaintext, "\n")] = 0;
key[strcspn(key, "\n")] = 0;
// Encrypt plaintext
ciphertext = encrypt_vigenere(plaintext, key);
printf("Encrypted text: %s\n", ciphertext);
// Decrypt ciphertext
decrypted_text = decrypt_vigenere(ciphertext, key);
printf("Decrypted text: %s\n", decrypted_text);
free(ciphertext);
free(decrypted_text);
return 0;
}
char* encrypt_vigenere(char* plaintext, char* key)
{
int key_len = strlen(key);
int text_len = strlen(plaintext);
char* ciphertext = (char*)malloc(text_len + 1);
for (int i = 0; i < text_len; i++)
{
int key_index = i % key_len;
int shift = key[key_index] - 'a';
ciphertext[i] = (plaintext[i] + shift - 'a') % 26 + 'a';
}
ciphertext[text_len] = '\0';
return ciphertext;
}
char* decrypt_vigenere(char* ciphertext, char* key)
{
int key_len = strlen(key);
int text_len = strlen(ciphertext);
char* plaintext = (char*)malloc(text_len + 1);
for (int i = 0; i < text_len; i++)
{
int key_index = i % key_len;
int shift = key[key_index] - 'a';
plaintext[i] = (ciphertext[i] - shift - 'a' + 26) % 26 + 'a';
}
plaintext[text_len] = '\0';
return plaintext;
}
```
在这个示例中,我们首先获取用户输入的明文和密钥,然后使用 `encrypt_vigenere` 函数加密明文,使用 `decrypt_vigenere` 函数解密密文,并将结果打印到控制台上。
`encrypt_vigenere` 函数和 `decrypt_vigenere` 函数都接受两个参数:明文或密文和密钥。它们首先计算密钥的长度和明文或密文的长度,然后使用循环将每个字符加密或解密,并将结果存储在新的字符串中。最后,它们返回新字符串的指针。
请注意,这个示例只处理小写字母,因此如果输入包含大写字母、数字或标点符号,程序可能会产生不正确的结果。为了使程序更健壮,您可能需要添加一些输入验证和错误处理代码。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)