今天我們來講一下PHP中的AES CBC加解密算法。這個算法是目前比較實用的加解密算法,廣泛應用于各種場景中,比如HTTP、TCP等通信協議中的安全保障,以及加密存儲敏感數據等等。
AES CBC算法是密鑰加密,使用相同密鑰可以加密和解密。CBC是加密模式的一種,是常見的對稱加密模式之一,循環密碼塊鏈模式(Cipher Block Chaining),每一塊數據會和前一塊加密后的密文做異或操作,保證了相同的原始明文,加密后產生的密文也是不同的。這樣可以提高加密的安全性。
這里我們給出一個簡單的例子。假設我們有一段文本需要加密,這段文本內容是“Hello, World!”,我們使用密鑰“1234567890123456”進行加密。PHP中可以使用openssl_encrypt函數進行加密,代碼如下:
$key = '1234567890123456'; $plaintext = 'Hello, World!'; $ivlen = openssl_cipher_iv_length('aes-256-cbc'); $iv = openssl_random_pseudo_bytes($ivlen); $ciphertext_raw = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); $hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true); $ciphertext = base64_encode($iv.$hmac.$ciphertext_raw); echo $ciphertext;
上面代碼中,$key是我們自定義的密鑰,$plaintext是需要加密的明文,使用openssl_cipher_iv_length函數可以獲取加密算法需要的向量長度,在CBC模式中,向量的長度通常為16字節。使用openssl_random_pseudo_bytes函數生成初始向量iv。使用openssl_encrypt函數進行加密,并將加密后的密文進行Base64編碼。在最后還使用哈希函數生成一個消息驗證碼,保證了密文在傳輸和存儲過程中數據的完整性,防止數據被篡改。
如果我們需要將密文解密成明文,則使用openssl_decrypt函數。解密過程與加密過程是相反的,代碼如下:
$ciphertext = '...'; // 這里填寫加密后的密文 $key = '1234567890123456'; $ciphertext = base64_decode($ciphertext); $ivlen = openssl_cipher_iv_length('aes-256-cbc'); $iv = substr($ciphertext, 0, $ivlen); $hmac = substr($ciphertext, $ivlen, $sha2len=32); $ciphertext_raw = substr($ciphertext, $ivlen+$sha2len); $original_plaintext = openssl_decrypt($ciphertext_raw, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true); if ($hmac !== $calcmac) { // 判斷消息驗證碼是否相同 die('Message authentication failed'); } echo $original_plaintext;
上面代碼中,$ciphertext是我們需要解密的密文,$key是密鑰。使用base64_decode函數將密文進行解碼,然后獲取初始向量iv以及消息驗證碼hmac。使用openssl_decrypt函數進行解密,得到原始明文。最后使用哈希函數生成消息驗證碼calcmac并進行對比,如果不相同則說明消息被篡改,否則輸出解密后的明文。
總之,AES CBC加解密算法在PHP中使用非常方便,只需要幾行代碼就可以實現加解密的功能。在實際應用中,需要注意保護好密鑰,以及使用合適的加密模式進行加密。同時,在傳輸和存儲過程中需要保證密文的完整性,防止數據被篡改,提高安全性。