要求功能
-
将输入的字符串信息(包含字母和数字)保存至文件。
-
实现在C语言程序中对该文件的加密和解密功能。
必备知识
C语言程序设计:文件、位运算
程序展示
加密
加密后的结果:
解密
解密后的结果
代码思路
1.加密函数
void encryptFile(FILE *srcFile, FILE *destFile, char key) {
}
函数名为encryptFile,接受三个参数:源文件指针srcFile、目标文件指针destFile和加密密钥key。
函数的具体步骤如下:
(1). 声明一个字符变量ch,用于存储读取到的字符。
char ch;
(2). 使用一个循环,不断从源文件中读取字符,直到文件结束(EOF)。
(3). 在循环中,对读取到的字符进行异或操作,密钥为`key`。这个操作会对字符进行加密。
(4). 将加密后的字符写入目标文件中。
while ((ch = fgetc(srcFile)) != EOF) {
// 对字符进行异或操作
ch = ch ^ key;
fputc(ch, destFile);
}
ch = ch ^ key
是一个异或运算(XOR),表示对变量ch
和key
进行逐位异或操作。- 异或运算的规则是:如果两个对应位的值相同,则结果为0;如果两个对应位的值不同,则结果为1。
- 这个操作可以实现一些简单的加密和解密操作。在加密中,可以用一个密钥(
key
)对明文进行异或运算,得到密文。在解密中,再用相同的密钥对密文进行异或运算,可以得到原来的明文。
(5). 循环结束后,表示文件已经全部加密完成。
2.解密函数
解密操作与加密操作是互逆的,即通过解密函数对加密后的文件进行解密,可以还原为原始的文件内容。
void decryptFile(FILE *srcFile, FILE *destFile, char key) {
}
函数名为decryptFile
,接受三个参数:源文件指针srcFile
、目标文件指针destFile
和解密密钥key
。
函数的具体步骤与加密函数类似:
(1)声明一个字符变量ch,用于存储读取到的字符。
char ch;
(2)使用一个循环,不断从源文件中读取字符,直到文件结束(EOF)。
(3)在循环中,对读取到的字符进行异或操作,密钥为key。这个操作会对字符进行解密。
(4)将解密后的字符写入目标文件中。
while ((ch = fgetc(srcFile)) != EOF) {
// 对字符进行异或操作
ch = ch ^ key;
fputc(ch, destFile);
}
(5)循环结束后,表示文件已经全部解密完成。
原理
必须保证输入的密钥要保持一致。
加密 1010 (ch) 1100(key) 0110 (结果) 解密 ^ 1100 (key) 1010 (ch)
3.主函数
首先,用户输入要操作的文件名。然后,用户需要选择是加密还是解密操作,并输入密钥。根据用户的选择,程序会打开源文件和目标文件,并调用相应的加密或解密函数将文件内容进行处理。最后,程序会关闭文件并输出相应的完成提示。
具体思路如下:
(1)声明变量:srcFileName和destFileName用于存储文件名,key用于存储密钥,choice用于存储用户选择的操作。同时,声明srcFile和destFile两个文件指针变量。
char srcFileName[100], destFileName[100], key;
int choice;
FILE *srcFile, *destFile;
(2)提示用户输入要操作的文件名,并将输入存储到srcFileName变量中。
printf("请输入要操作的文件名:");
scanf("%s", srcFileName);
(3)打开源文件:使用fopen函数打开srcFileName指定的文件,并将返回的文件指针赋值给srcFile变量。如果打开失败(srcFile为NULL),则输出错误信息并返回1。
srcFile = fopen(srcFileName, "r");
if (srcFile == NULL) {
printf("无法打开文件!\n");
return 1;
}
(4)提示用户选择操作,并将选择存储到choice变量中。
printf("请选择操作:\n");
printf("1. 加密\n");
printf("2. 解密\n");
printf("请输入选项:");
scanf("%d", &choice);
(5)提示用户输入密钥,并将输入存储到key变量中。
printf("请输入密钥:");
scanf(" %c", &key);
(6)如果用户选择加密操作(choice为1):
a. 提示用户输入加密后的文件名,并将输入存储到destFileName变量中。
b. 打开目标文件:使用fopen函数打开destFileName指定的文件,并将返回的文件指针赋值给destFile变量。如果打开失败(destFile为NULL),则输出错误信息并返回1。
if (choice == 1) {
printf("请输入加密后的文件名:");
scanf("%s", destFileName);
// 打开目标文件,如果文件不存在则创建
destFile = fopen(destFileName, "w");
if (destFile == NULL) {
printf("无法创建文件!\n");
return 1;
}
c. 调用加密函数:将srcFile、destFile和key作为参数传递给encryptFile函数,对源文件进行加密处理。
d. 输出加密完成的提示信息。
encryptFile(srcFile, destFile, key);
printf("加密完成!\n");
} else if (choice == 2) {
printf("请输入解密后的文件名:");
scanf("%s", destFileName);
// 打开目标文件,如果文件不存在则创建
destFile = fopen(destFileName, "w");
if (destFile == NULL) {
printf("无法创建文件!\n");
return 1;
}
(7)如果用户选择解密操作(choice为2):
a. 提示用户输入解密后的文件名,并将输入存储到destFileName变量中。
b. 打开目标文件:使用fopen函数打开destFileName指定的文件,并将返回的文件指针赋值给destFile变量。如果打开失败(destFile为NULL),则输出错误信息并返回1。
c. 调用解密函数:将srcFile、destFile和key作为参数传递给decryptFile函数,对源文件进行解密处理。
d. 输出解密完成的提示信息。
(8)如果用户选择的操作既不是加密也不是解密(choice不为1或2),则输出无效选项的提示信息。
decryptFile(srcFile, destFile, key);
printf("解密完成!\n");
} else {
printf("无效的选项!\n");
}
(9)关闭文件:使用fclose函数分别关闭srcFile和destFile。
(10)返回0,表示程序执行成功。
fclose(srcFile);
fclose(destFile);
return 0;
完整代码
#include <stdio.h>
// 加密函数
void encryptFile(FILE *srcFile, FILE *destFile, char key) {
char ch;
while ((ch = fgetc(srcFile)) != EOF) {
// 对字符进行异或操作
ch = ch ^ key;
fputc(ch, destFile);
}
}
// 解密函数
void decryptFile(FILE *srcFile, FILE *destFile, char key) {
char ch;
while ((ch = fgetc(srcFile)) != EOF) {
// 对字符进行异或操作
ch = ch ^ key;
fputc(ch, destFile);
}
}
int main() {
char srcFileName[100], destFileName[100], key;
int choice;
FILE *srcFile, *destFile;
printf("请输入要操作的文件名:");
scanf("%s", srcFileName);
// 打开源文件
srcFile = fopen(srcFileName, "r");
if (srcFile == NULL) {
printf("无法打开文件!\n");
return 1;
}
printf("请选择操作:\n");
printf("1. 加密\n");
printf("2. 解密\n");
printf("请输入选项:");
scanf("%d", &choice);
printf("请输入密钥:");
scanf(" %c", &key);
if (choice == 1) {
printf("请输入加密后的文件名:");
scanf("%s", destFileName);
// 打开目标文件,如果文件不存在则创建
destFile = fopen(destFileName, "w");
if (destFile == NULL) {
printf("无法创建文件!\n");
return 1;
}
// 调用加密函数
encryptFile(srcFile, destFile, key);
printf("加密完成!\n");
} else if (choice == 2) {
printf("请输入解密后的文件名:");
scanf("%s", destFileName);
// 打开目标文件,如果文件不存在则创建
destFile = fopen(destFileName, "w");
if (destFile == NULL) {
printf("无法创建文件!\n");
return 1;
}
// 调用解密函数
decryptFile(srcFile, destFile, key);
printf("解密完成!\n");
} else {
printf("无效的选项!\n");
}
// 关闭文件
fclose(srcFile);
fclose(destFile);
return 0;
}