【CUPK小学期】笔记1:文件加密解密(1) |
您所在的位置:网站首页 › c语言文件读写操作程序 › 【CUPK小学期】笔记1:文件加密解密(1) |
要求功能 将输入的字符串信息(包含字母和数字)保存至文件。 实现在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 // 加密函数 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; } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |