Longitud de la clave de cifrado frente a bits de cifrado

4

Estoy tratando de agregar funcionalidad de cifrado a un script PHP, modelado en una aplicación C # existente.

La aplicación C # usa el algoritmo Rijndael con el constructor predeterminado. A partir de esto, puedo determinar que tiene un tamaño de clave de 256 y un tamaño de bloque de 128.

No estoy seguro de seleccionar el cifrado adecuado para la función mcrypt de php. La lista de cifrados muestra:

MCRYPT_RIJNDAEL_128
MCRYPT_RIJNDAEL_192
MCRYPT_RIJNDAEL_256

Pero no estoy seguro de si el número final se refiere a la longitud de la clave, el número de bits utilizados en el cifrado o si esos son uno en el mismo.

¿Qué cifrado debo usar para coincidir con la funcionalidad existente? Cuando intento 256 me sale el error "The IV parameter must be as long as the blocksize" . Si intento 128, las claves resultantes no coinciden (aunque sospecho que esto sigue siendo un error con algo distinto a la selección de cifrado).

Perdón por la naturaleza básica de la pregunta, ayudaría tener alguna explicación laica.

    
pregunta JYelton 26.01.2012 - 19:43
fuente

1 respuesta

3

Rijndael es un cifrado de bloques versátil que puede trabajar con bloques de tamaño 128, 192 o 256 bits, y con claves de 128, 192 o 256 bits. Las nueve combinaciones son posibles.

En 2001, como parte de una competencia abierta que duró tres años, Rijndael fue elegido para convertirse en el "Estándar de encriptación avanzada" federal de los EE. UU., también conocido como AES; Pero solo con un tamaño de bloque de 128 bits. Así que hay exactamente tres versiones de AES, todas con un tamaño de bloque de 128 bits y con claves de 128, 192 o 256 bits.

Por lo tanto, mientras Rijndael admite formalmente bloques de 192 o 256 bits, rara vez se usa de esa manera; por lo tanto, es altamente plausible que MCRYPT_RIJNDAEL_256 realmente significa "Rijndael con un tamaño de bloque de 128 bits y una clave de 256 bits (también conocida como 'AES-256')".

El Vector de inicialización (IV) es un dato que debe usarse como parámetro para el modo de cifrado; en su código, parece que usa CBC, por lo que el IV debe tener la misma longitud que el tamaño del bloque (128 bits, también conocido como 16 bytes).

Veo que estás intentando usar PBKDF1. Esta es una antigua función de derivación de claves que está limitada de varias maneras, incluida su incapacidad para generar más de 20 bytes. Tendrá dificultades para obtener 32 bytes de la clave y 16 bytes de IV ouf de PBKDF1 ... Le sugiero que cambie a PBKDF2, también definido en RFC 2898 , implementado en C # por Rfc2898DeriveBytes , y que puede generar tantos bytes como sea necesario.

Tenga en cuenta que PBKDF2 (y PBKDF1, para el caso) utilizan algunos parámetros configurables, como un "recuento de iteraciones", o el nombre de la función hash subyacente. Debes tener cuidado de usar los mismos parámetros exactos en el código PHP y en el código C #, de lo contrario no obtendrás las mismas claves y IV, y el descifrado fallará.

    
respondido por el Thomas Pornin 26.01.2012 - 20:43
fuente

Lea otras preguntas en las etiquetas