之前写过aes加密算法简单说明,本篇用openssl对aes的ecb和cbc模式进行代码编写。
现在拿128位的aes加解密进行说明。
首先强调的是,在openssl提供的函数中,加密和解密每次只能针对16个字节,故加密字符串和密钥都需要自己进行补齐处理。
本文中的加密内容用pkcs7进行补齐,注意pkcs7不是aes加解密算法里面的,一般一些高档语言,会提供进一步的封装,但是openssl里面,本人目前未看到aes的函数中有补齐的部分。

补齐是非常重要的,关于这个,大家若不明白,可以查看aes加密算法简单说明,里面对pkcs7补齐进行了比较详细的说明。

我们首先来看调用的部分:
从下面代码可以看出,分别对aes的ecb和cbc模式给予了加解密演示,其中cbc比aes多了一个向量iv,密码是128位。

// OpensslAesTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include "aes_ecb.h"
#include "aes_cbc.h"int main()
{{CAesEcb cAesEcb;cAesEcb.SetEncryptKey("1234567890123456");///加密std::string strInput = "1234567890123456123456789012345";std::string strOutput;cAesEcb.EncryptString(strInput, strOutput);///解密std::string strDecryptOut;cAesEcb.DecryptString(strOutput, strDecryptOut);int i = 0;i++;}{CAesCbc cAesCbc;cAesCbc.SetEncryptKey("1234567890123456");cAesCbc.SetEncryptIv("0123456789abcdef");///加密std::string strInput = "1234567890123456123456789012345";std::string strOutput;cAesCbc.EncryptString(strInput, strOutput);///解密std::string strDecryptOut;cAesCbc.DecryptString(strOutput, strDecryptOut);int i = 0;i++;}return 0;
}

我们现在来看下ecb模式的EncryptString的实现
首先函数的实现第一步就是实现对strInPut的补齐,然后从AES_ecb_encrypt可以看出,是对补齐后的内容分段加密,最后将加密后的字符串进行base64编码。
注意:加密后的内容中间可能存在ascii为0的字符,所以加密后的字符串不要赋值于string,否则会出问题。

bool CAesEcb::EncryptString(std::string strInPut, std::string& strOutPut)
{Pkcs7Padding(strInPut);int iInputLen = strInPut.length();unsigned char *temp = new unsigned char[iInputLen + 1];memset(temp, 0, iInputLen + 1);AES_KEY aes;AES_set_encrypt_key((const unsigned char *)m_strKey.c_str(), 128, &aes);const unsigned char* pInput = (const unsigned char*)strInPut.c_str();iInputLen = strInPut.length();for (int i = 0; i < iInputLen / 16; i++){AES_ecb_encrypt(pInput + i * 16, temp + i * 16, &aes, AES_ENCRYPT);}char *pOutput = new char[iInputLen * 4 / 3 + 3];int iOutputLen = Base64Encode((const char *)temp, iInputLen, pOutput);strOutPut = std::string(pOutput, iOutputLen);delete[] temp;delete[] pOutput;return true;
}

我们再来看下cbc模式的EncryptString的实现
首先也是补齐,然后填充向量iv数组,每次AES_cbc_encrypt加密后,iv会发生改变,作为下一轮的加密向量,此处需要注意。

bool CAesCbc::EncryptString(std::string strInPut, std::string& strOutPut)
{Pkcs7Padding(strInPut);unsigned char iv[17] = { 0 };memcpy(iv, m_strIv.c_str(), 16);int iInputLen = strInPut.length();unsigned char *temp = new unsigned char[iInputLen + 1];memset(temp, 0, iInputLen + 1);AES_KEY aes;AES_set_encrypt_key((const unsigned char *)m_strKey.c_str(), 128, &aes);const unsigned char* pInput = (const unsigned char*)strInPut.c_str();iInputLen = strInPut.length();for (int i = 0; i < iInputLen / 16; i++){AES_cbc_encrypt(pInput + i * 16, temp + i * 16, 16, &aes, iv, AES_ENCRYPT);}char *pOutput = new char[iInputLen * 4 / 3 + 3];int iOutputLen = Base64Encode((const char *)temp, iInputLen, pOutput);strOutPut = std::string(pOutput, iOutputLen);delete[] temp;delete[] pOutput;return true;
}

现在本人给出代码结构:

其中Base64下面的文件为base64编解码,这个大家也可以在网上搜,此处就不展示了。
OpensslAesTest.cpp的内容,前面已经粘贴了,此处不再展示,下面列举剩余四个文件的内容。
aes_ecb.h

#pragma once#include <string>class CAesEcb
{public:CAesEcb();~CAesEcb();
public:void Pkcs7Padding(std::string& strInPut);void Pkcs7UnPadding(std::string& strInPut);void SetEncryptKey(std::string strKey);bool EncryptString(std::string strInPut, std::string& strOutPut);bool DecryptString(std::string strInPut, std::string& strOutPut);
private:std::string m_strKey;
};

aes_ecb.cpp

#include "aes_ecb.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/md5.h>
#include "Base64.h"CAesEcb::CAesEcb()
{}CAesEcb::~CAesEcb()
{}void CAesEcb::Pkcs7Padding(std::string& strInPut)
{char cPadding = 16 - strInPut.length() % 16;int iPaddingNum = cPadding;for (int i = 0; i < iPaddingNum; i++){strInPut += cPadding;}
}void CAesEcb::Pkcs7UnPadding(std::string& strInPut)
{int iInputLen = strInPut.length();int iRemovedByte = strInPut[iInputLen - 1];strInPut = std::string(strInPut.c_str(), iInputLen - iRemovedByte);
}void CAesEcb::SetEncryptKey(std::string strKey)
{m_strKey = strKey;
}bool CAesEcb::EncryptString(std::string strInPut, std::string& strOutPut)
{Pkcs7Padding(strInPut);int iInputLen = strInPut.length();unsigned char *temp = new unsigned char[iInputLen + 1];memset(temp, 0, iInputLen + 1);AES_KEY aes;AES_set_encrypt_key((const unsigned char *)m_strKey.c_str(), 128, &aes);const unsigned char* pInput = (const unsigned char*)strInPut.c_str();iInputLen = strInPut.length();for (int i = 0; i < iInputLen / 16; i++){AES_ecb_encrypt(pInput + i * 16, temp + i * 16, &aes, AES_ENCRYPT);}char *pOutput = new char[iInputLen * 4 / 3 + 3];int iOutputLen = Base64Encode((const char *)temp, iInputLen, pOutput);strOutPut = std::string(pOutput, iOutputLen);delete[] temp;delete[] pOutput;return true;
}bool CAesEcb::DecryptString(std::string strInPut, std::string& strOutPut)
{char *pOutStr = new char[strInPut.length()];int iOutput = Base64Decode(strInPut.c_str(), strInPut.length(), pOutStr);AES_KEY aes;AES_set_decrypt_key((const unsigned char *)m_strKey.c_str(), 128, &aes);unsigned char *pDescrypt = new  unsigned char[iOutput + 1];memset(pDescrypt, 0, iOutput + 1);for (int i = 0; i < iOutput / 16; i++){AES_ecb_encrypt((const unsigned char *)pOutStr + i * 16, pDescrypt + i * 16, &aes, AES_DECRYPT);}strOutPut = std::string((const char *)pDescrypt);Pkcs7UnPadding(strOutPut);return true;
}

aes_cbc.h

#pragma once#include <string>class CAesCbc
{public:CAesCbc();~CAesCbc();
public:void Pkcs7Padding(std::string& strInPut);void Pkcs7UnPadding(std::string& strInPut);void SetEncryptKey(std::string strKey);void SetEncryptIv(std::string strIv);bool EncryptString(std::string strInPut, std::string& strOutPut);bool DecryptString(std::string strInPut, std::string& strOutPut);
private:std::string m_strKey;std::string m_strIv;
};

aes_cbc.cpp

#include "aes_cbc.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/md5.h>
#include "Base64.h"CAesCbc::CAesCbc()
{}CAesCbc::~CAesCbc()
{}void CAesCbc::Pkcs7Padding(std::string& strInPut)
{char cPadding = 16 - strInPut.length() % 16;int iPaddingNum = cPadding;for (int i = 0; i < iPaddingNum; i++){strInPut += cPadding;}
}void CAesCbc::Pkcs7UnPadding(std::string& strInPut)
{int iInputLen = strInPut.length();int iRemovedByte = strInPut[iInputLen - 1];strInPut = std::string(strInPut.c_str(), iInputLen - iRemovedByte);
}void CAesCbc::SetEncryptKey(std::string strKey)
{m_strKey = strKey;
}void CAesCbc::SetEncryptIv(std::string strIv)
{m_strIv = strIv;
}bool CAesCbc::EncryptString(std::string strInPut, std::string& strOutPut)
{Pkcs7Padding(strInPut);unsigned char iv[17] = { 0 };memcpy(iv, m_strIv.c_str(), 16);int iInputLen = strInPut.length();unsigned char *temp = new unsigned char[iInputLen + 1];memset(temp, 0, iInputLen + 1);AES_KEY aes;AES_set_encrypt_key((const unsigned char *)m_strKey.c_str(), 128, &aes);const unsigned char* pInput = (const unsigned char*)strInPut.c_str();iInputLen = strInPut.length();for (int i = 0; i < iInputLen / 16; i++){AES_cbc_encrypt(pInput + i * 16, temp + i * 16, 16, &aes, iv, AES_ENCRYPT);}char *pOutput = new char[iInputLen * 4 / 3 + 3];int iOutputLen = Base64Encode((const char *)temp, iInputLen, pOutput);strOutPut = std::string(pOutput, iOutputLen);delete[] temp;delete[] pOutput;return true;
}bool CAesCbc::DecryptString(std::string strInPut, std::string& strOutPut)
{unsigned char iv[17] = { 0 };memcpy(iv, m_strIv.c_str(), 16);char *pOutStr = new char[strInPut.length()];int iOutput = Base64Decode(strInPut.c_str(), strInPut.length(), pOutStr);AES_KEY aes;AES_set_decrypt_key((const unsigned char *)m_strKey.c_str(), 128, &aes);unsigned char *pDescrypt = new  unsigned char[iOutput + 1];memset(pDescrypt, 0, iOutput + 1);for (int i = 0; i < iOutput / 16; i++){AES_cbc_encrypt((const unsigned char *)pOutStr + i * 16, pDescrypt + i * 16, 16, &aes, iv, AES_DECRYPT);}strOutPut = std::string((const char *)pDescrypt);Pkcs7UnPadding(strOutPut);return true;
}

利用openssl进行aes加解密相关推荐

  1. C++使用openssl实现aes加解密,其中加密是string到文件,解密是文件到string,切合项目背景

    代码 使用md5对于用户输入的密码进行保护,也使得密码的长度固定 crypto_util.h #pragma once#include <string>namespace hsm{ nam ...

  2. 利用openssl对base64加解密

    加密: openssl base64 -in file.bin -out file.pem 解密: openssl base64 -d -in file.pem -ou file.bin 转载于:ht ...

  3. openssl c++实现bouncycastle中AES加解密

    0x01 为什么要用bouncycastle 先说说JCE(Java Cryptography Extension)是一组包,它们提供用于加密.密钥生成和协商以及 Message Authentica ...

  4. 【 Linux学习】Linux环境下利用OpenSSL对大文件进行AES加解密

    一.背景 之前的几篇博客已经介绍了Gitlab如何备份恢复与迁移已经脚本监控过程等. git学习--> Gitlab如何进行备份恢复与迁移? http://blog.csdn.net/ouyan ...

  5. linux下面C 利用openssl的AES库加密,解密

    OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是全部支持或者是部分支持. 返回值:"aes(full)" ...

  6. linux c openssl aes 加解密

    1.OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是所有支持或者是部分支持. 返回值:"aes(full)&qu ...

  7. Openssl Aes加解密使用示例

    Openssl Aes加解密使用示例 Aes简介 设置Aes密钥 Aes算法CBC加解密 Aes简介 Aes是分组加密算法,主要基于块加密,选取固定长度的密钥去加密明文中固定长度的块,生成的密文块与明 ...

  8. mysql aes encrypt_MySQL如何正确地利用AES_ENCRYPT()与AES_DECRYPT()加解密

    本文主要给大家介绍了关于MySQL利用AES_ENCRYPT()与AES_DECRYPT()加解密的正确方法,MySQL中AES_ENCRYPT('密码','钥匙')函数可以对字段值做加密处理,AES ...

  9. C语言实现AES加解密

    C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...

最新文章

  1. 搞懂 Javascript 继承原理
  2. 携程在线风控系统架构
  3. 学习PetShop3.0(2)宠物展示
  4. 计算机组成原理综合题,2013计算机组成原理复习题.doc
  5. python获取动态更新的数据_python3+beautifulsoup动态数据获取想要的内容
  6. 让Windows 7变成WIFI热点
  7. matlab单层感知器画线,MATLAB神经网络学习(1):单层感知器
  8. 基于JavaWeb的在线题库管理系统的设计与开发
  9. 软碟通UltraISO Premium Edition_v9.7.5.3716,轻松编辑光盘镜像文件,将文件/文件夹制作成ISO文件
  10. 2015年电商行业十大发展趋势分析预测
  11. 私域流量运营和微商有什么区别?
  12. cetnos下gotop安装和使用
  13. power bi条件格式_Power BI中的条件格式
  14. 大数据分析图形绘制如何进行?
  15. golang cond
  16. 二级域名泛解析,让iis支持二级域名泛解析
  17. 【渝粤题库】陕西师范大学292311国际金融Ⅰ 作业(高起专)
  18. CAD图纸如何从低版本转换成高版本
  19. 手把手教你撸最新Youtube视频 拖拽动画效果
  20. 正态分布检验:检验序列数据是否符合正态分布

热门文章

  1. 软件设计师-系统开发与软件工程
  2. 浅析AVL树--AVL树的双旋转
  3. LinkedList类
  4. python中心性评价_centrality 计算复杂网络中的节点或边 数中心性,基于python的 工具箱 matlab 238万源代码下载- www.pudn.com...
  5. javascript 静态变量与实例变量
  6. 多媒体元素 video audio 兼容性 controls muted loop
  7. 友盟推送 php,PHP 友盟消息推送类
  8. 视频剪辑软件哪个比较好用?这几款常用的视频剪辑软件你要知道
  9. 什么是双因素身份验证?
  10. butter滤波器是iir吗_MATLAB IIR滤波器设计函数buttord与butter