用PHP openssl解密rijndael-128字符串

时间:2018-11-15 10:26:58

标签: php mcrypt

要用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 to OpenSSL aes-128-ecb conversion并尝试

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;
        }
    }

我测试了几个选项,但是没有正确解密的字符串。我想我只是想念一件小事,所以如果有人有想法吗?

问候 托马斯

1 个答案:

答案 0 :(得分:1)

这应该是评论-但它有点长。

您正在处理一个非常具体的问题-为了解决更大的问题。通常,在StackOverflow上会欢迎像这样具体的问题,但是这样做的结果是,该方法通常隐藏了解决更大问题的更好方法。这看起来像其中之一。

首先,对提供的密钥使用OpenSSL applies some transformations进行加密和解密操作,以使其更难以破解加密。这在加密工具中很常见。 mcrypt可能(确实)有相似之处,尽管我怀疑它可能并非如此。因此,您可能使用相同的密钥和相同的算法,但是得到不同的结果。您链接到的帖子说它适用于256位块。我令人怀疑,您似乎也找到了同样的东西。

除非数据已经加密,否则您不希望解密。它在何处以及如何进行加密大概与mcrypt兼容。您需要问的一个非常重要的问题是,您的后加密实现是否也需要与加密器兼容/是否可以迁移密文/是否可以更改加密器。