• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php迁移Mcrypt至OpenSSL加密算法的详细介绍(代码示例)

php 搞代码 4年前 (2022-01-21) 16次浏览 已收录 0个评论

本篇文章给大家带来的内容是关于php迁移Mcrypt至OpenSSL加密算法的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇:Mcrypt 和 OpenSSL。

其中 Mcrypt 在 PHP 7.1.0 中被 Deprecated,在 PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密。

在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性。

下文

本文#来源gaodai.ma#com搞##代!^码7网
搞代gaodaima码

中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC 加解密,二者同步加解密的要点为:

1、使用何种填充算法。Mcrypt 自动使用 NUL("\\0"),OpenSSL 自动使用 PKCS7。
2、否对数据做了base64编码处理。Mcrypt 默认不使用 base64 编码(虽然我们很建议使用),OpenSSL 默认使用 base64编码。

协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密。

AES 概述

AES 是当前最为常用的安全对称加密算法,关于对称加密这里就不在阐述了。

AES 有三种算法,主要是对数据块的大小存在区别:
AES-128:需要提供 16 位的密钥 key
AES-192:需要提供 24 位的密钥 key
AES-256:需要提供 32 位的密钥 key

填充算法

AES 是按数据块大小(128/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景,这时就需要填充数据长度到加密算法对应的数据块大小。

主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐,OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码,所以建议开发中使用 PKCS7 对待加密数据进行填充,已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇,但使用 PKCS7 算法对数据进行了填充,这样在一定程度上亲和了 OpenSSL 加密算法)。

NUL("\0") 填充算法

Mcrypt 的默认填充算法。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "\0" 手动拼接也是可以的。

/** * NUL("\0")填充算法 * @param string $source * @return string */function addZeroPadding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC){    $source = trim($source);    // openssl 并没有提供加密cipher对应的数据块大小的api这点比较坑    $block = mcrypt_get_block_size($cipher, $mode);    $pad   = $block - (strlen($source) % $block);    if ($pad <= $block) {        // $source .= str_repeat("\0", $pad);//KISS写法        // pack 方法 a 模式使用 NUL("\0") 对内容进行填充  A 模式则使用空白字符填充        $source .= pack("a{$pad}", ""); //高端写法    }    return $source;}/** * NUL("\0")填充算法移除 * @param string $source * @return string */function stripZeroPadding($source){    return rtrim($source, "\0");}

PKCS7 填充算法

OpenSSL的默认填充算法。下面我们给出 PKCS7 填充算法 PHP 的实现:

/** * PKCS7填充算法 * @param string $source * @return string */function addPKCS7Padding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC){    $source = trim($source);    $block  = mcrypt_get_block_size($cipher, $mode);    $pad    = $block - (strlen($source) % $block);    if ($pad <= $block) {        $char = chr($pad);        $source .= str_repeat($char, $pad);    }    return $source;}/** * 移去PKCS7填充算法 * @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;}

Mcrypt


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php迁移Mcrypt至OpenSSL加密算法的详细介绍(代码示例)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址