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。其它值以及相互之间的区别,苏南大叔暂未研究,待测。
总结
这里的话题,比较偏门,苏南大叔就不更多深入展开了,大家如果感兴趣,请自行查阅相关文档。