最近公司项目要做个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 == "" ? 16 : 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() + 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的编码方式需要转换一下。

 

 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 == "" ? 16 : 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() + 1, outStr.c_str());

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

 

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

 

 

文档地址

开源地址

 

版权声明:本文为jx0906原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jx0906/p/8522806.html