用C语言编写 Vigenere 密码加密和解密程序,在已知密钥的情况下将密文文件解密得到明文文件,在已知密钥的情况下将明文文件解密得到密文文件
时间: 2023-06-01 20:03:39 浏览: 132
以下是用C语言编写的Vigenere密码加密和解密程序,可实现已知密钥的情况下将密文文件解密得到明文文件,也可实现已知密钥的情况下将明文文件加密得到密文文件。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1000
/* 加密函数 */
void encrypt(char *input_filename, char *output_filename, char *key) {
FILE *fin, *fout;
char input[MAX_SIZE], output[MAX_SIZE];
int len_key = strlen(key);
int len_input, i, j;
/* 打开输入文件和输出文件 */
fin = fopen(input_filename, "r");
if (fin == NULL) {
printf("无法打开输入文件\n");
return;
}
fout = fopen(output_filename, "w");
if (fout == NULL) {
printf("无法打开输出文件\n");
return;
}
/* 对输入文件进行加密 */
while (fgets(input, MAX_SIZE, fin) != NULL) {
len_input = strlen(input);
for (i = 0, j = 0; i < len_input; i++, j = (j + 1) % len_key) {
/* 对每个字符进行加密 */
output[i] = ((input[i] - 'A') + (key[j] - 'A')) % 26 + 'A';
}
output[len_input] = '\0';
fputs(output, fout);
}
/* 关闭文件 */
fclose(fin);
fclose(fout);
printf("加密完成\n");
}
/* 解密函数 */
void decrypt(char *input_filename, char *output_filename, char *key) {
FILE *fin, *fout;
char input[MAX_SIZE], output[MAX_SIZE];
int len_key = strlen(key);
int len_input, i, j;
/* 打开输入文件和输出文件 */
fin = fopen(input_filename, "r");
if (fin == NULL) {
printf("无法打开输入文件\n");
return;
}
fout = fopen(output_filename, "w");
if (fout == NULL) {
printf("无法打开输出文件\n");
return;
}
/* 对输入文件进行解密 */
while (fgets(input, MAX_SIZE, fin) != NULL) {
len_input = strlen(input);
for (i = 0, j = 0; i < len_input; i++, j = (j + 1) % len_key) {
/* 对每个字符进行解密 */
output[i] = ((input[i] - 'A') - (key[j] - 'A') + 26) % 26 + 'A';
}
output[len_input] = '\0';
fputs(output, fout);
}
/* 关闭文件 */
fclose(fin);
fclose(fout);
printf("解密完成\n");
}
int main() {
char input_filename[MAX_SIZE], output_filename[MAX_SIZE], key[MAX_SIZE];
int choice;
printf("请选择操作:\n");
printf("1. 加密\n");
printf("2. 解密\n");
scanf("%d", &choice);
printf("请输入输入文件名:\n");
scanf("%s", input_filename);
printf("请输入输出文件名:\n");
scanf("%s", output_filename);
printf("请输入密钥:\n");
scanf("%s", key);
switch(choice) {
case 1:
encrypt(input_filename, output_filename, key);
break;
case 2:
decrypt(input_filename, output_filename, key);
break;
default:
printf("无效的操作\n");
break;
}
return 0;
}
```
使用方法:
1. 编译并运行程序。
2. 选择操作(加密或解密)。
3. 输入输入文件名、输出文件名和密钥。
4. 程序将对输入文件进行相应的操作,并将结果输出到输出文件中。