Я пытаюсь перенести процедуру дешифрования из программы C # на C ++ с помощью cryptopp, но у меня проблема. В программе на C # ключ и IV имеют длину 256 бит. Итак, я попытался сделать что-то вроде этого:

    char *hash1 = "......";
    std::string hash2;

    CryptoPP::StringSource(hash1, true,new CryptoPP::Base64Decoder(new CryptoPP::StringSink(hash2)));
    CryptoPP::Rijndael::Decryption decryptor(key, 32);
    CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( decryptor, iv);
    CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, (new CryptoPP::StringSink( decryptedData ) ));
    stfDecryptor.Put( reinterpret_cast<const unsigned char*>( hash2.c_str() ), hash2.size() );
    stfDecryptor.MessageEnd();

И я получаю

StreamTransformationFilter: длина зашифрованного текста не кратна размеру блока.

Я пытался передать размер IV вот так:

    CryptoPP::CBC_Mode<CryptoPP::Rijndael >::Decryption decr;
    decr.SetKeyWithIV(key, 32, iv, 32);

Но потом получаю:

Длина IV 32 превышает максимум 16.

Итак, как я могу расшифровать данные, если они были зашифрованы IV с длиной = 32?

3
januszmk 16 Мар 2013 в 17:18
2
Судя по диаграмме на веб-сайте CryptoPP, я несколько не решаюсь предложить это поддерживает все, кроме 128-битных блоков. (Очевидно, он поддерживает более крупные клавиши ). Если их вырезка является только AES-совместимой, тогда это имеет смысл, поскольку ни одна производная AES не использует более 16-байтовых блоков и IV). Достаточно взглянуть на заголовочный файл.
 – 
WhozCraig
16 Мар 2013 в 17:52
1
Вы имеете в виду ту часть, где написано FixedBlockSize<16>?
 – 
Maarten Bodewes
18 Мар 2013 в 23:22
В значительной степени да. Я, честно говоря, не знаю, сработает ли вообще вывести собственный Rijindael_Info32 как расширение public FixedBlockSize<32>, public VariableKeyLength<16, 16, 32, 8> или даже public FixedBlockSize<32>, public FixedKeyLength<32>, а остальная часть алгоритма просто возьмется и заработает , поскольку я недостаточно знаком с CryptoPP, чтобы сделать этот звонок. Пессимист во мне говорит, что это маловероятно.
 – 
WhozCraig
19 Мар 2013 в 00:13
Что ж, я не эксперт по реализациям Rijndael, но я все же уверен, что это тоже маловероятно.
 – 
Maarten Bodewes
19 Мар 2013 в 00:21
Опубликовал наши выводы в качестве ответа, увеличил несколько ваших принятых / хороших ответов взамен
 – 
Maarten Bodewes
20 Мар 2013 в 00:08

1 ответ

Лучший ответ

Если посмотреть на реализацию, текущие итерации crypto ++ поддерживают только Rijndael с размером блока 16 байт. Поскольку IV должен быть в точности одним блоком для режима CBC, использование Rijndael с размером блока 256 бит не представляется возможным.

3
Maarten Bodewes 20 Мар 2013 в 00:05
+1 Согласен. Если авторы CryptoPP не предусмотрительно справились с созданием вручную FixedBlockSize<32>, и он "просто работает", то, скорее всего, мало что можно сделать. Стоит попробовать, но я бы не задерживал дыхание.
 – 
WhozCraig
20 Мар 2013 в 00:19
Спасибо за ответ. Я буду использовать mcrypt вместо CryptoPP
 – 
januszmk
20 Мар 2013 в 17:13
- это придумал как дурак другого вопроса. Вы на 100% правы, но мы пытаемся изменить это в [ближайшем] будущем. Как только мы выпустим Crypto ++ 5.6.3 и 5.7, Rijndael с размерами блоков 192 и 256 будет в списке TODO.
 – 
jww
4 Ноя 2015 в 04:57
@jww, CryptoPP теперь поддерживает AES-256?
 – 
user3806649
13 Янв 2016 в 00:52
2
- Crypto ++ поддерживает AES-256 с размером ключа 256 бит. Он не поддерживает блоки размером 256 бит (или 192 бит).
 – 
jww
13 Янв 2016 в 01:03