【C 语言】文件操作 ( 文件加密解密

您所在的位置:网站首页 locked文件解密 【C 语言】文件操作 ( 文件加密解密

【C 语言】文件操作 ( 文件加密解密

2023-01-30 20:29| 来源: 网络整理| 查看: 265

文章目录

一、文件加密解密操作

1、解密整 4096 字节的数据

2、解密小于 4096 字节的数据

二、完整代码示例

1、文件加密操作 main.c

2、DES 加密解密头文件 des.h

3、第三方 DES 加密解密函数库源码 des.c

一、文件加密解密操作

准备 2 22 个文件 , 一个是原始文件 , 一个是加密后的文件 , 将原始文件进行加密 , 然后将加密后的数据输出到加密文件中 ;

 

// 要解密的文件 const char *input_file= "D:/File/config_encode.ini"; // 解密后的文件 const char *output_file = "D:/File/config_decode.ini"; // 将 要加密的 input_file 文件加密 , 并输出到 output_file 文件中 ret = file_decode(input_file, output_file);

1、解密整 4096 字节的数据

打开输入文件 , 每次从输入文件中 , 读取 4096 40964096 字节数据 , 将这 4096 40964096 字节数据解密 , 然后写出到解密文件中 ;

 

// 循环读取输入文件中的数据 while (!feof(fp_in)) { // 尝试从输入文件中读取 4K 数据 input_len = fread(input_buffer, 1, 4096, fp_in); // 如果读取完毕 , 直接退出 if (feof(fp_in)) { break; } // 解密 4096 字节数据 ret = des_decode_raw(input_buffer, input_len, output_buffer, &output_len); // 如果加密失败, 直接退出 if (ret != 0) { printf("error : des_encode_raw \n", ret); goto END; } // 将解密后的数据 , 写出到输出文件中 output_tmplen = fwrite(output_buffer, 1, output_len, fp_out); // 如果写出失败 , 直接退出 if (output_tmplen != output_len) { ret = -3; printf("error : fwrite\n"); goto END; } }

2、解密小于 4096 字节的数据

如果读取的数据小于 4096 40964096 字节 , 会退出循环 , 执行下面的业务逻辑 ;

下面的函数主要是 解密小于 4096 字节数据 , 加密完成后 , 将解密数据输出到文件中 ;

 

// 解密小于 4096 字节数据 ret = des_decode(input_buffer, input_len, output_buffer, &output_len); // 加密失败 , 直接退出 if (ret != 0) { printf("error : des_decode \n", ret); goto END; } // 将解密后的数据 , 写出到输出文件中 output_tmplen = fwrite(output_buffer, 1, output_len, fp_out); // 如果写出失败 , 直接退出 if (output_len != output_tmplen) { ret = -3; printf("error : fwrite\n"); goto END; }

二、完整代码示例

1、文件加密操作 main.c

#define _CRT_SECURE_NO_WARNINGS #include #include #include #include "des.h" /** * @brief file_encode 文件加密 * @param input_file 被加密的文件 * @param output_file 加密后的文件 * @return */ int file_encode(const char *input_file, const char *output_file) { // 用于接收各个步骤的返回值 , 做校验 int ret = 0; // 输入 文件 指针 FILE *fp_in= NULL; // 输出 文件 指针 FILE *fp_out = NULL; // 输入缓冲区 , 大小 4K unsigned char input_buffer[4096] = {0}; // 输入数据字节数 int input_len = 0; // 输出文件缓冲区 unsigned char output_buffer[4096] = {0}; // 输出数据字节数 int output_len = 0; // 输出数据写出字节数 , 用于与上面的 output_len 进行对比 // 一般情况下这两个值相等 , 如果出错 , 直接退出程序 int output_tmplen; // 打开输入文件 fp_in = fopen(input_file, "rb"); if (fp_in == NULL) { goto END; } // 打开输出文件 fp_out = fopen(output_file, "wb"); if (fp_out == NULL) { goto END; } // 循环读取输入文件中的数据 while (!feof(fp_in)) { // 尝试从输入文件中读取 4K 数据 input_len = fread(input_buffer, 1, 4096, fp_in); // 如果读取完毕 , 直接退出 if (feof(fp_in)) { break; } // 加密 4096 字节数据 ret = des_encode_raw(input_buffer, input_len, output_buffer, &output_len); // 如果加密失败, 直接退出 if (ret != 0) { printf("error : des_encode_raw \n", ret); goto END; } // 将加密后的数据 , 写出到输出文件中 output_tmplen = fwrite(output_buffer, 1, output_len, fp_out); // 如果写出失败 , 直接退出 if (output_tmplen != output_len) { ret = -3; printf("error : fwrite\n"); goto END; } } // 加密小于 4096 字节数据 ret = des_encode(input_buffer, input_len, output_buffer, &output_len); // 加密失败 , 直接退出 if (ret != 0) { printf("error : des_encode \n", ret); goto END; } // 将加密后的数据 , 写出到输出文件中 output_tmplen = fwrite(output_buffer, 1, output_len, fp_out); // 如果写出失败 , 直接退出 if (output_len != output_tmplen) { ret = -3; printf("error : fwrite\n"); goto END; } END: // 关闭输入文件 if (fp_in != NULL) { fclose(fp_in); } // 关闭输出文件 if (fp_out != NULL) { fclose(fp_out); } return 0; } int main_encode() { // 接收 子函数 返回值 int ret = 0; // 要加密的文件 const char *input_file= "D:/File/config.ini"; // 加密后的文件 const char *output_file = "D:/File/config_encode.ini"; // 将 要加密的 input_file 文件加密 , 并输出到 output_file 文件中 ret = file_encode(input_file, output_file); // 加密失败 if (ret != 0) { printf("error : file_encoder\n " ); return ret; } system("pause"); return ret; } /** * @brief file_decode 文件解密 * @param input_file 被加密的文件 * @param output_file 加密后的文件 * @return */ int file_decode(const char *input_file, const char *output_file) { // 用于接收各个步骤的返回值 , 做校验 int ret = 0; // 输入 文件 指针 FILE *fp_in= NULL; // 输出 文件 指针 FILE *fp_out = NULL; // 输入缓冲区 , 大小 4K unsigned char input_buffer[4096] = {0}; // 输入数据字节数 int input_len = 0; // 输出文件缓冲区 unsigned char output_buffer[4096] = {0}; // 输出数据字节数 int output_len = 0; // 输出数据写出字节数 , 用于与上面的 output_len 进行对比 // 一般情况下这两个值相等 , 如果出错 , 直接退出程序 int output_tmplen; // 打开输入文件 fp_in = fopen(input_file, "rb"); if (fp_in == NULL) { goto END; } // 打开输出文件 fp_out = fopen(output_file, "wb"); if (fp_out == NULL) { goto END; } // 循环读取输入文件中的数据 while (!feof(fp_in)) { // 尝试从输入文件中读取 4K 数据 input_len = fread(input_buffer, 1, 4096, fp_in); // 如果读取完毕 , 直接退出 if (feof(fp_in)) { break; } // 解密 4096 字节数据 ret = des_decode_raw(input_buffer, input_len, output_buffer, &output_len); // 如果加密失败, 直接退出 if (ret != 0) { printf("error : des_encode_raw \n", ret); goto END; } // 将解密后的数据 , 写出到输出文件中 output_tmplen = fwrite(output_buffer, 1, output_len, fp_out); // 如果写出失败 , 直接退出 if (output_tmplen != output_len) { ret = -3; printf("error : fwrite\n"); goto END; } } // 解密小于 4096 字节数据 ret = des_decode(input_buffer, input_len, output_buffer, &output_len); // 加密失败 , 直接退出 if (ret != 0) { printf("error : des_decode \n", ret); goto END; } // 将解密后的数据 , 写出到输出文件中 output_tmplen = fwrite(output_buffer, 1, output_len, fp_out); // 如果写出失败 , 直接退出 if (output_len != output_tmplen) { ret = -3; printf("error : fwrite\n"); goto END; } END: // 关闭输入文件 if (fp_in != NULL) { fclose(fp_in); } // 关闭输出文件 if (fp_out != NULL) { fclose(fp_out); } return 0; } int main_decode() { // 接收 子函数 返回值 int ret = 0; // 要解密的文件 const char *input_file= "D:/File/config_encode.ini"; // 解密后的文件 const char *output_file = "D:/File/config_decode.ini"; // 将 要加密的 input_file 文件加密 , 并输出到 output_file 文件中 ret = file_decode(input_file, output_file); // 加密失败 if (ret != 0) { printf("error : file_encoder\n " ); return ret; } system("pause"); return ret; } int main() { // 文件加密 //main_encode(); // 文件解密 main_decode(); system("pause"); return 0; }t_data 输出数据 * @param out_data_len 输出数据长度 * @return */ int des_encode_raw( unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len); /** * @brief des_encode DES 加密操作 , 加密少于 4096 字节数据 * @param in_data 输入数据 * @param in_data_len 输入数据长度 * @param out_data 输出数据 * @param out_data_len 输出数据长度 * @return */ int des_encode( unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len); /** * @brief des_decode_raw DES 解密操作 , 解密 4096 字节 * @param in_data 输入数据 * @param in_data_len 输入数据长度 * @param out_data 输出数据 * @param out_data_len 输出数据长度 * @return */ int des_decode_raw( unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len); /** * @brief des_decode DES 解密操作 , 解密少于 4096 字节 * @param in_data 输入数据 * @param in_data_len 输入数据长度 * @param out_data 输出数据 * @param out_data_len 输出数据长度 * @return */ int des_decode( unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len); #ifdef __cplusplus } #endif #endif



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3