导航菜单
首页 > 网络编程 > PHP编程 » 正文

PHP7.1中使用openssl替换mcrypt的实例详解

后台-系统设置-扩展变量-手机广告位-内容正文顶部

 // 尾部包含若干个`\x00` 均可功输出true if ("string\x00" == "string") { // 用双引号可解析\x00 echo true; }

\x00填充后的示例:(请注意字符串的长度,由此可见用\x00填充会影响长度)

mcrypt自主填充

填充算法需以如下算法进行:

加入填充

/** * 填充算法 * @param string $source * @return string */ function addPKCS7Padding($source) { $source = trim($source); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = $block - (strlen($source) % $block); if ($pad <= $block) {  $char = chr($pad);  $source .= str_repeat($char, $pad); } return $source; }

加入填充后字符串实际上如下形式:

移除填充

 /** * 移去填充算法 * @param string $source * @return string */ function stripPKSC7Padding($source) { $source = trim($source); $char = substr($source, -1); $num = ord($char); if ($num == 62) return $source; $source = substr($source, 0, -$num); return $source; }

openssl默认填充

其默认方式与标准的mcrypt的自主填充方式一致,所以在第二个示例中,对于使用了如上的填充算法后, 可直接使用openssl_encrypt替换,不会产生兼容问题。填充后的加密字符串如下形式:

需注意的是在openssl_encrypt与openssl_decrypt中内置了填充与移除填充,所以直接使用即可,除非需自主实现填充,否则不需要考虑填充

openssl自主填充

openssl_encrypt提供了option参数以支持自主填充,但在查阅php源码中openssl的测试用例代码才找到正确用法:

 // if we want to manage our own padding $padded_data = https://www.jb51.net/article/$data . str_repeat(' ', 16 - (strlen($data) % 16)); $encrypted = openssl_encrypt($padded_data, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); $output = openssl_decrypt($encrypted, $method, $password, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); var_dump(rtrim($output));(备注:如上,OPENSSL_ZERO_PADDING 并非是为0填充的意思)

由此,我们就可以解释,在第一个示例中openssl_encrypt之前加入了自主点充\x00的代码原因了

从以上的加、解密针对填充逻辑不同,针对上文中的示例可以很好地解释:

示例1:

mcrypt加密时未使用填充,故以\x00进行了填充,所以在替换成openssl,需要自主实现\x00填充。

示例2:

mcrypt加密时使用了标准的填充,同时openssl的填充方式也为标准填充,故直接使用即可。

分析到这,可以发现,无论是何种填充策略都需注意在加密时加入填充,在解密时则必须要移除填充。至此,上文中示例中的填充相关则分析完成了,接下来我们再看看如何选择替换后的算法。

选择算法

在以上的示例中,有一个问题在于,mcrypt中的AES-128-CBC算法,在openssl中怎么替换成了AES_256?
关于这一点, 我也未找到合理的解释,查看源码一时半会也没找到原因(能力有限~),但通过以下资料,还是完成了功能

openssl 解密 mcrypt AES 数据不兼容问题

Convert mcrypt_generic to openssl_encrypt Ask Question

若是有同学找到原因,欢迎给我留言,谢谢。

总结

对于使用mcrypt AES 进行加密密的部分,若是在替换过程中问题, 可以从算法替换或填充这两方面着手考虑下。同时还是一必须满足的条件是根据不同的填充方式选择, 替换最重要的就要考虑兼容问题,保证替换后不发生任何改变。 虽然只是只是有细微的差别----尾部几个字符串的不同,但若是在多平台中同时进行修改也是一件麻烦事,但变动越少风险越小。

本文只是针对AES算法进行了简单说明,对于其他算法是否适用还有待研究。

以上所述是小编给大家介绍的PHP7.1中使用openssl替换mcrypt的实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

  • 升级 PHP7.1 后 openssl 解密 mcrypt AES 数据不兼容问题的处理方法
收藏此文 赞一个 ( ) 打赏本站

如果本文对你有所帮助请打赏本站

  • 打赏方法如下:
  • 支付宝打赏
    支付宝扫描打赏
    微信打赏
    微信扫描打赏
后台-系统设置-扩展变量-手机广告位-内容正文底部

相关推荐:

留言与评论(共有 0 条评论)
   
验证码:
二维码