2012-07-25 17 views
5

En el PHP documentation for mcrypt_get_iv_size se indica que el valor de retorno será igual a cero cuando la combinación modo de algoritmo/bloque no utiliza un IV:¿El mcrypt_get_iv_size de PHP realmente devuelve cero cuando el IV no es necesario?

devuelve el tamaño de la vector de inicialización (IV) en bytes. En caso de error, la función devuelve FALSE. Si se ignora el IV en la combinación de cifrado/modo especificada, se devuelve cero.

Cuando llamo a esta función con MCRYPT_DES como el algo y MCRYPT_MODE_ECB como el modo, devuelve 8 (ocho) en lugar del 0 esperado (cero).

Tengo entendido que ECB no usa ni puede usar un IV, por lo que espero que sea cero. ¿Es incorrecto, la documentación es incorrecta o me falta algo más?

El siguiente fragmento muestra el 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; 

Tenga en cuenta que no estoy realmente utilizando BCE para el cifrado en el mundo real, simplemente estoy tratando de encontrar una manera fiable para determinar si un arbitraria algo/mode requiere un IV. (Noté que la biblioteca mcrypt tiene una función "mcrypt_enc_mode_has_iv", pero no parece haber una función PHP equivalente).

Estoy usando PHP v5.3.12 con libmcrypt 2.5.8_1.

actualización con una posible solución:

En cuanto a la fuente libmcrypt parece como si mcrypt_enc_get_iv_size() siempre devuelve el tamaño de bloque para cualquier modo de cifrado de bloques, pero se cambia a "pedir" el algoritmo de flujo modos.

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

El mcrypt_get_algo_iv_size() llamada se desvía a la biblioteca del algoritmo de función() _mcrypt_get_algo_iv_size. Así que espero que esto signifique que si manejo el caso de ECB manualmente debería dar el resultado correcto para aquellos algoritmos que requieren un IV en el modo de transmisión.

Respuesta

1

Tiene usted razón, el BCE no utiliza una vía intravenosa, como también se señaló en el PHP documentation for mcrypt_get_iv_size:

Uno de los MCRYPT_MODE_modename constantes, o una de las siguientes cadenas: "BCE", "CBC "," cfb "," ofb "," nofb "o" transmisión ". El IV se ignora en modo ECB ya que este modo no lo requiere. Deberá tener el mismo IV (piense: punto de partida) tanto en las etapas de cifrado como de desencriptación, de lo contrario su encriptación fallará.

Por qué mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB) devuelve 8 es impar. Intencional o no, debes ignorarlo.

+1

Desafortunadamente, no puedo ignorarlo ya que ECB solo no es un indicador confiable de si se requiere o no una IV (en otros lugares de la documentación se indica que algunos sistemas de cifrado requieren un IV cuando se usa el modo de transmisión). Creo que presentaré un informe de fallas de PHP y veré si se inclinan a cambiar el código o la documentación :). Gracias por su respuesta. – jmalloc

+1

ECB como modo de bloque es un indicador confiable. Que use ECB para implementar otro modo no cambia este hecho. –

+1

Tenga en cuenta que estoy a favor de cambiar el resultado del método y/o la documentación, aunque optaría por devolver -1 para crear una situación de falla rápida. –

Cuestiones relacionadas