PHP OpenSSL擴充套件 對稱加密

2021-10-04 09:48:17 字數 2382 閱讀 6234

php 在進入7.x 時代後,預設就不再附帶mcrypt擴充套件,mcrypt將被openssl_* 一族函式所替代。所以,對於 phper 來說,有必要學習一下 php 的 openssl 擴充套件。

// 加密演算法

1. $encryptmethod = 'aes-256-cbc';

// 明文資料

2. $data = 'hello world';

// 生成iv

3. $ivlength = openssl_cipher_iv_length($encryptmethod);

4. $iv = openssl_random_pseudo_bytes($ivlength, $isstrong);

5. if (false === $iv && false === $isstrong)

// 加密

8. $encrypted = openssl_encrypt($data, $encryptmethod, 'secret', 0, $iv);

// 解密

9. $decrypted = openssl_decrypt($encrypted, $encryptmethod, 'secret', 0, $iv);

詳細解釋一下:

第 1 行 指定了加密演算法。比如這段**使用aes-256-cbc演算法加密。其實php的openssl擴充套件支援很多種加密演算法,想知道所有對稱加密演算法名稱列表,可以呼叫openssl_get_cipher_methods()函式,這會返回乙個陣列:

array(

0 => 'aes-128-cbc',

1 => 'aes-128-cbc-hmac-sha1',

...7 => 'aes-128-ecb',

...31 => 'bf-cbc',

200 => 'seed-ofb',

)

你會發現函式返回將近200種加密演算法,實際上沒有這麼多,許多只是因為大小寫不同而重複了,比如aes-128-cbcaes-128-cbc實際上是同一種加密演算法。如果去掉重複項,那麼 php 的 openssl 擴充套件支援大概100多種不同的加密演算法。

第 3 ~ 7 行生成了iv。為什麼要生成 iv,這個 iv 有什麼用?

回顧一下openssl_get_cipher_methods()返回的加密演算法列表,有很多名字中間帶有「cbc」字樣,這些加密演算法使用了同一種加密模式,也就是密碼分組鏈結模式(cipher block chaining)

cbc模式的加密演算法中,明文會被分成若干個組,以組為單位加密。每個組的加密過程,依賴他前乙個組的資料:需要跟前一組的資料進行異或操作後生成本組的密文。那麼最開頭的那個組又要依賴誰呢?依賴的就是 iv,所以這就是為什麼 iv 要叫初始化向量。iv是 初始化向量(initialization vector)的縮寫

iv應該是隨機生成的,所以**用到了openssl_random_pseudo_bytes()生成 iv。該函式接收乙個int,代表需要生成的 iv 的長度。

iv 長度隨加密演算法不同而不同。一般人是記不住那麼多演算法需要的 iv 長度的。所以直接使用openssl_cipher_iv_length()函式,這個函式返回乙個int,表示加密演算法需要的 iv 長度:

echo openssl_cipher_iv_length('aes-256-cbc'); // 16

echo openssl_cipher_iv_length('bc-cbc'); // 8

echo openssl_cipher_iv_length('aes-128-ecb'); // 0

比如 aes-256-cbc 需要16位的 iv、 bc-cbc 需要 8 位的 iv、而aes-128-ecb 不需要 iv,所以返回了 0。

第 8 ~ 9 行是加密和解密。分別使用了openssl_encrypt()openssl_decrypt()

這兩個函式除了第乙個引數不同,其餘引數都要保證相同才能順利解密。最後,在使用需要iv的加密演算法時,需要注意:

CentOS下php加擴充套件功能

首先使mcrypt軟體能夠執行,然後安裝php擴充套件模組,並在php.ini配置。這裡注意的是mcrypt軟體依賴libmcrypt和mhash兩個庫,所以安裝配置順序從右至左 libmcrypt libmcrypt 2.5.8.tar.gz mcrypt mcrypt 2.6.8.tar.gz ...

前端 使用 crypto js 對資料進行對稱加密

from 傳送門 crypto js github demo1 載入核心加密庫 var cryptojs require crypto js 載入des演算法 var tripledes require crypto js tripledes 開始加密,並且返回密文 var ciphertext t...

php使用mcript擴充套件實現對稱加密

1.對稱加密主要利用相同的金鑰來實現,而非對稱加密利用公鑰和私鑰來加密,比較而言對稱加密速度快,但是安全性要低 為什麼使用base64 encode 主要是用於傳參,直接加密完成後不是我們能理解的字串,也就是大家所說的亂碼 2.進行加密 使用mcript擴充套件,des型別 關鍵點在於 key ke...