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


就是這樣

修改后可以將該類放入項目的擴展類庫,進行公共使用,或是以中間件的方式進行通訊加密,以后更新這部分。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM