AES и ошибка длины ключа

Я пытаюсь заставить этот код работать. Это из Cryptopp AES

Демонстрирует шифрование и дешифрование с использованием AES в CTR

Разница лишь в том, что я создал функцию encryptAES а также decryptAES и вставил код.
Работает без создания этих функций. Но теперь я получил следующую ошибку: AES / CTR 4 не является допустимой длиной ключа, но длина ключа составляет 16 бит.

string encryptAES(const byte key[], const string& plain, const byte iv[])
{
try
{
string cipher;

CTR_Mode< AES >::Encryption e;
e.SetKeyWithIV(key, sizeof(key), iv);

// The StreamTransformationFilter adds padding
//  as required. ECB and CBC Mode must be padded
//  to the block size of the cipher.
StringSource(plain, true,
new StreamTransformationFilter(e,
new StringSink(cipher)
) // StreamTransformationFilter
); // StringSource
return cipher;
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
return "";
}
}

string decryptAES(const byte key[], const string& cipher, const byte iv[])
{
try
{
string recovered;

CTR_Mode< AES >::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv);

// The StreamTransformationFilter removes
//  padding as required.
StringSource s(cipher, true,
new StreamTransformationFilter(d,
new StringSink(recovered)
) // StreamTransformationFilter
); // StringSource
return recovered;
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
return "";
}
}

int main(int argc, char *argv[])
{
AutoSeededRandomPool prng;

byte key[AES::DEFAULT_KEYLENGTH];
prng.GenerateBlock(key, sizeof(key));

byte iv[AES::BLOCKSIZE];
prng.GenerateBlock(iv, sizeof(iv));

string plain = "CTR Mode Test";
string encoded, cipher, recovered;

/*********************************\
\*********************************/

// Pretty print key
encoded.clear();
StringSource(key, sizeof(key), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "key: " << encoded << endl;

// Pretty print iv
encoded.clear();
StringSource(iv, sizeof(iv), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "iv: " << encoded << endl;

/*********************************\
\*********************************/

cout << "plain text: " << plain << endl;
cipher = encryptAES(key, plain, iv);

/*********************************\
\*********************************/

// Pretty print
encoded.clear();
StringSource(cipher, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "cipher text: " << encoded << endl;

/*********************************\
\*********************************/

recovered = decryptAES(key, cipher, iv);
cout << "recovered text: " << recovered << endl;

cin.sync();
cin.get();
}

3

Решение

Ваши функции берут const byte key[] параметр, который по существу рассматривается как указатель. таким образом, sizeof (ключ) — это размер указателя на вашей платформе.

string encryptAES(const byte key[], const string& plain, const byte iv[])

// sizeof(key) is the size of a pointer
e.SetKeyWithIV(key, sizeof(key), iv);

Вы можете использовать std::vector<> в качестве опции или передать key_len, например:

string encryptAES(const byte key[], size_t key_len, const string& plain, const byte iv[])

// using key_len for the length of the key
e.SetKeyWithIV(key, key_len, iv);

Я надеюсь, что это имеет смысл, потому что та же ошибка есть в нескольких местах.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]