1、背景
有项目需求,有对文件进行加密的功能,经过评估,最终决定使用AES-256-CBC加密。在C++中要实现这种加密有很多中方式和第三方库,由于运行环境的限制,可选择的库不多,最终决定使用openssl来进行。
关于AES加密的相关知识直接百度就可以百度到了,这里就不赘述了。
2、加密
XuFile.h
//
// Created by zhengqiuxu on 2021/10/15.
//
#ifndef VIS_ADOS_I7_XUFILE_H
#define VIS_ADOS_I7_XUFILE_H
#include <vector>
#include <string>
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <iostream>
#include <openssl/err.h>
class XuFile {
public:
/**
* 用AES-256-CBC的方式加密一个文件
* @param inputFile : 输入文件(源文件)地址
* @param outputFile : 输出文件(加密后的文件)地址
* @param key : 密钥
* @param iv : 初始向量
* @return 0:成功 其他:失败
*/
int encryptFile_AES_256_CBC(const std::string &inputFile, const std::string &outputFile, const uint8_t *key, const uint8_t *iv);
private:
};
#endif //VIS_ADOS_I7_XUFILE_H
XuFile.cpp
/**
* 用AES-256-CBC的方式加密一个文件
* @param inputFile : 输入文件(源文件)地址
* @param outputFile : 输出文件(加密后的文件)地址
* @param key : 密钥
* @param iv : 初始向量
* @return 0:成功 其他:失败
*/
int XuFile::encryptFile_AES_256_CBC(const std::string &inputFile, const std::string &outputFile, const uint8_t *key,
const uint8_t *iv) {
int ret = -1;
try {
/* 源文件的输入流 */
std::ifstream srcIn(inputFile.c_str(), std::ios_base::in | std::ios_base::binary | std::ios_base::ate);
/* 加密后的文件的输出流 */
std::ofstream decOut(outputFile.c_str(), std::ios_base::out | std::ios_base::binary);
/* 如果都打开了才能进行解密 */
if (srcIn.is_open() && decOut.is_open()) {
/* 初始化OpenSSL库 */
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \
| OPENSSL_INIT_ADD_ALL_DIGESTS, NULL);
OPENSSL_init_crypto(OPENSSL_I