重要的是,除了 ecb 以外的所有加密模式都要求解密時使用的 IV 與加密時使用的 IV 相同。
您需要將金鑰 *和* IV 傳遞給解密函式。在解密程序中初始化新的 IV 將無法運作。
由於「您甚至可以將 [IV] 與密文一起傳送,而不會損失安全性」,一個很好的處理方式是將 IV 前置於密文。由於 IV 的寬度是固定的,因此您可以使用 mcrypt_get_iv_size() 和 substr() 輕鬆恢復 IV 和原始密文。
以下是一個範例
<?PHP
function my_encrypt($string,$key) {
srand((double) microtime() * 1000000); $key = md5($key); $td = mcrypt_module_open('des', '','cfb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
if (mcrypt_generic_init($td, $key, $iv) != -1) {
$c_t = mcrypt_generic($td, $string);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$c_t = $iv.$c_t;
return $c_t;
} }
function my_decrypt($string,$key) {
$key = md5($key); $td = mcrypt_module_open('des', '','cfb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = substr($string,0,$iv_size);
$string = substr($string,$iv_size);
if (mcrypt_generic_init($td, $key, $iv) != -1) {
$c_t = mdecrypt_generic($td, $string);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $c_t;
} }
?>