Этот ответ предназначен для соленого режима Crypt :: CBC, а не для режима randomIV, но это страница, на которой я остановился при поиске решения, так что другие тоже могут.
При использовании этого кода Perl:
my $cipher = Crypt::CBC->new(
-key => $password,
-cipher => 'Rijndael',
-salt => 1,
-header => 'salt',
) || die "Couldn't create CBC object";
$string = $cipher->encrypt_hex($input);
(или даже без соли и заголовка, которые имеют эти значения по умолчанию)
Perl создаст хеш, который должен быть совместимым с OpenSSL.
Я не нашел ни одного PHP-метода, который бы знал, как это читать, поэтому вот моя собственная PHP-версия декодирования, найденная в CBC.pm.
Я извлекаю ключ и iv, а затем позволяю mcrypt закончить работу.
function cred_decrypt($input, $password)
{
/************************* Inspired by Crypt/CBC.pm *******************************/
$input = pack('H*', $input);
if (substr($input, 0, 8) != 'Salted__') {
die("Invalid hash header, expected 'Salted__', found '".substr($input, 0, 8)."'");
}
$salt = substr($input, 8, 8);
$input = substr($input, 16);
$key_len = 32;
$iv_len = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$data = '';
$d = '';
while (strlen($data) < $key_len+$iv_len) {
$d = md5($d . $password . $salt, TRUE);
$data .= $d;
}
$key = substr($data, 0, $key_len);
$iv = substr($data, $key_len, $iv_len);
/**********************************************************************************/
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_CBC, $iv), "\0\n\3");
}
Примечание: в моем случае требовался ритрим, он может съесть конечные символы новой строки, если таковые имеются.