【CUPK小学期】笔记1:文件加密解密(1)

您所在的位置:网站首页 c语言文件读写操作程序 【CUPK小学期】笔记1:文件加密解密(1)

【CUPK小学期】笔记1:文件加密解密(1)

2023-07-04 20:38| 来源: 网络整理| 查看: 265

要求功能

将输入的字符串信息(包含字母和数字)保存至文件。

实现在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