Php 如何将mcrypt_generic转换为openssl_encrypt?

Php 如何将mcrypt_generic转换为openssl_encrypt?,php,php-openssl,Php,Php Openssl,这是我在PHP7.0.30中的php代码 $key = strtoupper(md5('799ae002c7e940ef8a890b3a428f8f458e3f7c39d1cc2bf24390f0c46cf932c8')); $text ='name=王星星&mobile=15212345678&idNumber=620402198709215456&bankName=招商银行&bankNum=6214830100799652'; $pla

这是我在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_通用输出:
8lzzexrhafeeqoxf1i9gpbca2hscelruq2oimhsgzly6rfronzgie32vhh/JkdK+X5N5hFBMKz+iomwabgl9biu2gianxbixcousxfu4edj/5uy7f9vr9ee5nqoaihbzhtpzmtec0flazg8tsngg=

但openssl_加密输出:
g/YBzu+SGy9jfR+DIVI2S0IGM2OQES+J3IEv7bNAoz7+3iX9FboJZT0h+OH6uUeQBoSsD+EAGA69U5C86IBCP5Q2AY1FZDFG/EGBTUAAJXRBWHXINEBW2JBAR2FR42WZUZOT5UJGZ+s/Iw==


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

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

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

所以你有两个选择

将密钥大小再增加8个字节,然后执行
base64\u encode()

只需删除
base64\u decode()
函数

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

您应该使用类似于
$key=openssl\u random\u pseudo\u bytes($size)的东西
生成一个密钥

我还想给你指一下图书馆的方向。它现在是PHP最新版本的本机版本

已更新

如果您的目标是像代码建议的那样使用256位密钥进行AES加密,那么您必须执行我上面所述的操作。如果这不是您的要求之一,那么您唯一需要做的就是将
openssl\u 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
块大小兼容


干杯

您在openssl加密中尝试过AES-128-CBC吗?是的AES-128-CBC输出:
VLhp06g+RtAuQN0RHOyd/HRuBQzvqOTvk4orxvX7F3f709bNgOfmd7JQ+m167eh/MpLws3lSl4kyAPEy0ZEtN62+BjX3zZ1d/8BT9RF1WHDWGI566LVFE5B9KWQ8FJPA2WO94TFPYM1QJBEOCDGG==
我发现如果我将
base64解码($code>改为
,它可以得到相同的输出。但我必须使用
base64\u decode($key)
,因为它是从JAVA转换而来的。您是使用该密钥还是可以更改它?或者指定一个192位的密钥大小,这是一个合法的AES密钥大小。@zaph感谢您的评论。你完全正确。我已经更新了我的答案,使之更加具体。请注意,我的回答完全正确,与OP的问题一致。OP实现AES-256-CBC的唯一方法是使用256位密钥。我不认为它应该被否决。@Joseph_J谢谢!是的,没问题,希望你的计划能成功。干杯