在現代加密中,AES(Advanced Encryption Standard)已經成為了最廣泛使用的塊密碼之一。然而,為了保證信息在加密過程中的安全性,需要使用正確的加密模式。CBC(Cipher Block Chaining)是一種流行的加密模式,它通過將前一個密文塊與當前明文塊進行XOR(異或)操作,使得每個密文塊都依賴于前一個密文塊,從而難以被攻擊者破解。
在PHP中,我們可以使用mcrypt擴展來實現CBC模式的AES加密。以下是一個簡單的示例:
function encrypt($data, $key, $iv) { $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($cipher, $key, $iv); $encrypted = mcrypt_generic($cipher, $data); mcrypt_generic_deinit($cipher); mcrypt_module_close($cipher); return base64_encode($encrypted); } $key = 'secretpassword'; $iv = 'randomivstring'; $data = 'This is some sensitive data.'; $encrypted = encrypt($data, $key, $iv); echo $encrypted; // 輸出加密后的密文
在上面的代碼中,我們使用了mcrypt_module_open函數打開了一個由Rijndael算法實現的128比特的加密模塊。然后,我們使用mcrypt_generic_init函數來初始化加密器,并使用mcrypt_generic函數對數據進行加密。最后,我們使用base64_encode函數將加密后的結果轉換成可打印的字符串并返回。
當我們嘗試解密這個密文時,我們需要使用與加密時相同的密鑰和向量。以下是一個解密函數的示例:
function decrypt($data, $key, $iv) { $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($cipher, $key, $iv); $decrypted = mdecrypt_generic($cipher, base64_decode($data)); mcrypt_generic_deinit($cipher); mcrypt_module_close($cipher); return trim($decrypted); } $decrypted = decrypt($encrypted, $key, $iv); echo $decrypted; // 輸出解密后的原始數據
解密函數與加密函數非常相似,唯一的區別是在mdecrypt_generic函數中我們傳遞了base64_decode函數處理過的密文。
需要注意的是,CBC模式需要一個隨機的向量來確保安全性。因此,每一次加密操作都需要使用一個新的向量。以下是一個產生隨機向量的示例代碼:
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
該代碼使用了mcrypt_create_iv函數生成了一個與加密算法及模式一致的隨機向量。使用MCRYPT_DEV_URANDOM指定了一個安全的隨機數發生器來生成隨機向量,這比使用mt_rand等其他隨機函數更加安全。
總之,CBC模式的AES加密可以很好地保護敏感信息,而PHP通過mcrypt擴展提供了方便的加密和解密函數。但是需要注意的是,為了避免安全問題,我們需要在每次加密操作時使用不同的隨機向量,同時使用足夠復雜的密鑰。