php如何利用openssl加密解密AES-CBC数据?mcrypt替代方案
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在上文中,苏南大叔留了个伏笔,因为在最新的php73
中,已经全面禁用了mcrypt
系列函数。所以,问题来了,mcrypt.so
的加密解密替代方案是什么呢?本文中,苏南大叔就说说mcrypt.so
扩展加密解密的一个可能替代方案openssl
。
本文测试环境:centos
/php72
/libssl.so
。openssl
对于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;
}
openssl_encrypt
加密
$encrypted = openssl_encrypt($str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if (!$encrypted) {
//加密失败
} else {
$encrypted = base64_encode($encrypted);
echo $encrypted;
}
额外说明
$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
。其它值以及相互之间的区别,苏南大叔暂未研究,待测。
总结
这里的话题,比较偏门,苏南大叔就不更多深入展开了,大家如果感兴趣,请自行查阅相关文档。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。