1. 程式人生 > >C++的AES加解密

C++的AES加解密

aes加解密 大致 filter aes buffere extern pos data rcp

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

文檔地址

開源地址

C++的AES加解密