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; //
#else
int CAESHelper::aes_block_size = ;
#endif // MOOON_HAVE_OPENSSL static std::string errcode2errmsg(int errcode)
{
std::string errmsg; if ( == errcode)
errmsg = "success";
else if (- == errcode)
errmsg = "userkey is empty";
else if (- == 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 = ;
const std::string::size_type LEN24 = ;
const std::string::size_type LEN32 = ;
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()*), (AES_KEY*)_encrypt_key);
if (errcode != ) // 理论上不会返回非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()*), (AES_KEY*)_decrypt_key);
if (errcode != ) // 理论上不会返回非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 != )
{
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=; 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
}

#微码分享#AES算法的C++包装类的更多相关文章

  1. 使用python进行加密解密AES算法

    使用python进行加密解密AES算法-代码分享-PYTHON开发者社区-pythoner.org 使用python进行加密解密AES算法 TY 发布于 2011-09-26 21:36:53,分类: ...

  2. AES算法简介

    AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES ...

  3. C#与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  4. AES算法,DES算法,RSA算法JAVA实现

    1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...

  5. ORACLE 字段AES算法加密、解密

    ORACLE 字段AES算法加密.解密(解决中文乱码问题)2014年02月12日 17:13:37 华智互联 阅读数:97971.加解密函数入口 CREATE OR REPLACE FUNCTION ...

  6. 利用AES算法加密数据

    准备工作: 模块安装问题: 首先在python中安装Crypto这个包 但是在安装模块后在使用过程中他会报错 下面是解决方法: pip3 install pycrypto 安装会报错 https:// ...

  7. Delphi与JAVA互加解密AES算法

    搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util; import java.io.UnsupportedEncodingException; imp ...

  8. .NET与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  9. Github优质库分享-01算法小抄 基于LeetCode

    Github 优质库分享-01 算法小抄 该库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌. 目前 sta ...

随机推荐

  1. three.js raycaster射线碰撞的坑 (当canvas大小 不是屏幕大小是解决拾取物体的办法)

    这里只是记录一下坑,方便查阅,内容主要援引自:three.js Raycaster 射线拾取 canvas不占满整屏时射线拾取存在偏差 1. 世界坐标系: 世界坐标系位于屏幕的中心(0,0,0),往右 ...

  2. BZOJ4326或洛谷2680 运输计划

    BZOJ原题链接 洛谷原题链接 用\(LCA\)初始化出所有运输计划的原始时间,因为答案有单调性,所以二分答案,然后考虑检验答案. 很容易想到将所有超出当前二分的答案的运输计划所经过的路径标记,在这些 ...

  3. GET与POST传递数据的长度分析

    在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST.GET - 从指定的资源请求数据,POST - 向指定的资源提交要被处理的数据.本篇文章我们就来分析一下GET与PO ...

  4. C++连接MySQL(Windows)

    一般来说,VS下采用微软自身的SQL Server是比较常见的做法,但SQL Server只适合学习,不适合真正应用.在此,我们选择MySQL作为后台数据库.C++语言本身并没有提供访问数据库的东西, ...

  5. socket 长连接

    实现: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 服务端: 由于客户端会定时(keepAliveDelay毫秒)发送 ...

  6. 利用js代码:document.forms[0].approval.value='false',当点击 <input type="image"按钮向表单传递不同的参数。

    <form action="flow_myTaskList"> <input type="hidden" name="approva ...

  7. PHP 批量移动文件改名

    public function changeCoverName(){ //$type = '考研'; //$coverPath = './Public/course_cover/kaoyan/'; $ ...

  8. linux 和 主机通信的另类方法

    偶然发现,linux可以从github上直接下载代码.这样就能用windows写好代码,直接给linux来跑了.很方便. 当然是因为我还不会配置网络来让linux和windows通信.弄了一个下午也没 ...

  9. maven 介绍(zz )

    Maven 编辑     目录 1简介 2特点 3常用命令 4推荐书籍 5Win7配置 6生命周期     1   1简介 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构 ...

  10. 选数(NOIP2002)

    题目链接:选数 这一题水过去就行了,我们这里用next_permutation去生成各种排列,有一个注意点,我会在代码中标注. #include<bits/stdc++.h> using ...