请扮演一个资深程序员,编写 Vigenere 密码解密C程序,在已知密钥的情况下将密文(包含大小写字母)文件解密得到明文文件
时间: 2023-05-31 09:06:01 浏览: 176
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_FILE_SIZE 100000
void decrypt(char *ciphertext, char *key, char *plaintext);
int main()
{
char ciphertext[MAX_FILE_SIZE], key[MAX_FILE_SIZE], plaintext[MAX_FILE_SIZE];
FILE *ciphertext_file, *key_file, *plaintext_file;
// 打开密文文件
ciphertext_file = fopen("ciphertext.txt", "r");
if (ciphertext_file == NULL)
{
printf("无法打开密文文件!\n");
exit(1);
}
// 读取密文
fgets(ciphertext, MAX_FILE_SIZE, ciphertext_file);
// 关闭密文文件
fclose(ciphertext_file);
// 打开密钥文件
key_file = fopen("key.txt", "r");
if (key_file == NULL)
{
printf("无法打开密钥文件!\n");
exit(1);
}
// 读取密钥
fgets(key, MAX_FILE_SIZE, key_file);
// 关闭密钥文件
fclose(key_file);
// 解密密文
decrypt(ciphertext, key, plaintext);
// 打开明文文件
plaintext_file = fopen("plaintext.txt", "w");
if (plaintext_file == NULL)
{
printf("无法打开明文文件!\n");
exit(1);
}
// 写入明文
fputs(plaintext, plaintext_file);
// 关闭明文文件
fclose(plaintext_file);
printf("解密完成!\n");
return 0;
}
void decrypt(char *ciphertext, char *key, char *plaintext)
{
int ciphertext_len = strlen(ciphertext);
int key_len = strlen(key);
int i, j;
for (i = 0, j = 0; i < ciphertext_len; i++, j++)
{
if (j == key_len)
{
j = 0;
}
if (isupper(ciphertext[i]))
{
plaintext[i] = ((ciphertext[i] - key[j] + 26) % 26) + 'A';
}
else if (islower(ciphertext[i]))
{
plaintext[i] = ((ciphertext[i] - key[j] + 26) % 26) + 'a';
}
else
{
plaintext[i] = ciphertext[i];
j--;
}
}
plaintext[i] = '\0';
}
阅读全文