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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【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


目录
相关文章
|
2月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
2月前
|
数据安全/隐私保护 Python
Zipfile学习笔记(二)::通过zipfile模块暴力破解加密的压缩文件
如何使用Python的zipfile模块生成密码表并尝试暴力破解加密的ZIP压缩文件。
38 1
Zipfile学习笔记(二)::通过zipfile模块暴力破解加密的压缩文件
|
1月前
|
存储 C语言
【c语言】玩转文件操作
本文介绍了C语言中文件操作的基础知识,包括文件的打开和关闭、文件的顺序读写、文件的随机读写以及文件读取结束的判定。详细讲解了`fopen`、`fclose`、`fseek`、`ftell`、`rewind`等函数的使用方法,并通过示例代码展示了如何进行文件的读写操作。最后,还介绍了如何判断文件读取结束的原因,帮助读者更好地理解和应用文件操作技术。
35 2
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
2月前
|
存储 C语言
C语言文件操作(2)
【10月更文挑战第2天】
|
2月前
|
程序员 编译器 C语言
C语言底层知识------文件操作
本文详细介绍了文件操作的基本概念,包括文件的分类(程序文件和数据文件,其中着重于数据文件的文本文件和二进制文件),流的概念及其在C程序中的应用,以及标准输入输出流stdin、stdout和stderr的作用。作者通过示例展示了如何使用fopen、fclose和常见的读写函数如fgetc、fputc和fgets进行文件操作。
22 2
|
2月前
|
存储 缓存 编译器
文件操作——C语言
文件操作——C语言
|
2月前
|
存储 C语言
简述C语言文件操作
简述C语言文件操作
11 0
|
2月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序

热门文章

最新文章

下一篇
无影云桌面