我目前有一些代码可以与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)。我不知道为什么它可以与此库一起使用,但是我使用了该方法,似乎它与LibTomCrypt中的“ blocklen”有关。
无论如何,这就是我要对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大小。
最佳答案
我们真的看不到您使用的是哪种密码模式。如果是Rijndael-256,则块大小将为256位。如果不是,则该现时可能会被库削减到某个地方-在这种情况下,很可能只使用了前128位。
也就是说,该代码将永远无法工作,因为您在第一个示例中使用计数器模式加密,而在另一个示例中使用CBC模式加密。