MCrypt rijndael-256转OpenSSL aes-256-ecb的技术实现咨询
替换MCrypt为OpenSSL实现AES-256-ECB加密/解密
没问题,我帮你把基于MCrypt的加密逻辑转换成兼容PHP7.2+的OpenSSL实现,完美匹配你原来的功能:
先分析原代码的核心逻辑
你原来的代码用的是MCRYPT_RIJNDAEL_256(块大小256位)+ ECB模式,密钥使用指定的salt(默认DiAo74dOO09T48YESmuvbS0T),加密后做Base64编码。由于MCrypt已被弃用,我们用OpenSSL的rijndael-256算法来对应(注意:OpenSSL里的aes-256-ecb是块大小128位的标准AES,和你原来的MCRYPT_RIJNDAEL_256块大小不同,所以必须用rijndael-256)。
替换后的完整代码
// 加密函数 function encrypt($text, $salt = '') { if ($text === "") { return ""; } // 使用原默认密钥 if ($salt === "") { $salt = 'DiAo74dOO09T48YESmuvbS0T'; } // RIJNDAEL_256的块大小是32字节,需要手动零填充到块大小的整数倍 $blockSize = 32; $textLength = strlen($text); $padding = $blockSize - ($textLength % $blockSize); $text .= str_repeat("\0", $padding); // OpenSSL加密:rijndael-256算法,ECB模式,原始输出+零填充 $encrypted = openssl_encrypt( $text, 'rijndael-256', $salt, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, '' // ECB模式不需要IV,传空字符串即可 ); // 最后做Base64编码,和原逻辑一致 return trim(base64_encode($encrypted)); } // 解密函数 function decrypt($encryptedText, $salt = '') { if ($encryptedText === "") { return ""; } if ($salt === "") { $salt = 'DiAo74dOO09T48YESmuvbS0T'; } // 先Base64解码 $encrypted = base64_decode($encryptedText); // OpenSSL解密:对应加密的参数 $decrypted = openssl_decrypt( $encrypted, 'rijndael-256', $salt, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, '' ); // 移除末尾的零填充 return rtrim($decrypted, "\0"); }
关键注意点
- 算法匹配:必须用
rijndael-256而不是aes-256-ecb,因为原MCrypt用的是256位块大小的Rijndael,标准AES的块大小固定为128位,两者不兼容。 - 填充处理:MCrypt默认用零填充,而OpenSSL默认用PKCS7填充,所以我们手动做零填充并指定
OPENSSL_ZERO_PADDING选项,保证加密结果和原代码完全一致。 - ECB模式风险:ECB模式是不安全的(相同明文会生成相同密文),如果你的业务场景允许,建议后续升级为CBC或GCM模式(需要添加IV向量,更安全)。
内容的提问来源于stack exchange,提问作者Mahesh Mirase
相关产品推荐
相关产品推荐

