Проблемы совместимости с pidcrypt и openssl_encrypt
Я разрабатываю приложение, которое позволяет конечным пользователям проверять свои браузеры. Часть требования заключается в том, что когда время начала викторины подходит к концу, вопрос должен отображаться для каждого участника сразу. Это делает обслуживание вопросов конечным пользователям с сервера менее разумным, потому что это приведет к внезапному всплеску запросов, поэтому я намерен ответить на вопросы, как только они подключатся, и у него меньше 2 часов до начала теста. Проблема в том, что, поскольку это соревнование, вопросы не должны рассматриваться раньше времени старта, поэтому необходимо его зашифровать.
Я решил зашифровать в два этапа, первый этап шифрования с использованием асимметричного шифрования RSA для обмена ключами, что я успешно сделал. Этот ключ будет использоваться для шифрования любых других данных, которые будут передаваться между сервером и клиентом.
Проблема сейчас в части симметричного шифрования. Я пытаюсь использовать метод openssl_encrypt для шифрования на стороне сервера и пытаюсь расшифровать с помощью pidcrypt (библиотека шифрования / дешифрования javascript) на стороне клиента. Оказывается, что pidcrypt требует, чтобы ваш iv (вектор инициализации) был длиной восемь байтов, однако openssl_encrypt, использующий режим AES-256-CBC, не допускает восемь байтов, вместо этого постоянно настаивая на 16 байтах. Я сделал много перестановок и экспериментов без удачи. В документации pidcrypt сказано, что он совместим с openssl, поэтому мой вопрос - что я делаю не так? Ниже приведен код, который шифрует на стороне сервера с использованием PHP
$iv_len = openssl_cipher_iv_length("AES-256-CBC");
$key='My very secret key.......';
$iv = openssl_random_pseudo_bytes($iv_len);
$enc = openssl_encrypt('Hello', "AES-256-CBC", $key, 0, $iv);
$encryptedMessage = base64_encode("Salted__".bin2hex($iv).$enc);
echo json_encode(array('key'=>$key, 'encrypt'=>$encryptedMessage,));
Пожалуйста, есть способ сделать $iv_len 8 байтов длиннее, чем 16 байтов, которые этот код постоянно возвращает, и я правильно подхожу ко всей этой установке. Спасибо
1 ответ
pidcrypt
не использует 8-байтовый IV, он использует 8-байтовую соль. IV и соли разные понятия, хотя они имеют много общего.
В pidcrypt
Рандомизированная соль используется вместе с паролем и MD5 для генерации ключа и IV. Затем соль предварительно добавляется в зашифрованный текст (как это делает openssl). Сервер должен использовать тот же метод для генерации ключа и IV, используя предварительно сложенное значение соли и общий пароль. В настоящее время вы пытаетесь напрямую с ключом и IV, что не правильно.
Какой бы ни была библиотека, IV, используемый для расшифровки любого режима CBC, должен быть идентичен размеру блока базового шифра. Основным блочным шифром здесь является AES, что означает, что IV всегда будет 16 байтов.
Вам следует внимательно прочитать комментарии пользователей к недокументированным openssl_encrypt
метод, а затем, вероятно, либо найти другую совместимую с openssl библиотеку в PHP, либо найти / реализовать метод получения ключей OpenSSL ( EVP_BytesToKey
)
Обратите внимание, что следующий вывод производится openssl
утилита командной строки:
00000000 53 61 6c 74 65 64 5f 5f 44 a2 2f ee ac ee 94 fd |Salted__D./.....|
00000010 6f 93 17 24 44 12 88 66 e7 fe 5c d5 7d 81 fe d9 |o..$D..f..\.}...|
00000020
Так что это строка ASCII, содержащая Salted__
затем следует 8-байтовая случайная соль (не IV), затем 16 байтов зашифрованного текста (один полный блок).