使用PHP openssl解密rijndael-128字符串



要用openssl替换mcrypt,我有以下任务:

加密和解密的实际代码有点像

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,$plaintext, MCRYPT_MODE_CBC, $iv);

$result_decrypt  = mcrypt_decrypt(
'rijndael-128',
$key,
$ciphertext,
'cbc',
$iv
);

工作很好,一切都很好。现在我想用openssl解密$密文,我查看MCrypt rijndael-128到openssl aes-128-ecb的转换,并尝试

function decrypt_openssl_rijndael($value, $unserialize = true, $salt)
{
if (!extension_loaded('openssl')) {
throw new RuntimeException(
'SSL extension is not available.'
);
}
$decrypted = openssl_decrypt($value, 'aes-128-ecb', $salt, OPENSSL_RAW_DATA );
if ($unserialize) {
return unserialize($decrypted);
} else {
return $decrypted;
}
}

我测试了几个选项,但没有得到正确解密的字符串。我想我只是错过了一件小事,所以如果有人有主意的话?

问候Thomas

这应该是一个注释,但有点长。

你正在处理一个非常具体的问题——为了解决一些更大的问题。通常,像这样具体的问题在StackOverflow上是受欢迎的,但其结果是,这种方法往往掩盖了解决更大问题的更好方法。这看起来像是其中之一。

首先,OpenSSL对提供的密钥进行一些转换,以进行加密和解密操作,从而使破解加密变得更加困难。这在加密工具中很常见。mcrypt可能也做过类似的事情,尽管我怀疑它可能没有。所以你可以使用相同的密钥和相同的算法,但得到不同的结果。你链接到的帖子说它可以使用256位块。我很怀疑,而你似乎也发现了同样的情况。

除非数据已加密,否则您不会想解密数据。加密的位置和方式可能与mcrypt兼容。您需要问的一个非常重要的问题是,您的post-mcrypt实现是否也需要与加密器兼容/是否可以迁移密文/是否可以更改加密器。

最新更新