一尘不染

MCrypt rijndael-128到OpenSSL AES-128-ECB转换

php

由于不建议使用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 Mode ecb的 mcrypt 应该与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

提前致谢。


阅读 659

收藏
2020-05-29

共1个答案

一尘不染

在您的特定示例中,我发现通过更改aes-128-ecbaes-256-ecb,它将产生与旧版相同的输出mcrypt_encrypt

2020-05-29