与Windows驱动开发中加密思路类似,但是在使用我的代码前,你必须正确安装OpenSSL
在安装完之后把其lib文件导入visual studio 根据自己安装目录定
同时也要将OpenSSL的两个dll文件放在文件目录
接下来就是代码
encryption.h
#pragma once
#include <iostream>
#include <openssl/md5.h>
#include <openssl/evp.h>
#include <openssl/aes.h>
#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")
//自己定义Aes的key和iv一定要16位
#define KEY "xxxxxxxxxxxxxxxx"
#define KEY_IV "xxxxxxxxxxxxxxxx"
#define KEY_SIZE 16
#define IV_SIZE 16
namespace encryption {
std::string md5(std::string str);
std::string base64_encode(std::string str);
std::string aes_encrypt(std::string str);
std::string encrypt(std::string str);
}
encryption.cpp
#include "encryption.h"
std::string encryption::md5(std::string str)
{
unsigned char digest[16]; // MD5哈希值的大小固定为16字节
unsigned int digestLength = sizeof(digest);
EVP_MD_CTX* context = EVP_MD_CTX_new();
if (!context) {
// 处理错误
return "";
}
if (EVP_DigestInit_ex(context, EVP_md5(), NULL) != 1) {
// 处理错误
EVP_MD_CTX_free(context);
return "";
}
if (EVP_DigestUpdate(context, str.c_str(), str.size()) != 1) {
// 处理错误
EVP_MD_CTX_free(context);
return "";
}
if (EVP_DigestFinal_ex(context, digest, &digestLength) != 1) {
// 处理错误
EVP_MD_CTX_free(context);
return "";
}
EVP_MD_CTX_free(context);
// 将digest转换为字符串
char md5String[33];
for (unsigned int i = 0; i < digestLength; ++i) {
//sprintf(&md5String[i * 2], "%02x", digest[i]);
sprintf_s(&md5String[i * 2], 3, "%02X", digest[i]);
}
md5String[32] = '\0';
return std::string(md5String);
}
std::string encryption::base64_encode(std::string str)
{
BIO* b64 = BIO_new(BIO_f_base64());
BIO* bmem = BIO_new(BIO_s_mem());
BIO_push(b64, bmem);
BIO_write(b64, str.c_str(), str.size());
BIO_flush(b64);
char* buffer = NULL;
long length = BIO_get_mem_data(bmem, &buffer);
std::string result(buffer, length);
BIO_free_all(b64);
return result;
}
std::string encryption::aes_encrypt(std::string str) {
// 确保密钥和 IV 的长度正确
unsigned char key[16]; // 128-bit key
unsigned char iv[16]; // 16-byte IV
// 假设 KEY 和 KEY_IV 是已经定义的常量或变量
std::memcpy(key, KEY, sizeof(key));
std::memcpy(iv, KEY_IV, sizeof(iv));
// 创建 EVP_CIPHER_CTX
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
if (!ctx) {
throw std::runtime_error("EVP_CIPHER_CTX_new failed");
}
// 初始化加密操作
if (EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), nullptr, key, iv) != 1) {
EVP_CIPHER_CTX_free(ctx);
throw std::runtime_error("EVP_EncryptInit_ex failed");
}
// 计算填充长度
int len = str.length();
int pad = 16 - (len % 16);
std::string pad_str(pad, pad);
str += pad_str;
// 准备输入和输出缓冲区
unsigned char* in = (unsigned char*)str.c_str();
unsigned char out[1024];
int out_len = 0, final_len = 0;
// 加密更新
if (EVP_EncryptUpdate(ctx, out, &out_len, in, len + pad) != 1) {
EVP_CIPHER_CTX_free(ctx);
throw std::runtime_error("EVP_EncryptUpdate failed");
}
// 加密完成
if (EVP_EncryptFinal_ex(ctx, out + out_len, &final_len) != 1) {
EVP_CIPHER_CTX_free(ctx);
throw std::runtime_error("EVP_EncryptFinal_ex failed");
}
// 释放 EVP_CIPHER_CTX
EVP_CIPHER_CTX_free(ctx);
// 返回 Base64 编码的结果
std::string result = base64_encode(std::string((char*)out, out_len));
return result;
}
std::string encryption::encrypt(std::string str)
{
return md5(aes_encrypt(str));
}
可以根据自己喜爱添加加密算法