I am trying to AES encrypt and decrypt a byte array (vector<unsigned char>
) with the Crypto++ library. Encryption works correctly.
My function generates a random IV and puts it in front of the encrypted data. Decryption of course reads the IV. I modified the code from this answer, so it works with my vectors, and CTR/No Padding.
The program crashes in the line stfDecryptor.Put(...)
. First I thought the data or IV is read not correctly, but after checking, this is not the case.
I hope I'm making a really obvious mistake here.
Thanks guys :)
Class call:
//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;
}
Here is a picture off CallStack:
This is the line where it stopps inside the Crypto++ Libary:
CRYPTOPP_ASSERT(m_cipher->IsForwardTransformation());