C++的AES加解密

  最近公司项目要做个WPF程序,但是底层加密部分要用C++来实现。通过网上搜索各种资料,地址已经记不下了,没发贴出来了! 下面看看如何加解密的~!先贴代码。。。。

 1  string tKey(sKey);
 2  string tIV(sIV);
 3  string outStr;
 4  string pt = StringToUTF8(plainText);
 5  SecByteBlock key((const byte*)tKey.data(), tKey.size());
 6  SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? 16 : tIV.size());
 7  AES::Encryption aesEncryption((byte *)key, tIV == "" ? AES::MAX_KEYLENGTH : AES::DEFAULT_KEYLENGTH);
 8  CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
 9  StringSource(pt, true,
10   new StreamTransformationFilter(cbcEncryption,
11    isHex ? dynamic_cast<BufferedTransformation*>(new HexEncoder(new StringSink(outStr))) :
12    dynamic_cast<BufferedTransformation*>(new Base64Encoder(new StringSink(outStr))),
13    StreamTransformationFilter::PKCS_PADDING));
14  strcpy_s(outText, outStr.size() + 1, 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的编码方式需要转换一下。

 

 1  string tKey(sKey);
 2  string tIV(sIV);
 3  string outStr;
 4  SecByteBlock key((const byte*)tKey.data(), tKey.size());
 5  SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? 16 : tIV.size());
 6  AES::Decryption aesDecryption((byte *)key, tIV == "" ? AES::MAX_KEYLENGTH : AES::DEFAULT_KEYLENGTH);
 7  CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
 8  BufferedTransformation *decryptor = isHex ?
 9   dynamic_cast<BufferedTransformation*>(new HexDecoder(new StreamTransformationFilter(cbcDecryption, new StringSink(outStr)))) :
10   dynamic_cast<BufferedTransformation*>(new Base64Decoder(new StreamTransformationFilter(cbcDecryption, new StringSink(outStr))));
11  decryptor->Put((byte *)cipherText, strlen(cipherText));
12  decryptor->MessageEnd();
13  outStr = UTF8ToString(outStr);
14  strcpy_s(outText, outStr.size() + 1, outStr.c_str());

 

 

同理,解密的话与加密大致相同。UTF8ToString为utf-8转为gb2312编码格式。

 

以上就是C++ cbc的加解密的方式。这里使用了一个第三方开源库Crypto++。

 

 

文档地址

开源地址

 

转载于:https://www.cnblogs.com/jx0906/p/8522806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SummerMVP的gravatar头像 SummerMVP2020-04-16 17:32:30原c++语言实现AES加密算法代码分享 项目描述 AES的实现 1. 只要求实现块长为 128 位、密钥长为 128 位的 AES,分别实现 ECB、CBC、CFB、OFB 这四种操作 模式。每种操作模式都有一组对应的测试数据,以便检查程序的正确性。其中,CFB 操作模式为 8 位 CFB 操作模式,OFB 操作模式为 8 位 OFB 操作模式。 2. 要求以命令行的形式,指定明文文件、密钥文件、初始化向量文件的位置和名称、加密的操作模式以 及加密完成后密文文件的位置和名称。加密时先分别从指定的明文文件、密钥文件和初始化向量文件中 读取有关信息,然后按指定的操作模式进行加密,最后将密文(用 16 进制表示)写入指定的密文文件。 命令行的具体格式如下: e2aes -p plainfile -k keyfile [-v vifile] -m mode -c cipherfile 参数: -p plainfile 指定明文文件的位置和名称 -k keyfile 指定密钥文件的位置和名称 -v vifile 指定初始化向量文件的位置和名称 -m mode 指定加密的操作模式 -c cipherfile 指定密文文件的位置和名称。 3. 分别实现对每种操作模式下加密及解密速度的测试,要求在程序中生成 5MB 的随机测试数据(不要 求使用随机数发生器),连续加密、解密 20 次,记录并报告每种模式的加密和解密的总时间(毫秒)和 速度(MByte/秒)。 4. 用 C 和/或 C++语言完成程序。 运行环境 VS2012 项目技术(必填) C++AES算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值