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

Jam*_*mad 14 php encryption cryptography mcrypt php-openssl

由于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);
    }
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Rol*_*oós 9

这是对我有用的:

<?php

$str = 'Content';
if (strlen($str) % 16) {
    $str = str_pad($str, strlen($str) + 16 - strlen($str) % 16, "\0");
}

$key = 'KEY';
if (strlen($key) % 16) {
    $key = str_pad($key, strlen($key) + 16 - strlen($key) % 16, "\0");
}

$res1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
echo strToHex($res1) . ' | mcrypt_encrypt';

echo "<hr>";
echo strToHex(openssl_decrypt($res1, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';

echo "<hr>";

$res2 = openssl_encrypt($str, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
echo strToHex($res2) . ' | openssl_encrypt';

echo "<hr>";
echo strToHex(openssl_decrypt($res2, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';


function strToHex($string) {
    $hex = '';
    for ($i = 0; $i < strlen($string); $i++) {
        $ord     = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex     .= substr('0' . $hexCode, -2);
    }

    return strToUpper($hex);
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*ler 6

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

  • 我相信 Mcrypt 提供 128、192 和 256 位的*块大小*。AES 仅提供 128 块大小。我的猜测是,`MCRYPT_RIJNDAEL_128` 可能是指具有 128 位块大小的 Rijndael,即 AES。密钥大小是另一回事,这就是 OpenSSL 的 AES-256-CBC 中的 256 表示的内容。如果使用标准加密算法名称 (SCAN),则密码实例的 Mcrypt 算法名称将类似于“Rijndael-128(256)/CBC”。 (2认同)