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

简介: 【C 语言】文件操作 ( 文件加密解密 | 解密文件 )(一)

文章目录

一、文件加密解密操作

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 <stdlib.h>
#include <string.h>
#include <stdio.h>
#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


目录
相关文章
|
1月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
130 5
|
1月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
66 0
|
4月前
|
存储 安全 数据安全/隐私保护
Hyper V文件复制安全:加密与访问控制
在Hyper-V环境中,确保文件复制的安全性至关重要。主要措施包括:启用数据加密、使用HTTPS协议和磁盘加密技术(如BitLocker)保护数据传输和存储;通过身份验证、权限管理和审核日志控制访问;定期更新补丁、实施网络隔离及制定备份恢复策略。这些多层次的安全措施共同防止未经授权的访问和数据泄露,保障数据安全。
Hyper V文件复制安全:加密与访问控制
|
5月前
|
人工智能 C语言
|
6月前
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
189 5
|
7月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
178 9
|
7月前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
8月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
501 3
|
存储 C语言
C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#(下)
C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#(下)
|
Linux 编译器 C语言
C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#(上)
C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#(上)