最近公司项目要做个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++。