我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在上文中,苏南大叔留了个伏笔,因为在最新的php73中,已经全面禁用了mcrypt系列函数。所以,问题来了,mcrypt.so的加密解密替代方案是什么呢?本文中,苏南大叔就说说mcrypt.so扩展加密解密的一个可能替代方案openssl

苏南大叔:php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案 - php-openssl-cipher
php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案(图3-1)

本文测试环境:centos/php72/libssl.soopenssl对于php来说,就是libssl.so扩展。这个扩展一般都是内置的。如果发生了一些奇怪的错误的话,请检查是否正确安装了libssl。这里有篇安装的教程,大家可以作为参考:

基础定义

由于前一篇文章中的两组数据都不是太符合要求,这里,苏南大叔启用的是新的一组数据。本文中的数据配置为:

$iv = "sunandebokeyumin";
$key = "newsn.net";
$str = "6aiSZrYlKpcSG1eZNghRig==";

对于本文中的AES-128-CBC来说,它要求$iv的长度是16位。所以对于一些人来说,把$key设置的长一些,然后把$iv设置为截取前16位,也是一个不错的主意。

$iv = substr($key, 0, 16);

openssl_decrypt解密

$_str = base64_decode($str);
$decrypted = openssl_decrypt($_str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if (!$decrypted) {
    //解密失败
} else {
    echo $decrypted;
}

苏南大叔:php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案 - openssl-cipher-code-1
php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案(图3-2)

openssl_encrypt加密

$encrypted = openssl_encrypt($str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if (!$encrypted) {
    //加密失败
} else {
    $encrypted = base64_encode($encrypted);
    echo $encrypted;
}

苏南大叔:php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案 - openssl-cipher-code-2
php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案(图3-3)

额外说明

$iv

对于AES-128-CBC来说,$iv的长度是16位。不过有很多不同的加密模式,每个模式的$iv长度都是不一致的。所以下面的代码仅供参考:

$ivlen = openssl_cipher_iv_length("AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);

base64

关于base64,主要是这些加密完的数据,对于程序员来说,是乱码。所以base64一下便于传输。

加密模式

加密模式其实有好多的,并不仅仅是一个AES-128-CBC。可以通过下面的途径,查看所有支持的加密模式:

var_dump(openssl_get_cipher_methods());

在苏南大叔的本次测试中,共有190种模式返回了。

OPENSSL_RAW_DATA

而关于OPENSSL_RAW_DATA,目前已知的是,还有一个兄弟值叫做OPENSSL_ZERO_PADDING。其它值以及相互之间的区别,苏南大叔暂未研究,待测。

总结

这里的话题,比较偏门,苏南大叔就不更多深入展开了,大家如果感兴趣,请自行查阅相关文档。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   openssl    rsa