PHP使用OpenSSL实现AES加密的笔记
记录这两天遇到的一些问题,一开始主要是对一些概念理解的不清楚
比如AES是一种算法,而OpenSSL是一个扩展库,其中包含对AES算法的实现
当然在完全理解算法后可以自己实现,但可能会遇到很多问题,我会在以后进行尝试
目前在项目的使用中,还是使用扩展库的方法最快最简单
1,加密方法:
通用的单钥加密算法为DES(Data Encryption Standard),通用的双钥加密算法为RSA( Rivest-Shamir-Adleman),都产生于上个世纪70年代。
目前用AES来代替DES(都是单钥)。
我选择使用AES算法来进行加密。
2,简单了解AES:
AES 有三种算法,主要是对数据块的大小存在区别:
AES-128:需要提供 16 位的密钥
AES-192:需要提供 24 位的密钥
AES-256:需要提供 32 位的密钥
AES 是按数据块大小(128/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景,这时就需要填充数据长度到加密算法对应的数据块大小。
3,实现方式:
AES本质是算法,下面需要想办法实现。
在PHP中,如果不自己实现算法的话,有两种方式可以调用AES算法进行加密
一个是MCrypt,一个是OpenSSL
(PHP在7.2版本已经完全移除了MCrypt加密;PHP的OpenSSL扩展已经实现了AES加密算法,我们可以通过OpenSSL扩展提供的方法实现对数据的加密和解密)
我们选择OpenSSL
4,在PHP中加入OpenSSL扩展
因为还没有尝试Linux的OpenSSL安装,故这里只记录Window的成功安装方式。
步骤:
1: 首先检查php.ini中;extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘;', 如果不存在这行,那么添加extension=php_openssl.dll。
2: 讲php文件夹下的: php_openssl.dll, ssleay32.dll, libeay32.dll 3个文件拷贝到 WINDOWS\system32\ 文件夹下。(注:所在子目录可能有所不同)
3: 重启apache或者iis(iisreset /restart)
至此,openssl功能就开启了。
5,添加范例代码:
如下:(作者来自思否captainblue)
1 class AES_128_CW { 2 private $_iv = ''; 3 private $_secret = ''; 4 5 public function __construct($iv,$secret){ 6 $this->_iv = substr($iv.'0000000000000000', 0,16);//可以忽略这一步,只要你保证iv长度是16 7 $this->_secret = hash('md5',$secret,true); 8 } 9 10 public function decode($secretData){ 11 return openssl_decrypt(urldecode($secretData),'aes-128-cbc',$this->_secret,false,$this->_iv); 12 } 13 14 public function encode($data){ 15 return urlencode(openssl_encrypt($data,'aes-128-cbc',$this->_secret,false,$this->_iv)); 16 } 17 }
6,进行测试
本地环境PHP版本是5.6.9,phpstudy 8.1
就是这样
修改后可以将该类放入项目的扩展类库,进行公共使用,或是以中间件的方式进行通讯加密,以后更新这部分。