Botan AES-256, 32-битный InitialVector

В настоящее время у меня есть код, который корректно работает с библиотеками LibTomCrypt, но не с Botan (я пытаюсь преобразовать его в Botan).

Мой (рабочий) код LibTomCrypt:

    // read the initial vector
unsigned char iv[0x20];
fseek(inputFile, 0x20, SEEK_SET);
fread(iv, 0x20, 1, inputFile);

// call ctr_start
res = ctr_start(0, iv, key, 0x20, 0, 0, &ctr);

if (res == 0)
{
printf("decrypting data...\n");

// read the encrypyted data
unsigned char cipheredText[0x3A8];
fread(cipheredText, 0x3A8, 1, inputFile);

// decrypt the data
unsigned char uncipheredText[0x3A8];
if (ctr_decrypt(cipheredText, uncipheredText, 0x3A8, &ctr) != 0)
{
fclose(inputFile);
printf("ERROR: ctr_decrypt did not return 0\n");
return -1;
}
if (ctr_done(&ctr) != 0)
{
fclose(inputFile);
printf("ERROR: ctr_done did not return 0\n");
return -1;
}

printf("writing decrypted data...\n");

// get the decrypted path
char *decPath = concat(fileName, ".dec", 4);

// write the decrypted data to disk
FILE *outFile = fopen(decPath, "w");
fwrite(uncipheredText, 0x3A8, 1, outFile);
fclose(outFile);
}
else
{
printf("ERROR: ctr_start did not return 0\n");
}

Как видите, мой размер моего начального вектора (IV) равен 0x20 (32). Я не знаю, почему это будет работать с этой библиотекой, но я обратился к методу, и похоже, что он как-то связан с «blocklen» в LibTomCrypt.

Во всяком случае, это то, что я пытаюсь сделать с библиотеками Botan:

// get the iv
t1Stream->setPosition(0x20);
BYTE rawIV[0x20];
t1Stream->readBytes(rawIV, 0x20);

// get the encrypted data
t1Stream->setPosition(0x40);
BYTE cipheredText[0x3A8];
t1Stream->readBytes(cipheredText, 0x3A8);

// setup the keys & IV
Botan::SymmetricKey symKey(key, 0x20);
Botan::InitializationVector IV(rawIV, 0x20);

// setup the 'pipe' ?
Botan::Pipe pipe(Botan::get_cipher("AES-256/CBC/NoPadding", symKey, IV, Botan::DECRYPTION));

Но он продолжает выдавать это по вызову get_cipher:

terminate called after throwing an instance of 'Botan::Invalid_Key_Length'
what():  Botan: AES-256 cannot accept a key of length 32

Если я изменю размер IV на 16, он будет работать правильно, но не сможет обработать данные, так как IV неверен.

Также, изменить размер IV в моем коде шифрования не вариант.

1

Решение

Мы не можем реально увидеть, какой режим шифрования вы используете. Если это Rijndael-256, то размер блока будет 256 бит. Если это не так, то одноразовый номер, вероятно, будет где-то вырезан библиотекой — в этом случае, вероятно, будут использоваться только первые 128 бит.

Тем не менее, код никогда не будет работать, так как вы используете шифрование в режиме счетчика в первом примере и шифрование в режиме CBC в другом.

0

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

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