这是我在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,谢谢!
答案 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
块大小兼容。
欢呼