2012-07-25 13 views
5

Nella PHP documentation for mcrypt_get_iv_size si precisa che il valore restituito sarà zero quando la combinazione modalità algoritmo/blocco non utilizza un IV:Il parametro mcrypt_get_iv_size di PHP restituisce effettivamente zero quando IV non è richiesto?

restituisce la dimensione del vettore di inizializzazione (IV) in byte. In caso di errore, la funzione restituisce FALSE. Se la IV viene ignorata nella combinazione di cifra/modalità specificata, viene restituito zero.

Quando chiamo questa funzione con MCRYPT_DES come algo e MCRYPT_MODE_ECB come modalità restituisce 8 (otto) anziché il previsto 0 (zero).

È a mia conoscenza che la BCE non utilizza e non può utilizzare un IV e quindi mi aspetto il valore zero. Non è corretto, la documentazione è errata o mi manca qualcos'altro?

Il seguente frammento illustra il problema:

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

prega di notare che non sto usando in realtà BCE per la crittografia del mondo reale, sto semplicemente cercando di trovare un modo affidabile per determinare se un arbitrario algo/mode richiede una IV. (Ho notato che la libreria mcrypt ha una funzione "mcrypt_enc_mode_has_iv", ma sembra che non ci sia una funzione PHP equivalente).

Sto usando PHP v5.3.12 con libmcrypt 2.5.8_1.

aggiornamento con possibile soluzione:

Guardando la fonte libmcrypt sembra come se mcrypt_enc_get_iv_size() sarà sempre restituire la dimensione del blocco per qualsiasi modalità cifrario a blocchi, ma ricade a "chiedere" l'algoritmo di flusso modalità.

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); 
    } 
} 

Il mcrypt_get_algo_iv_size() chiamata viene inoltrata a function() _mcrypt_get_algo_iv_size della biblioteca algoritmo. Quindi spero che questo significhi che se gestisco manualmente il caso della BCE, dovrebbe produrre il risultato corretto per quegli algoritmi che richiedono un IV in modalità streaming.

risposta

1

Hai ragione, BCE non fa uso di una flebo, come viene anche sottolineato nella PHP documentation for mcrypt_get_iv_size:

Uno dei MCRYPT_MODE_modename costanti, o di una delle seguenti stringhe: "BCE", "cbc "," cfb "," ofb "," nofb "o" stream ". L'IV viene ignorato in modalità ECB poiché questa modalità non lo richiede. Dovrai avere lo stesso IV (pensa: punto di partenza) sia a livello di crittografia che a livello di decodifica, altrimenti la crittografia fallirà.

Perché mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB) restituisce 8 è dispari. Intenzionale o no, dovresti ignorarlo.

+1

Purtroppo non posso ignorarlo sfortunatamente, poiché la sola ECB non è un indicatore affidabile della necessità o meno di una IV (altrove nella documentazione afferma che alcuni algoritmi richiedono una IV quando si utilizza la modalità stream). Penso che presenterò una segnalazione di bug in PHP e vedrò se sono inclini a cambiare il codice o la documentazione :). Grazie per la risposta. – jmalloc

+1

ECB come modalità di blocco è un indicatore affidabile. Che tu usi la BCE per implementare un'altra modalità non cambia questo fatto. –

+1

Nota che sono pronto a modificare il risultato del metodo e/o della documentazione, anche se opterei per restituire -1 per creare una situazione di fail fast. –

Problemi correlati