我正在尝试使用Crypto ++库]进行AES加密和解密字节数组(vector<unsigned char>
)>。加密正常工作。
我的函数生成一个随机IV,并将其放在加密数据的前面。当然解密会读取IV。我修改了this答案中的代码,因此它适用于我的矢量和CTR /无填充。
程序在stfDecryptor.Put(...)
行中崩溃。首先,我认为数据或IV读取不正确,但是经过检查后,情况并非如此。
我希望我在这里犯了一个非常明显的错误。
谢谢大家:)
课堂电话:
//The code is not clean, i want to get it working first and then clean it up. auto key = Helper::RandomBytes(16); //returns "byte Array" with random Bytes auto data = Helper::UTF8String2ByteArray("HELLO WORLD!"); auto encrypted = AESCrypt::encrypt(key, data); cout << Helper::ByteArray2HexString(key); cout << "\r\n"; cout << Helper::ByteArray2HexString(data); cout << "\r\n"; cout << Helper::ByteArray2HexString(encrypted); cout << "\r\n"; auto decrypted = AESCrypt::decrypt(key, encrypted); auto clear = Helper::ByteArray2UTF8String(decrypted);
Class:
vector<unsigned char> AESCrypt::encrypt(vector<unsigned char> key_, vector<unsigned char> data) { vector<unsigned char> iv_ = Helper::RandomBytes(16); //returns "byte Array" with random Bytes byte key[AES::DEFAULT_KEYLENGTH], iv[AES::BLOCKSIZE]; for (size_t i = 0; i < AES::DEFAULT_KEYLENGTH; i++) key[i] = key_[i]; for (size_t i = 0; i < iv_.size(); i++) iv[i] = iv_[i]; AES::Encryption aesEncryption(key, AES::DEFAULT_KEYLENGTH); CTR_Mode_ExternalCipher::Encryption ctrEncryption(aesEncryption, iv); vector<unsigned char> encrypted; StreamTransformationFilter stfEncryptor( ctrEncryption, new VectorSink(encrypted), BlockPaddingSchemeDef::NO_PADDING); stfEncryptor.Put((const byte*)data.data(), data.size()); stfEncryptor.MessageEnd(); vector<unsigned char> output(encrypted.size() + 16); for (size_t i = 0; i < 16; i++) output[i] = iv[i]; for (size_t i = 0; i < encrypted.size(); i++) output[16 + i] = encrypted[i]; return output; } vector<unsigned char> AESCrypt::decrypt(vector<unsigned char> key_, vector<unsigned char> data_) { byte key[AES::DEFAULT_KEYLENGTH], iv[AES::BLOCKSIZE]; for (size_t i = 0; i < AES::DEFAULT_KEYLENGTH; i++) key[i] = key_[i]; for (size_t i = 0; i < 16; i++) iv[i] = data_[i]; vector<unsigned char> data(data_.size() - 16); for (size_t i = 0; i < data.size(); i++) { data[i] = data_[16 + i]; } AES::Decryption aesDecryption(key, AES::DEFAULT_KEYLENGTH); CTR_Mode_ExternalCipher::Decryption ctrDecryption(aesDecryption, iv); vector<unsigned char> decrypted; StreamTransformationFilter stfDecryptor( ctrDecryption, new VectorSink(decrypted), BlockPaddingSchemeDef::NO_PADDING); stfDecryptor.Put((const byte*)data.data(), data.size()); //this is where it crashes stfDecryptor.MessageEnd(); return decrypted; }
这里是CallStack的图片:
这是在C ++++库中停止的行:
CRYPTOPP_ASSERT(m_cipher->IsForwardTransformation());
我正在尝试使用Crypto ++库进行AES加密和解密字节数组(vector
这是在CryptoPP库内部停止的行: