2012-07-25 41 views
5

PHP documentation for mcrypt_get_iv_size中指出,返回值將是零,當算法/塊模式組合不使用IV:當IV不需要時,PHP的mcrypt_get_iv_size實際上會返回零嗎?

返回初始化向量(IV)的以字節爲單位的大小。錯誤時,函數返回FALSE。如果在指定的密碼/模式組合中忽略IV,則返回零。

當我使用MCRYPT_DES作爲算法和MCRYPT_MODE_ECB作爲模式調用此函數時,它將返回8(八)而不是期望的0(零)。

這是我的理解,歐洲央行沒有也不能使用IV,因此我期望零值。這是不正確的,是文檔不正確,還是我缺少別的東西?

下面的代碼演示了此問題:

<?php 
// I expect this call to return zero. 
$size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB); 
echo 'IV Size: ' . $size . PHP_EOL; 

請注意,我沒有實際使用ECB對現實世界的加密,我只是想找到一種可靠的方法來確定一個任意算法/模式需要IV。 (我注意到mcrypt庫有一個函數「mcrypt_enc_mode_has_iv」,但似乎沒有一個等效的PHP函數)。

我在使用PHP v5.3.12和libmcrypt 2.5.8_1。

更新與可能的解決方法:

看着它好像mcrypt_enc_get_iv_size()將始終返回任何塊加密模式的塊大小libmcrypt來源,但回落到「問」爲流算法模式。

int mcrypt_enc_get_iv_size(MCRYPT td) 
{ 
    if (mcrypt_enc_is_block_algorithm_mode(td) == 1) { 
     return mcrypt_enc_get_block_size(td); 
    } else { 
     return mcrypt_get_algo_iv_size(td); 
    } 
} 

的mcrypt_get_algo_iv_size()調用轉發到算法庫的_mcrypt_get_algo_iv_size()函數。所以希望這意味着如果我手動處理ECB的情況下,它應該爲那些需要IV流模式的算法產生正確的結果。

回答

1

你是對的,歐洲央行不使用IV,因爲它也是在PHP documentation for mcrypt_get_iv_size指出:

其中MCRYPT_MODE_modename常量,或下列字符串之一:「ECB」,「CBC 「,」cfb「,」ofb「,」nofb「或」stream「。 ECB模式中忽略IV,因爲此模式不需要它。您需要在加密和解密階段擁有相同的IV(認爲:起點),否則您的加密將失敗。

爲什麼mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB)返回8是奇數。故意與否,你應該忽視它。

+1

我不能簡單地忽略它,因爲單獨的ECB並不是一個可靠的指示器,是否需要IV(文檔中的其他地方指出某些密碼在使用流模式時需要IV)。我想我會提交一份PHP錯誤報告,看看他們是否傾向於更改代碼或文檔:)。謝謝您的回覆。 – jmalloc 2012-07-25 02:41:59

+1

歐洲央行作爲區塊模式是一個可靠的指標。你使用ECB來實現另一種模式並不會改變這個事實。 – 2012-07-25 07:49:41

+1

請注意,我全部都是爲了更改方法和/或文檔的結果,儘管我會選擇返回-1來創建快速失敗的情況。 – 2012-07-25 07:57:17

相關問題