Когда объект Crypt::CBC
создается в коде Perl, в отношении ключа определяется следующее, см. здесь :
- Поскольку
-keysize
аргумент не указан, ключ имеет максимальный размер 56
байт. - Поскольку аргумент
-literal_key
не указан, значение интерпретируется как кодовая фраза, а фактический ключ получается из это (обычно в сочетании с солью). - Поскольку аргумент
-salt
не указан, соль не используется, поэтому ключ получается только из ключевой фразы.
Для примера в размещенном коде Perl зашифрованный текст в виде шестнадцатеричной строки ($pjf
):
ecc9d0b2449ef433285ade2d02ac19184866f5f9b814bde2
Чтобы успешно расшифровать этот зашифрованный текст с помощью опубликованного кода PHP, необходимы следующие изменения :
Ключ должен быть получен из ключевой фразы. Это делается в функции expandKey
. Ключ генерируется путем создания MD5 га sh ключевой фразы. Если ключ не имеет необходимой длины, он снова хэшируется и добавляется к предыдущему ha sh. Это происходит до тех пор, пока не будет создан ключ необходимой длины.
Необходимо установить флаг OPENSSL_RAW_DATA
, поскольку зашифрованные данные передаются в openssl_decrypt
в качестве необработанных данных, а не в кодировке Base64. Кроме того, зашифрованные данные должны быть переданы Base64 в кодировке openssl_decrypt
.
PHP код, включая изменения:
$encryptedDataHex = 'ecc9d0b2449ef433285ade2d02ac19184866f5f9b814bde2';
$encryptedData = hex2bin($encryptedDataHex);
$key = expandKey('example');
$iv = '12345678';
$cipher = 'bf-cbc'; // 'blowfish' also works
$options = OPENSSL_RAW_DATA;
$decryptedData = openssl_decrypt($encryptedData, $cipher, $key, $options, $iv);
echo 'Decrypted data: ' . $decryptedData;
function expandKey($key){
$key = md5($key, true);
while(strlen($key) < 56){
$key .= md5($key, true);
}
return substr($key, 0, 56);
}