Раньше мне удалось перенести код CBC CryptoPP Rijndael_128 CBC на MCrypt PHP, но теперь у меня проблемы с режимом CFB.Результаты C ++ и PHP не совпадают (хорошо, первый байт соответствует, но это может быть совпадением, все остальное не совпадает).С некоторой диагностикой, похоже, что PHP mcrypt неправильно устанавливает длину ключа?
Вот C ++ (диагностика и вся информация удалена для простоты):
CFB_Mode<AES>::Encryption encryptor(g_encrypt_key, AES::DEFAULT_KEYLENGTH, g_encrypt_iv);
StringSource ss( sInput.c_str(), true,
new StreamTransformationFilter( encryptor,
new HexEncoder( new StringSink( sEncryptedOut ) )
));
А вот PHP: *Длина 1006 *
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CFB, '')
mcrypt_generic_init($cipher, $g_encrypt_key, $g_encrypt_iv);
$sEncryptedOutput = mcrypt_generic( $cipher, $sInput);
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);
g_encrypt_key
и g_encrypt_iv
составляет 16 байтов, и байты совпадают для версий C ++ и PHP.Для версии PHP это двоичная строка, построенная из байтов (да, я проверил, что они идентичны).
Я добавил вызовы в версию PHP, чтобы проверить размер блока $cipher
, размер ключа,и т. д. Размер блока и размер iv - 16;поддерживаемые размеры ключей указаны как 16, 24 и 32 - все как и ожидалось.
В чем проблема, я думаю, что размер ключа сообщается как 32 байта.Глядя на документы mcrypt, единственный способ установить размер ключа - это предоставить ключ нужного размера.Но я передаю 16-байтовый ключ!Так почему же он сообщает о наличии 32-байтового ключа?Если режим CFB должен использовать 32-байтовый ключ, то почему CryptoPP принимает его как нормальный?Каково решение?Могу ли я заставить PHP использовать предоставленный 16-байтовый ключ?Или я пропускаю параметр, который по умолчанию отличается от CryptoPP, отличного от MCrypt?
Я использую режим CFB, потому что хочу минимизировать длину результирующих зашифрованных данных.Несколько байтов, которые вводит заполнение, имеют значение в этом приложении.
Мне нужно иметь возможность шифровать / дешифровать в C ++, но только в PHP.AES, возможно, является излишним для моего приложения - минимум, который мне нужен, - это «хорошее скремблирование байтов», чтобы функция отдельных байтов в данных не была очевидной.