如何将mcrypt_generic转换为openssl_encrypt?

时间:2018-07-27 07:18:53

标签: php php-openssl

这是我在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("\0", $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,谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

所以您有两个选择。

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

OR

只需删除base64_decode()函数。

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

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

我还想向您指出Libsodium库的方向。现在它是PHP最新版本中的本机。

已更新

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

$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块大小兼容。

欢呼

相关问题