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


就是这样

修改后可以将该类放入项目的扩展类库,进行公共使用,或是以中间件的方式进行通讯加密,以后更新这部分。

posted @ 2020-04-03 10:12  景北斗  阅读(3613)  评论(0编辑  收藏  举报