MCrypt rijndael-128到OpenSSL AES-128-ECB转换 [英] MCrypt rijndael-128 to OpenSSL aes-128-ecb conversion

查看:413
本文介绍了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);
    }

使用这些方法,如果加密后的字符串为v7IXp5vVaFVXXlt/MN8BVw==

,则为字符串small1

我们想在我们的侧面使用openssl_encrypt,这样,如果我们使用OpenSSL加密相同的字符串,则它必须提供与Mcrypt相同的结果.我研究过,使用 rijndael-128 模式 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

谢谢.

解决方案

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

Since Mcrypt is deprecated, I want to use OpenSSL instead in my code since we already using php 7.0.17 in our server and there's no tell when they upgrade it.

Some third party API (hosted on PHP 5.x probably and using mcrypt), is taking encrypted data. They've provided methods which they are using to encrypt/decrypt strings.

Here are they

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

using these methods string small1 if encrypted becomes v7IXp5vVaFVXXlt/MN8BVw==


We want to use openssl_encrypt in our side such that if we encrypt same string with OpenSSL it must give same results as Mcrypt. I've researched that mcrypt using rijndael-128 Mode ecb should be compatible with OpenSSL aes-128-ecb.

For last few hours, I've been trying to make my own method to encrypt strings serving same result by using OpenSSL. So far I've come to this

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

But it produces different string SxJ3+EdaeItZx3/EwGTUbw== for same as above input. I don't know if it is flag's problem or padding's, any pointers will be welcome.

I've added the code here to test online https://3v4l.org/v2J2N

Thanks in advance.

解决方案

In your specific example I've found that by changing aes-128-ecb to aes-256-ecb, it produces the same output as the legacy mcrypt_encrypt.

这篇关于MCrypt rijndael-128到OpenSSL AES-128-ECB转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆