C语言文件加密解密可通过简单对称算法(如异或操作)或安全非对称算法(如RSA)实现:异或加密易于实现但安全性低,仅适合学习或非敏感数据;RSA加密安全性高但效率较低,适合敏感数据。实现时必须使用二进制模式("rb"/"wb")处理文件,确保完整读写任意数据。实际应用中,应优先使用成熟的加密库(如OpenSSL)而非自行实现算法,以兼顾安全性、效率和跨平台兼容性。

在数字化时代,文件加密解密是保障数据安全的重要手段。

一、基本概念

文件加密的本质是:通过某种算法和密钥,将原始文件(明文)转换为不可读的乱码(密文)。解密则是其逆过程:

  • 加密:原始文件 + 加密算法 + 密钥 = 密文文件
  • 解密:密文文件 + 解密算法 + 密钥 = 原始文件

二、常见加密算法及实现

1. 对称加密算法(加密和解密使用相同密钥)

(1) 异或(XOR)加密(最简单,但安全性低)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 加密/解密函数(异或加密中,加密和解密是同一个操作)
void xor_encrypt_decrypt_file(const char *input_path, const char *output_path, const char *key) {
    FILE* input_file = fopen(input_path, "rb");
    FILE* output_file = fopen(output_path, "wb");

    if (!input_file || !output_file) {
        printf("文件打开失败!\n");
        if (input_file) fclose(input_file);
        if (output_file) fclose(output_file);
        return;
    }

    int key_length = strlen(key);
    int key_index = 0;
    int ch;

    // 逐字节读取、异或、写入
    while ((ch = fgetc(input_file)) != EOF) {
        ch = ch ^ key[key_index];  // 异或操作
        fputc(ch, output_file);
        key_index = (key_index + 1) % key_length;  // 循环使用密钥
    }

    fclose(input_file);
    fclose(output_file);
    printf("操作完成!\n");
}

使用示例:

int main() {
    xor_encrypt_decrypt_file("source.txt", "encrypted.dat", "secret_key");
    // 解密时使用相同的函数和密钥
    xor_encrypt_decrypt_file("encrypted.dat", "decrypted.txt", "secret_key");
    return 0;
}
(2) RSA非对称加密(安全性高,适合敏感数据)

基于RSA-Library,可以快速实现:

  1. 环境配置与编译
git clone https://gitcode.com/gh_mirrors/rs/RSA-Library
cd RSA-Library
make
  1. 核心API使用
#include "rsa.h"

// 生成密钥对
public_key_class pub;
private_key_class priv;
rsa_gen_keys(&pub, &priv, "primes.txt");

// 加密文件
char* message = "Hello, RSA Encryption!";
long long* encrypted = rsa_encrypt(message, strlen(message), &pub);

// 解密文件
char* decrypted = rsa_decrypt(encrypted, 8 * strlen(message), &priv);

注意:RSA加密后的数据大小是原始数据的8倍,解密后恢复原始大小。

2. 非对称加密算法(加密和解密使用不同密钥)

RSA加密示例

RSA-Library提供了简洁的API,让实现非对称加密变得简单:

#include "rsa.h"

int main() {
    public_key_class pub;
    private_key_class priv;
    
    // 生成密钥对
    rsa_gen_keys(&pub, &priv, "primes.txt");
    
    // 加密
    char* plain_text = "Secret Message";
    long long* encrypted = rsa_encrypt(plain_text, strlen(plain_text), &pub);
    
    // 解密
    char* decrypted = rsa_decrypt(encrypted, 8 * strlen(plain_text), &priv);
    
    printf("Decrypted: %s\n", decrypted);
    
    free(encrypted);
    free(decrypted);
    return 0;
}

三、文件加密解密的实现思路

1. 二进制模式操作

为确保能处理任意数据(包括图片、程序等二进制文件),必须使用二进制模式("rb"和"wb")进行文件读写:

FILE* input_file = fopen("source.bin", "rb");
FILE* output_file = fopen("encrypted.bin", "wb");

2. 加密流程

  1. 以二进制模式打开源文件
  2. 逐字节读取文件内容
  3. 应用加密算法(如异或、RSA等)
  4. 将加密后的数据写入目标文件

3. 解密流程

  1. 以二进制模式打开加密文件
  2. 逐字节读取加密数据
  3. 应用解密算法
  4. 将解密后的数据写入目标文件

四、注意事项

  1. 安全性考虑

    • 异或加密安全性低,仅适合学习或非敏感数据
    • RSA等非对称加密算法安全性高,适合敏感数据
    • 密钥管理至关重要,不应硬编码在代码中
  2. 性能考虑

    • 对称加密算法(如AES)速度较快,适合大文件
    • 非对称加密算法(如RSA)速度较慢,适合小数据或密钥传输
  3. 跨平台兼容性

    • 使用标准C库函数可确保跨平台兼容性
    • 避免使用特定操作系统的加密API(如Windows的CryptoAPI)

五、推荐实践

  1. 学习阶段:从简单的异或加密开始,理解加密原理
  2. 原型开发:使用RSA-Library快速实现加密功能
  3. 生产环境:考虑使用成熟的加密库(如OpenSSL)实现更安全的加密方案

提示:对于实际应用,建议使用成熟的加密库如OpenSSL,它提供了更全面、安全的加密算法实现,而不是从头实现加密算法。