Фон
Около дня я боролся с расшифровкой, по-видимому, правильно сформированного зашифрованного текста. Предположим, у нас есть следующий шестнадцатеричный зашифрованный текст, который содержит ровно 160 символов, то есть имеет 80 байтов.
QString c = "1BFAC407AF0D440A2D6176C0B5D125AA96088490299AC18C74623C0EF1BB1372E554FC4150A8066220E943697BE2491D8AE13AA036B298425AC510A8A917D59EBB69708B9040AB3A84C63043EAD4AB07";
QString k = CryptoUtils::hexEncode("abc");
QString p = CryptoUtils::decrypt(c, k);
qDebug() << p;
При условии, что мы используем AES 256, AFAIK, ключ должен иметь длину 32 байта, а зашифрованный текст должен иметь длину, кратную 16 байтам, что соответствует всем этим условиям в отношении моего фрагмента кода.
Обратите внимание, что я использую передачу SHA256 с парольной фразой для создания 32-байтового ключа. Таким образом, это гарантирует, что все ключи имеют длину 32 байта.
Полные исходные коды этих функцию можно найти в моем репозитории на GitHub (в ветке Part1).
Мой вопрос
Когда я хочу запустить этот код, мое приложение падает. Вот исключение:
terminate called after throwing an instance of 'CryptoPP::InvalidCiphertext'
what(): StreamTransformationFilter: invalid PKCS #7 block padding found
The program has unexpectedly finished.
Я искал эту проблему и понял, что это может быть из-за завершающего \0
после того, как вы зашифровали обычный текст. Однако я не мог просто решить проблему. Пожалуйста, помогите мне, это просто сводит меня с ума.
StringSource(decodedKey, size, true, new HashFilter(*(new SHA256), new ArraySink(key, AES::MAX_KEYLENGTH)));
: это плохой KBKDF, он скрывает проблемы с ключом и, по моему скромному мнению, довольно нечитаем. Если вы используете что-либо, кроме библиотеки, на которую указываете, то расшифровка точно не удастся (если, конечно, такое же нестандартное хеширование не применяется в другой библиотеке). - person Maarten Bodewes   schedule 09.12.2015encrypt
(из того файла cpp, на который я ссылался). Кроме того, IV всегда0
. Что касается ключа, я не вижу, в чем проблема с SHA256 (мне просто нужно сгенерировать универсальный ключ из парольной фразы, и для этого просто не имеет значения, какой алгоритм я должен использовать). - person frogatto   schedule 09.12.2015