编程语言
首页 > 编程语言> > php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换

php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换

作者:互联网

由于Mcrypt已被弃用,我想在我的代码中使用OpenSSL,因为我们已经在我们的服务器中使用了PHP 7.0.17并且没有告诉他们何时升级它.

某些第三方API(可能在PHP 5.x上托管并使用mcrypt)正在使用加密数据.他们提供了用于加密/解密字符串的方法.

他们是这样的

$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ;

public function encrypt128($str)
    {
        $block = mcrypt_get_block_size("rijndael_128", "ecb");
        $pad   = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad), $pad);

        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB));
    }

public function decrypt128($str)
    {
        $str = base64_decode($str);
        $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB);

        $len = strlen($str);
        $pad = ord($str[$len - 1]);

        return substr($str, 0, strlen($str) - $pad);
    }

使用这些方法字符串small1如果加密变为v7IXp5vVaFVXXlt / MN8BVw ==

我们想在我们这边使用openssl_encrypt,这样如果我们用OpenSSL加密相同的字符串,它必须给出与Mcrypt相同的结果.我研究过使用rijndael-128模式的mcrypt ecb应该与OpenSSL aes-128-ecb兼容.

在过去的几个小时里,我一直在尝试使用自己的方法来加密使用OpenSSL提供相同结果的字符串.到目前为止,我已经到了这里

public function sslEncrypt128($str)
{
    $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c';
    return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA));
}

但它产生不同的字符串SxJ3 EdaeItZx3 / EwGTUbw ==与上述输入相同.我不知道它是标志的问题还是填充,任何指针都会受到欢迎.

我在这里添加了代码以在线测试https://3v4l.org/v2J2N

提前致谢.

解决方法:

在您的具体示例中,我发现通过将aes-128-ecb更改为aes-256-ecb,它会产生与传统mcrypt_encrypt相同的输出.

标签:mcrypt,php,encryption,cryptography,php-openssl
来源: https://codeday.me/bug/20190919/1812107.html