Tamaño de clave vs. tamaño de bloque: en la práctica

4

He visto mucha confusión entre el tamaño de la clave de cifrado y el tamaño del bloque. Siento que entiendo completamente la diferencia entre los dos, no es necesario explicar cuáles son. Pero es cuando pongo en práctica que siento que los dos números se confunden.

Veamos el siguiente código de PHP ...

$encrypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$plaintext,MCRYPT_MODE_CBC,$iv);

... y suponga que $iv se ha creado de forma criptográfica segura.

Pregunta 1)

¿El MCRYPT_RIJNDAEL_128 define el tamaño de la clave o el tamaño del bloque?

Pregunta 2)

Si hubiéramos establecido la clave como:

$key={{eight cryptographically strong characters}};

¿El código anterior sería una implementación de cifrado de 64 bits, debido a la clave de ocho caracteres? ¿O sería una implementación de cifrado de 128 bits debido al MCRYPT_RIJNDAEL_128 ?

Pregunta 3)

Finalmente, si en cambio lo hacemos:

$key={{thirty-two cryptographically strong characters}};

¿Sería eso una implementación de cifrado de 256 bits, o aún un cifrado de 128 bits? Y si es de 128 bits, ¿eso significa que el algoritmo de cifrado recorta de alguna manera una clave de más de 128 bits?

    
pregunta rgbflawed 06.10.2014 - 04:59
fuente

2 respuestas

4
  1. Tamaño de clave. Todas las variantes de cifrado de Rijndale (aka. AES) operan en el texto simple de 128 bits a la vez.
  2. no Sus 64 bits de datos clave se expandirían a una clave de 128 bits, ya sea a través del relleno a cero o mediante una función de derivación de claves. No será tan fuerte como si hubieras proporcionado 128 bits de datos clave, pero eso es un asunto diferente.
  3. no Sus 256 bits de datos clave se reducirán a una clave de 128 bits, ya sea a través del truncamiento o mediante una función de derivación de clave. Como hay una clave de 128 bits que produce el mismo cifrado que sus 256 bits de datos clave, no obtiene ninguna seguridad.
respondido por el Mark 06.10.2014 - 05:09
fuente
4

Rijndael es una familia de nueve algoritmos criptográficos, que ofrece todas las combinaciones de tamaños de bloque y tamaño de clave en el conjunto de 128/192/256 bits. Los tres algoritmos con bloques de 128 bits (y claves de 128, 192 y 256 bits) se conocen colectivamente como AES . Las otras seis combinaciones han sido definidas por los autores de Rijndael, pero fueron mucho menos investigadas por los criptógrafos, ya que no eran parte del objetivo de la competencia AES.

Lo que representan las constantes MCRYPT_RIJNDAEL_* está mal documentado, por lo tanto, no está claro. Esta página de manual sobre una biblioteca llamada "mcrypt" indica que:

  

RIJNDAEL: Rijndael es un cifrado de bloque, diseñado por Joan Daemen y Vincent Rijmen, y fue aprobado para el Estándar de cifrado avanzado NIST de EE. UU., FIPS-197. El cifrado tiene una longitud de bloque variable y una longitud de clave. Rijndael se puede implementar de manera muy eficiente en una amplia gama de procesadores y en hardware. El diseño de Rijndael fue fuertemente influenciado por el diseño del bloque de cifrado Square. Existen tres versiones de este algoritmo, a saber: RIJNDAEL-128 (el ganador de AES), RIJNDAEL-192, RIJNDAEL-256 Los números 128, 192 y 256 representan la longitud del tamaño del bloque.

La última oración parece implicar que "128" sería el tamaño del bloque, no la longitud de la clave. Sin embargo, esto solo sería cierto en la medida en que el módulo mcrypt de PHP traduzca fielmente las convenciones de nomenclatura de la biblioteca de mcrypt subyacente, que no es un hecho.

En cualquier caso, la documentación para mcrypt_encrypt() establece que:

  

La clave con la que se cifrarán los datos. Si es más pequeño que el tamaño de clave requerido, se rellena con '\ 0'. Es mejor no usar cadenas ASCII para las claves.

Entonces, si solo proporciona 8 "caracteres fuertes", entonces estos caracteres se convierten de alguna manera a bytes (Rijndael no funciona con caracteres, funciona con bytes) de alguna manera no especificada, y si esto no produce suficientes bytes, luego se agregan bytes extra de valor 0. Lo que sucede si hay demasiados bytes no se especifica (el truncamiento es plausible, pero esto es PHP, cualquier cosa puede suceder).

Si realmente desea utilizar estas funciones , tendrá que realizar algunas pruebas, comparando los resultados de encriptación con lo que otra biblioteca mejor documentada produciría (en algún idioma donde los bytes son bytes, por ejemplo, C o Java). Entre las cosas a probar están:

  • Tamaño de bloque y longitud de clave.
  • Conversión de una cadena PHP en bytes (especialmente en presencia de caracteres no ASCII).
  • Comportamiento en la falta de coincidencia de la longitud de la clave (relleno, truncamiento, ...).

Confiar en una función de seguridad tan poco documentada es similar al paracaidismo sin verificar el paracaídas. Si, a la hora de abrir la bolsa, el paracaídas resulta ser la ropa de su semana, entonces tendrá unos segundos para reflexionar, mientras se cae libremente en medio de una nube de calcetines sucios en expansión, de lo que realmente debería haber sido más cauteloso. p>     

respondido por el Thomas Pornin 06.10.2014 - 15:01
fuente

Lea otras preguntas en las etiquetas