Криптографические библиотеки конфликты (Mcrypt, libgcrypt)

StackOverflow https://stackoverflow.com/questions/3148896

  •  01-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь выполнить шифрование и дешифрование (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?
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top