linux

C++在Linux怎样实现文件加密

小樊
44
2025-10-06 10:40:37
栏目: 编程语言

在Linux系统中,使用C++实现文件加密可以通过多种方式来完成。以下是一个简单的例子,展示了如何使用OpenSSL库来实现文件的加密和解密。OpenSSL是一个强大的加密库,提供了多种加密算法。

首先,确保你的Linux系统上安装了OpenSSL开发库。在大多数发行版中,你可以使用包管理器来安装它。例如,在基于Debian的系统上,可以使用以下命令安装:

sudo apt-get update
sudo apt-get install libssl-dev

然后,你可以编写一个C++程序来使用OpenSSL库进行文件加密。以下是一个简单的示例程序,它使用AES-256-CBC算法来加密和解密文件:

#include <iostream>
#include <fstream>
#include <openssl/aes.h>
#include <openssl/rand.h>

// 加密函数
bool encryptFile(const std::string &inputFilename, const std::string &outputFilename, const std::string &password) {
    // 打开输入文件
    std::ifstream inputFile(inputFilename, std::ios::binary);
    if (!inputFile.good()) {
        std::cerr << "Error opening input file." << std::endl;
        return false;
    }

    // 创建输出文件
    std::ofstream outputFile(outputFilename, std::ios::binary);
    if (!outputFile.good()) {
        std::cerr << "Error opening output file." << std::endl;
        return false;
    }

    // 从密码生成密钥和IV
    AES_KEY encKey;
    unsigned char key[AES_KEYLEN_256];
    unsigned char iv[AES_BLOCK_SIZE];
    if (!RAND_bytes(key, sizeof(key)) || !RAND_bytes(iv, sizeof(iv))) {
        std::cerr << "Error generating key or IV." << std::endl;
        return false;
    }
    AES_set_encrypt_key(key, AES_KEYLEN_256, &encKey);

    // 写入IV到输出文件
    outputFile.write(reinterpret_cast<const char*>(iv), sizeof(iv));

    // 加密数据并写入输出文件
    char inBuffer[AES_BLOCK_SIZE];
    char outBuffer[AES_BLOCK_SIZE + AES_BLOCK_SIZE];
    while (inputFile.good()) {
        inputFile.read(inBuffer, sizeof(inBuffer));
        int bytesRead = inputFile.gcount();
        AES_cbc_encrypt(inBuffer, outBuffer, bytesRead, &encKey, iv, AES_ENCRYPT);
        outputFile.write(outBuffer, sizeof(outBuffer));
    }

    inputFile.close();
    outputFile.close();

    return true;
}

// 解密函数
bool decryptFile(const std::string &inputFilename, const std::string &outputFilename, const std::string &password) {
    // 打开输入文件
    std::ifstream inputFile(inputFilename, std::ios::binary);
    if (!inputFile.good()) {
        std::cerr << "Error opening input file." << std::endl;
        return false;
    }

    // 创建输出文件
    std::ofstream outputFile(outputFilename, std::ios::binary);
    if (!outputFile.good()) {
        std::cerr << "Error opening output file." << std::endl;
        return false;
    }

    // 读取IV从输入文件
    unsigned char iv[AES_BLOCK_SIZE];
    inputFile.read(reinterpret_cast<char*>(iv), sizeof(iv));

    // 设置解密密钥
    AES_KEY decKey;
    unsigned char key[AES_KEYLEN_256];
    if (!RAND_bytes(key, sizeof(key))) {
        std::cerr << "Error generating key." << std::endl;
        return false;
    }
    AES_set_decrypt_key(key, AES_KEYLEN_256, &decKey);

    // 解密数据并写入输出文件
    char inBuffer[AES_BLOCK_SIZE + AES_BLOCK_SIZE];
    char outBuffer[AES_BLOCK_SIZE];
    while (inputFile.good()) {
        inputFile.read(inBuffer, sizeof(inBuffer));
        int bytesRead = inputFile.gcount();
        AES_cbc_encrypt(inBuffer, outBuffer, bytesRead, &decKey, iv, AES_DECRYPT);
        outputFile.write(outBuffer, sizeof(outBuffer));
    }

    inputFile.close();
    outputFile.close();

    return true;
}

int main() {
    std::string inputFilename = "input.txt";
    std::string encryptedFilename = "encrypted.bin";
    std::string decryptedFilename = "decrypted.txt";
    std::string password = "your_password";

    // 加密文件
    if (encryptFile(inputFilename, encryptedFilename, password)) {
        std::cout << "File encrypted successfully." << std::endl;
    } else {
        std::cerr << "Error encrypting file." << std::endl;
    }

    // 解密文件
    if (decryptFile(encryptedFilename, decryptedFilename, password)) {
        std::cout << "File decrypted successfully." << std::endl;
    } else {
        std::cerr << "Error decrypting file." << std::endl;
    }

    return 0;
}

请注意,这个示例程序使用了硬编码的密码生成密钥,这在实际应用中是不安全的。在实际情况中,你应该使用一个安全的密钥派生函数(如PBKDF2)来从用户提供的密码中派生出加密密钥。

此外,这个程序没有处理文件大小不是AES块大小倍数的情况。在实际应用中,你需要添加填充(如PKCS#7)来处理这种情况。

编译这个程序时,你需要链接OpenSSL库:

g++ -o encrypt decrypt.cpp -lcrypto

然后运行编译出的程序:

./encrypt

这个程序将读取input.txt文件,将其加密为encrypted.bin,然后解密回decrypted.txt。请确保在实际使用中处理好错误和异常情况,并且不要在代码中使用硬编码的密码。

0
看了该问题的人还看了