Ubuntu环境下,使用clion编译器,使用开源opensll的对称AES算法对于文件进行加密,C++代码

本文介绍了一个使用OpenSSL库实现的AES256文件加密和解密的C++示例。该示例展示了如何通过指定密钥对文件进行加密和解密的过程,并提供了完整的代码实现。

前提准备条件

  • 需要安装openssl
  • 需要安装openssl-dev
  • 需要配置CMakeLists.txt文件
  • 集体内容可以参考我提供的相关参考链接

AES_file.h

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

#define RELEASE_ARRAY(P) if (P)  \
{                                \
    delete[] P;                  \
    P = NULL;                    \
}

class AES{
public:
    // AES文件加密函数 ///////////////////////////////////////////////////////////
    int TestAesEncryptFile(std::string original_backup_file_path, std::string backup_dir_path, std::string &password)
    {
        int encrypt_chunk_size = 16;

        std::ifstream original_backup_file(original_backup_file_path.c_str(), std::ios::binary);
        std::ofstream backup_dir(backup_dir_path, std::ios::binary);

        if (!original_backup_file)
        {
            std::cout << "Can not open original_backup_file file." << std::endl;
            return 1;
        }
        if (!backup_dir)
        {
            std::cout << "Can not open backup_dir_path file." << std::endl;
            return 1;
        }

        //用指定密钥对一段内存进行加密,结果放在outbuffer中
        unsigned char aes_keybuf[32];
        memset(aes_keybuf, 0, sizeof(aes_keybuf));
        strcpy((char *)aes_keybuf, password.c_str());
        AES_KEY aeskey;
        AES_set_encrypt_key(aes_keybuf, 256, &aeskey);

        char *in_data = new char[encrypt_chunk_size + 1];
        char *out_data = new char[encrypt_chunk_size + 1];
        while (!original_backup_file.eof())
        {
            original_backup_file.read(in_data, encrypt_chunk_size);
            if (original_backup_file.gcount() < encrypt_chunk_size)
            {
                backup_dir.write(in_data, original_backup_file.gcount());
            }
            else
            {
                AES_encrypt((const unsigned char *)in_data, (unsigned char *)out_data, &aeskey);
                backup_dir.write(out_data, original_backup_file.gcount());
            }
        };

        backup_dir.close();
        original_backup_file.close();

        RELEASE_ARRAY(in_data);
        RELEASE_ARRAY(out_data);
        return 0;
    }

// AES文件解密函数 //////////////////////////////////////////////////////////
    int TestAesDecryptFile(std::string in_file_path, std::string out_file_path, std::string &password)
    {
        int encrypt_chunk_size = 16;
        std::ifstream original_backup_file(in_file_path.c_str(), std::ios::binary);
        std::ofstream backup_dir(out_file_path, std::ios::binary);

        if (!original_backup_file)
        {
            std::cout << "Can not open original_backup_file file." << std::endl;
            return 1;
        }
        if (!backup_dir)
        {
            std::cout << "Can not open backup_dir file." << std::endl;
            return 1;
        }

        //用指定密钥对一段内存进行加密,结果放在outbuffer中
        unsigned char aes_keybuf[32];
        memset(aes_keybuf, 0, sizeof(aes_keybuf));
        strcpy((char *)aes_keybuf, password.c_str());
        AES_KEY aeskey;
        AES_set_decrypt_key(aes_keybuf, 256, &aeskey);

        char *in_data = new char[encrypt_chunk_size + 1];
        char *out_data = new char[encrypt_chunk_size + 1];
        while (!original_backup_file.eof())
        {
            original_backup_file.read(in_data, encrypt_chunk_size);
            if (original_backup_file.gcount() < encrypt_chunk_size)
            {
                backup_dir.write(in_data, original_backup_file.gcount());
            }
            else
            {
                AES_decrypt((unsigned char *)in_data, (unsigned char *)out_data, &aeskey);
                backup_dir.write(out_data, original_backup_file.gcount());
            }
        };
        backup_dir.close();
        original_backup_file.close();
        RELEASE_ARRAY(in_data);
        RELEASE_ARRAY(out_data);
        return 0;
    }
};

main.cpp

#include <iostream>
#include "load_or_save_db.h"
#include "include/AES_file.h"

int main() {

    time_t t1, t2, t3, t4;
    t1 = time(nullptr);
    printf("加解密起始时间: %s\n", ctime(&t1));
    std::string password = "xcdf123456";
    AES aes;
    // 数据开始加密
    aes.TestAesEncryptFile("/home/gsc/Projects/1.txt", "/home/gsc/Projects/2.txt", password);
    t2 = time(nullptr);
    printf("AES256加密成功!\n");
    printf("加密用时: %ld秒\n", (t2 - t1));
    t3 = time(NULL);
    // 数据开始解密
    aes.TestAesDecryptFile("/home/gsc/Projects/2.txt", "/home/gsc/Projects/3.txt", password);
    t4 = time(NULL);
    printf("AES256解密成功!\n");
    printf("解密用时: %lld秒\n", (t4 - t3));

    return 0;
}

参考链接

在Windows 10上配置CLion使用WSL集成Ubuntu中的C++编译器和CMake工具链,可以让你在Windows环境下高效地进行Linux平台的C++开发。首先,请确保你的系统已安装最新版本的Windows 10秋季创作者更新(build 16299.15或更高)。接着,按照以下步骤进行配置: 参考资源链接:[Windows 10 CLion与WSL集成:轻松构建Linux项目](https://wenku.youkuaiyun.com/doc/64643c4d543f8444889fc25a?spm=1055.2569.3001.10343) 1. **安装WSL**: 打开“设置”,选择“应用”,然后点击“程序和功能”,在左侧菜单中选择“启用或关闭Windows功能”,找到并勾选“适用于Linux的Windows子系统”,点击“确定”并重启你的电脑。 2. **安装Ubuntu**: 打开Microsoft Store,搜索并下载Ubuntu应用。安装完成后,首次运行Ubuntu应用,它将引导你设置用户名和密码。 3. **更新WSL和Ubuntu**: 打开Ubuntu命令行,执行以下命令更新系统: ``` sudo apt-get update sudo apt-get upgrade ``` 4. **在CLion中配置WSL环境**:启动CLion,选择“File” > “Settings”(Windows/Linux)或“CLion” > “Preferences”(macOS)。在“Build, Execution, Deployment” > “CMake”中,设置CMake的路径为你在WSL中安装的CMake路径。在“Toolchains”中,添加新的工具链,选择WSL中的Linux发行版(如Ubuntu),并配置相应的编译器、调试器和构建系统。 5. **创建项目并配置构建系统**:创建一个新的C++项目,在项目设置中指定源代码目录位于WSL的Ubuntu文件系统中。配置CMakeLists.txt文件,确保它使用正确的编译器和工具链。 6. **构建和运行项目**:配置完成后,使用CLion的构建和运行按钮来编译和执行你的C++程序。你可以在CLion的控制台中看到输出结果。 通过这些步骤,你就可以在Windows 10上使用CLion和WSL环境进行C++的Linux工具链开发了。《Windows 10 CLion与WSL集成:轻松构建Linux项目》这本书提供了详细的指南和实用技巧,帮助开发者快速上手并解决集成过程中的常见问题。 参考资源链接:[Windows 10 CLion与WSL集成:轻松构建Linux项目](https://wenku.youkuaiyun.com/doc/64643c4d543f8444889fc25a?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值