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++。

 

 

文档地址

开源地址

 

posted @ 2018-03-07 15:41  姫野翔云  阅读(3197)  评论(0编辑  收藏  举报