如何将mcrypt_generic转换成openssl_encrypt?

How to convert mcrypt_generic to openssl_encrypt?

这是我在 PHP7.0.30

中的 php 代码
    $key = strtoupper(md5('799ae002c7e940ef8a890b3a428f8f458e3f7c39d1cc2bf24390f0c46cf932c8'));
    $text ='name=王星星&mobile=15212345678&idNumber=620402198709215456&bankName=招商银行&bankNum=6214830100799652';
    $plaintext = $text;
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    //PKCS5Padding
    $padding = $size - strlen($plaintext) % $size;
    $plaintext .= str_repeat(chr($padding), $padding);
    $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
    $iv = str_repeat("[=12=]", $size);
    /* Intialize encryption */
    mcrypt_generic_init($module, base64_decode($key), $iv);
    /* Encrypt data */
    $encrypted = mcrypt_generic($module, $plaintext);
    /* Terminate encryption handler */
    mcrypt_generic_deinit($module);
    mcrypt_module_close($module);
    var_dump(base64_encode($encrypted));

    /* openssl_encrypt */
    $encrypted = openssl_encrypt($plaintext, 'AES-256-CBC',base64_decode($key), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,$iv);
    var_dump(base64_encode($encrypted));

mcrypt_generic 输出:8LZZEXRhAfeeQOxF1iI9GpBcA2hSCelrUq2OimhSgZly6RfRonzGiE32vHh/JkdK+X5N5hFBMKz+iOmWAbgL9BIu2GIAxBIXCOusxFU4eDJ/5uy7F9vR9EE5NqOAiHBZhTP3pzMtEc0fLAzg8Tsngg==

但 openssl_encrypt 输出: g/YBzu+SGy9jfR+DIVY2S0iGM2O0QEs+J3IEv7bNAoz7+3iX9FboJZT0h+OH6uUeQBoSsD+eAga69U5C86Ibcp5Q2ay1FzfDFG/eGBtUaAJxRBwhxiNeBxPw2jBar2fR42wZUZOGTjlT5Ujgz+s/Iw==

我不知道如何将 mcrypt_generic 转换为 openssl_encrypt,谢谢!

您需要一个 256 位密钥。您当前的 "key" 是 32 个字节,即 256 位。

你的问题是你正在解码密钥。当您解码密钥时,您正在将密钥的大小减少到 24 字节或 192 位。

所以你有两个选择。

base64_encode() 之前将密钥大小再增加 8 个字节。

只需删除 base64_decode() 函数。

其次,我希望您将 md5 用于测试目的而不是用于您的应用程序。 md5 散列不适合为您提供专为现代密码学设计的散列。

您应该使用 $key = openssl_random_pseudo_bytes($size); 之类的东西来生成密钥。

我还想为您指出 Libsodium 图书馆的方向。它现在是 PHP.

最新版本的原生版本

已更新

如果您的目标是像您的代码建议的那样使用 256 位密钥进行 AES 加密,那么您将必须按照我上面所说的进行操作。如果这不是您的要求之一,那么您唯一需要做的就是在 openssl_encrypt() 函数中将 AES-256-CBC 更改为 AES-192-CBC

$encrypted = openssl_encrypt($plaintext, 'AES-192-CBC', base64_decode($key), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

需要指出的是名称 MCRYPT_RIJNDAEL_128 中的“128”指的是块大小而不是密钥大小,而 AES-256-CBC 中的“256”实际上指的是密钥大小。这就是为什么 AES-192-CBC 适用于您当前的 192 位密钥大小。 AES 加密使用 128 位块大小的标准,因此与 MCRYPT_RIJNDAEL_128 块大小兼容。

干杯