AES, 128 и 256 Неверная длина ключа

Я пытаюсь зашифровать текст с помощью Crypto ++. В прошлый раз это работало хорошо при использовании AES CTR, но теперь при использовании CBC или GCM максимальная длина ключа, которую я могу использовать, составляет 32 бита.

Код, который обрабатывает шифрование:

string xAESPlain, xAESCipher;
AutoSeededRandomPool xRng;

byte xAESKey[128]; // Doesnt Work has to be 32 or 16
byte xAESIv[128];

xRng.GenerateBlock(xAESKey, sizeof(xAESKey));
xRng.GenerateBlock(xAESIv, sizeof(xAESIv));

CBC_Mode< AES >::Encryption E;
E.SetKeyWithIV(xAESKey, sizeof(xAESKey), xAESIv);

StringSource ss(xAESPlain, true,
new StreamTransformationFilter(E,
new StringSink(xAESCipher)
)
);

При запуске этого Crypto ++ выдает Exception:

terminate called after throwing an instance of 'CryptoPP::InvalidKeyLength'
what():  AES/CBC: 128 is not a valid key length

Обратите внимание, что то же самое происходит при использовании файла example.zip, представленного в вики (и изменении длины ключа на 256 или 128).

Любые идеи, почему Exception бросается?

1

Решение

Байты обычно являются октетами (8 бит). AES указывается для 128-битного размера блока или 16 байтов, что также является размером IV. Размеры ключа AES могут быть 128-битным, 192-битным или 256-битным или 16-байтовым, 24-байтовым или 32-байтовым соответственно. Они не могут отличаться от тех. Так что используйте это для AES-256:

byte xAESKey[32];
byte xAESIv[16];

Это не должно иметь ничего общего с режимом работы.

5

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

Немного лучше и безопаснее инициализировать размер блока и ключ следующим образом:

unsigned char iv[ CryptoPP::AES::BLOCKSIZE ];
unsigned char keyq[ CryptoPP::AES::MAX_KEYLENGTH ];

CryptoPP также имеет константы, такие как CryptoPP :: AES :: MIN_KEYLENGTH и т. Д.

1

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