Криптографические библиотеки конфликты (Mcrypt, libgcrypt)
Вопрос
Я пытаюсь выполнить шифрование и дешифрование (Rijndael 256, режим ЕЦБ) в двух разных компонентах:
1. PHP - сторона сервера (с использованием Mcrypt)
2. C + + - сторона клиента (с использованием GCRYPT)
Я столкнулся с проблемой, когда сторона клиента не может правильно расшифровать зашифрованные данные (сделанные стороной сервера)
Итак ... я проверил:
1. Начальный вектор - то же самое (32 длина)
2. Ключ - опять тот же ключ с обеих сторон ..
Поэтому я написал какой-то код в C ++, который зашифрует данные (с одинаковыми параметрами, такими же, как в PHP)
И я обнаружил, что зашифрованные данные содержат разные байты (возможно, проблема кодирования ??)
Я буду более чем рад получить помощь
PHP - Mcrypt
// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$iv = "static_init_vector_static_init_v";
echo "IV-Size: " . $iv_size . "\n";
echo "IV: " . $iv . "\n";
$passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv);
print_hex($passcrypt);
return $encode;
}
mc_encrypt("Some text which should be encrypted...","keykeykeykeykeykeykeykeykeykeyke");
Я опубликую код C ++ в комментарии
Спасибо, Джонни Депп
Решение
OK. Я сделаю мой комментарий ответ:
Вектор инициализации (IV) не используется в режиме ЕЦБ. Если он предоставлен разные реализации, могут работать по-разному.
Если вы хотите быть уверены, что реализации будут работать правильно, затем используйте IV 0 (ноль). Несмотря на то, что вы предоставляете IV, оба реализации должны игнорировать его, но никогда не удается быть уверенным в этом. Не обеспечивая IV в режиме ЕЦБ, должно работать Aswell, но опять же, все зависит от реализации.
Согласно PHP документация Макрипт будет игнорировать это. Gcrypt Я не уверен.
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB)
должен фактически вернуться 0, так как вы указываете режим ECB.
Редактировать:
Не звони mcrypt_get_iv_size
или mcrypt_create_iv
.
Вместо звонка mcrypt_encrypt
без IV. Согласно PHP документация Все байты в IV будут установлены на ' 0'.
То же самое касается кода C ++. Нет необходимости устанавливать IV вообще. Код LibgCrypt является сложным, но от Glaning в источнике версии 1.4.5, а затем в режиме ЕЦБ, кажется, IV не используется вообще.
Если полученный зашифрованный текст все еще отличается, то проблема - это что-то другое.
Пару возможностей приходит на ум:
- Кодирование - это то же самое кодирование, используемое как на сервере, так и на клиенте?
- Эндианс - какие типы систем являются сервер и клиент? Big-VS Little-Endian?