C++的AES加解密
阿新 • • 發佈:2018-03-07
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加解密