#微码分享#AES算法的C++包装类
AES为Advanced Encryption Standard的缩写,中文名:高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES。基于std::string实现的C++包装类,使用得应用AES算法十分简单。完整源代码链接:
https://github.com/eyjian/libmooon/blob/master/include/mooon/utils/aes_helper.h
https://github.com/eyjian/libmooon/blob/master/src/utils/aes_helper.cpp
aes_helper.h头文件
// 高级加密标准(Advanced Encryption Standard), // 在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES class CAESHelper { public: // 加密数据块分组长度,必须为128比特(密钥长度可以是128比特、192比特、256比特中的任意一个) static int aes_block_size; public: // key 密钥 // // 因为AES要求key长度只能为128或192或256比特中的一种,即16字节或24字节或32字节中的一种, // 当key的长度不足16字节时,CAESHelper自动补0足16字节, // 当key的长度间于16字节和24字节时,CAESHelper自动补0足24字节, // 当key的长度间于24字节和32字节时,CAESHelper自动补0足32字节, // 当key的长度超出32字节时,CAESHelper自动截取前32字节作为密钥 CAESHelper(const std::string& key); ~CAESHelper(); void encrypt(const std::string& in, std::string* out); void decrypt(const std::string& in, std::string* out); private: // flag 为true表示加密,为false表示解密 void aes(bool flag, const std::string& in, std::string* out, void* aes_key); private: void* _encrypt_key; void* _decrypt_key; std::string _key; };
aes_helper.cpp实现文件
#if MOOON_HAVE_OPENSSL == 1 int CAESHelper::aes_block_size = AES_BLOCK_SIZE; // 16 #else int CAESHelper::aes_block_size = 0; #endif // MOOON_HAVE_OPENSSL static std::string errcode2errmsg(int errcode) { std::string errmsg; if (0 == errcode) errmsg = "success"; else if (-1 == errcode) errmsg = "userkey is empty"; else if (-2 == errcode) errmsg = "length of userkey is invalid"; else errmsg = "unknown error"; return errmsg; } CAESHelper::CAESHelper(const std::string& key) { _encrypt_key = NULL; _decrypt_key = NULL; _key = key; const std::string::size_type LEN16 = 16; const std::string::size_type LEN24 = 24; const std::string::size_type LEN32 = 32; const std::string::size_type len = key.size(); if ((len != LEN16) && (len != LEN24) && (len != LEN32)) { if (len < LEN16) _key.resize(LEN16); else if (len < LEN24) _key.resize(LEN24); else if (len < LEN32) _key.resize(LEN32); else _key.resize(LEN32); } } CAESHelper::~CAESHelper() { #if MOOON_HAVE_OPENSSL == 1 delete (AES_KEY*)_encrypt_key; delete (AES_KEY*)_decrypt_key; #endif // MOOON_HAVE_OPENSSL } void CAESHelper::encrypt(const std::string& in, std::string* out) { #if MOOON_HAVE_OPENSSL == 1 if (NULL == _encrypt_key) { _encrypt_key = new AES_KEY; const int errcode = AES_set_encrypt_key((const unsigned char*)(_key.data()), (int)(_key.size()*8), (AES_KEY*)_encrypt_key); if (errcode != 0) // 理论上不会返回非0,因为构造函数已经处理好了key的长度 { delete (AES_KEY*)_encrypt_key; _encrypt_key = NULL; THROW_EXCEPTION(errcode2errmsg(errcode), errcode); } } aes(true, in, out, _encrypt_key); #endif // MOOON_HAVE_OPENSSL } void CAESHelper::decrypt(const std::string& in, std::string* out) { #if MOOON_HAVE_OPENSSL == 1 if (NULL == _decrypt_key) { _decrypt_key = new AES_KEY; const int errcode = AES_set_decrypt_key((const unsigned char*)(_key.data()), (int)(_key.size()*8), (AES_KEY*)_decrypt_key); if (errcode != 0) // 理论上不会返回非0,因为构造函数已经处理好了key的长度 { delete (AES_KEY*)_decrypt_key; _decrypt_key = NULL; THROW_EXCEPTION(errcode2errmsg(errcode), errcode); } } aes(false, in, out, _decrypt_key); #endif // MOOON_HAVE_OPENSSL } void CAESHelper::aes(bool flag, const std::string& in, std::string* out, void* aes_key) { #if MOOON_HAVE_OPENSSL == 1 AES_KEY* aes_key_ = (AES_KEY*)aes_key; std::string in_tmp = in; if (in.size() % AES_BLOCK_SIZE != 0) { std::string::size_type tmp_size = in.size() + (AES_BLOCK_SIZE - in.size() % AES_BLOCK_SIZE); in_tmp.resize(tmp_size); } const char* in_p = in_tmp.data(); out->resize(in_tmp.size()); char* out_p = const_cast<char*>(out->data()); for (std::string::size_type i=0; i<in.size(); i+=AES_BLOCK_SIZE) { char out_tmp[AES_BLOCK_SIZE]; if (flag) AES_encrypt((const unsigned char*)(in_p), (unsigned char*)(out_tmp), aes_key_); else AES_decrypt((const unsigned char*)(in_p), (unsigned char*)(out_tmp), aes_key_); in_p += AES_BLOCK_SIZE; memcpy(out_p+i, out_tmp, AES_BLOCK_SIZE); } #else *out = '\0'; // 需要加上这一句,不然难区分HAVE_OPENSSL值是否为1或不为1的情况 #endif // MOOON_HAVE_OPENSSL }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义