如何将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
块大小兼容。
干杯
这是我在 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
块大小兼容。
干杯