C++的AES加解密
最近公司项目要做个WPF程序,但是底层加密部分要用C++来实现。通过网上搜索各种资料,地址已经记不下了,没发贴出来了! 下面看看如何加解密的~!先贴代码。。。。
string tKey(sKey);
string tIV(sIV);
string outStr;
string pt = StringToUTF8(plainText);
SecByteBlock key((const byte*)tKey.data(), tKey.size());
SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? : tIV.size());
AES::Encryption aesEncryption((byte *)key, tIV == "" ? AES::MAX_KEYLENGTH : AES::DEFAULT_KEYLENGTH);
CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
StringSource(pt, true,
new StreamTransformationFilter(cbcEncryption,
isHex ? dynamic_cast<BufferedTransformation*>(new HexEncoder(new StringSink(outStr))) :
dynamic_cast<BufferedTransformation*>(new Base64Encoder(new StringSink(outStr))),
StreamTransformationFilter::PKCS_PADDING));
strcpy_s(outText, outStr.size() + , outStr.c_str());
加密的AES使用的cbc pkcs7,128-256位的加密方式。这里牵扯到不需要偏移量的时候,所以使用SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? 16 : tIV.size());来给个默认的值,因为最小的需要16个字节,所以给值16。HexEncoder是加密的值是否为十六进制字符串,Base64Encoder是加密是否为Base64的字符串。strcpy_s是复制字符串到返回的char*中,因为要给C#回传,所以这里要用到,C#那边必须使用StringBuilder来接收,用string是拿不到值得。还有一个StringToUTF8是因为string的默认编码方式为gb2312,所以如果要加密的字符串是utf-8的编码方式需要转换一下。
string tKey(sKey);
string tIV(sIV);
string outStr;
SecByteBlock key((const byte*)tKey.data(), tKey.size());
SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? : tIV.size());
AES::Decryption aesDecryption((byte *)key, tIV == "" ? AES::MAX_KEYLENGTH : AES::DEFAULT_KEYLENGTH);
CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
BufferedTransformation *decryptor = isHex ?
dynamic_cast<BufferedTransformation*>(new HexDecoder(new StreamTransformationFilter(cbcDecryption, new StringSink(outStr)))) :
dynamic_cast<BufferedTransformation*>(new Base64Decoder(new StreamTransformationFilter(cbcDecryption, new StringSink(outStr))));
decryptor->Put((byte *)cipherText, strlen(cipherText));
decryptor->MessageEnd();
outStr = UTF8ToString(outStr);
strcpy_s(outText, outStr.size() + , outStr.c_str());
同理,解密的话与加密大致相同。UTF8ToString为utf-8转为gb2312编码格式。
以上就是C++ cbc的加解密的方式。这里使用了一个第三方开源库Crypto++。
C++的AES加解密的更多相关文章
- DES,AeS加解密,MD5,SHA加密
1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...
- c# Aes加解密和对象序列化
aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...
- Java、C#双语版配套AES加解密示例
这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...
- AES加解密算法Qt实现
[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...
- aes加解密 Illegal key size
做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...
- C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密
前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...
- Aes加解密,php
Aes类库 <?php namespace Aes; class Aes { /** * var string $method 加解密方法,可通过openssl_get_cipher_metho ...
- cryptoJS AES 加解密简单使用
简单记录一下,前端利用 cryptoJS 如何加解密的.主要是关于 AES 加解密. 需求描述:需要对 url 中的参数进行 AES 解密,然后再把该参数进行 MD5 加密通过接口传递. AES AE ...
- AES加解密程序的实现
AES加解密程序的实现正常情况,用户不能访问sys.dbms_crypto,需要DBA授权:grant execute on dbms_crypto to crm;建立加解密的PKG_AES包:CRE ...
- 收银台数据库存储AES加解密
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合.缺点是密钥的传输 ...
随机推荐
- 学会配置nginx
一.作为一名开发人员,大家可能经常会用到服务器,但是一般线上的服务器可能都是公司公用的,而且线上的服务器一般也不是能随随便便给个人用的,所以部署本地服务器看来是一遍必不可少的事情和能力呀,所以,ngi ...
- 过16道练习学习Linq和Lambda(转)
1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,class from studentLinq: from s in Students ...
- WPF中获取系统本身自带的控件模板(XAML)
每个控件都有自己默认的模板,这是MS本身就编写好的,如果我们能够得到这些模板的XAML代码,那么它将是学习模板的最好的示例,要想获得某个控件ctrl的默认模板,请调用以下方法: string GetT ...
- dump、libeay32.dll、gsoap、webserver多线程调用gsoap产生崩溃
问题:调用webserver接口出现dump文件,dump文件指向libeay32.dll有问题,产生崩溃的原因是gsoap多线程问题,多线程调用时需要程序启动的地方调用如下函数进行多线程初始化: i ...
- Effective Java 之-----返回零长度的数组或集合而不是null
如下代码,通常用户列表为空时,会习惯性返回null,因为这时会认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销. private final List<UserBean&g ...
- spring boot + vue + element-ui全栈开发入门——前端列表页面开发
一.页面 1.布局 假设,我们要开发一个会员列表的页面. 首先,添加vue页面文件“src\pages\Member.vue” 参照文档http://element.eleme.io/#/zh-CN ...
- Java数据库设计14个技巧
Java数据库设计14个技巧 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对 ...
- Could note find result map com.xxxx.entity.UserAccountDO
原因: insert语句的标签写错:应该是parameterType,而不应该是resultType
- bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]
4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...
- BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]
3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...