MCrypt rijndael-128到OpenSSL AES-128-ECB转换 [英] MCrypt rijndael-128 to OpenSSL aes-128-ecb conversion
问题描述
由于不推荐使用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屋!