2012-11-09 57 views
0

今天我已經經歷了一個關於基本密碼學的速成課程,我想我不想發送一個清晰的IV,所以我用字符串對它進行了加密。用字符串加密IV並解密它?

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key1, $string, MCRYPT_MODE_CBC, $iv); 
$string = $iv.$encrypt; 
$encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $string, MCRYPT_MODE_ECB); 

$return = urlencode(base64_encode($encrypt)); 

和解密我這有,但它不工作

$encrypted = base64_decode(urldecode($_GET['password'])); 
$encrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key2, $encrypted, MCRYPT_MODE_ECB); 

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 

$iv = mb_strcut($encrypted, 0, $iv_size); 
$password = mb_strcut($encrypted, $iv_size); 

$password = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key1, $password, MCRYPT_MODE_CBC, $iv); 

有人能看到我的代碼問題,向我解釋什麼,我做錯了什麼?

+3

首先,絕對沒有理由加密IV。還有很多很好的理由不去創造你自己的密碼系統。 –

+1

加密IV實際上使其不太安全。另見http://crypto.stackexchange.com/questions/2280/why-is-the-iv-passed-in-the-clear-when-it-can-be-easily-encrypted –

+0

不明白什麼是downvote的意思是,人們是否試圖阻止需要幫助的人在SO上提問? @owlstead,感謝您的鏈接 – James

回答

4

你不需要加密你的IV,安全地發送它是明確的。通常它被預置在密文中。如果分析CBC模式的結構,則可以看到IV僅影響第一個密碼塊。第二個密碼塊的「IV」是第一個密碼塊,第三個密碼塊的「IV」是第二個密碼塊。任何攻擊者都已經知道每個密碼塊,所以他們已經知道了大部分「IV」。

CBC模式的安全性在於關鍵,而且只在關鍵中。具有密文和IV的攻擊者無法恢復密鑰,所以沒有必要額外的工作來加密IV。

+0

謝謝,這個清楚解釋的東西。 仍然不確定爲什麼我的代碼無法正常工作,但現在我知道這完全沒有必要 – James

1

我相信你需要寫:

$encrypted = base64_decode(urldecode($_GET['password'])); 

不是還有什麼在錯誤的順序進行解密。

+0

你是對的,那是錯誤的順序 – James

+0

這不是我在這裏看到的唯一問題......你的密鑰的大小是多少? – Baba

+0

密鑰大小如何? – James