2011-02-24 17 views
17

He estado probando los diversos modes disponibles en la función mcrypt de PHP. BCE es el modo utilizado en la mayoría de los tutoriales, pero no se recomienda por tanto a la página enlazada y some users Así que creo que, o bien CBC o CFB debe hacer el truco.PHP: Mcrypt: ¿qué modo?

La documentación de PHP no es demasiado grasa en su comparación de los diferentes modos disponibles para mcrypt y en su lugar se refiere al libro de 'Applied Cryptography por Schneier, que no soy demasiado dispuestos a comprar por el momento.

Entonces, ¿cuál de los modos mcrypt quiero usar y por qué?

+1

no duplicado pero útil publicar http://stackoverflow.com/questions/2809855/which-php-mcrypt-cipher-is-safest Hola Kevin;) – kjy112

+0

Sí, sé que publicar, es mío, pero todavía extraño cualquier pros/contras de los diferentes modos que están disponibles para 'mcrypt'. ¿Por qué elegir _CBC_ sobre _CFC_? – Industrial

Respuesta

22

mcrypt efectivamente en marcha más modos de listed, puede utilizar los nombres de cadena para acceder a ellos:

  • cbc - CBC modo
  • cfb - 8-bits CFB modo;
  • ncfb - tamaño de bloque modo CFB;
  • nofb - modo OFB (no ofb);
  • ctr - CTR modo.

Los modos difieren en los detalles de implementación, por lo que su idoneidad depende de los datos y el entorno.

Relleno:

  • modo CBC sólo encripta bloques completos, por lo que su mcrypt almohadillas texto plano con cero bytes a menos que implemente su propio relleno.

  • CFB, OFB y CTR modos cifrar mensajes de cualquier longitud.

vector de inicialización:

  • CBC y CFB modos requiere una IV aleatorio (no utilice MCRYPT_RAND).

  • OFB modo simplemente requiere un único IV (por ejemplo, un contador global, tal vez la clave principal de la base de datos si las filas nunca se modifican o eliminan).

  • CTR requiere que cada bloque de contador es único (no sólo el IV del mensaje, que es el primer bloque contador, pero el resto, formado mediante el incremento del bloque de contador en 1 para cada bloque del mensaje) .

Más información en el NIST recommendations.

Hay diferencias en el rendimiento que deben ser poco importante en PHP, tales como si el cifrado o descifrado puede ser paralelizado y cuántas iteraciones de cifrado se utilizan por bloque (por lo general uno, pero 16 en 8 bits CFB modo).

Existen diferencias en malleability que no deberían ser importantes porque aplicará aplicando MAC.

Y puede haber diferencias en cuanto a su seguridad, pero para eso debe consultar un cryptographer.

+0

Gracias por la extensa respuesta @aaz! – Industrial

+1

@aaz - dices "(no uses MCRYPT_RAND)" ¿Puedo preguntar por qué? – buggedcom

+1

@buggedcom - La seguridad de estos modos depende de que el IV sea impredecible. 'MCRYPT_RAND' utiliza el generador de números aleatorios PHP, que puede o no satisfacer este requisito. Podría estar conectado a un hardware RNG, o podría devolver los dígitos de π. Pero puede verificar ['man 4 random'] (http://linux.die.net/man/4/random) en su sistema para ver que'/dev/random' está destinado a generar material criptográfico, y el valor predeterminado 'MCRYPT_DEV_RANDOM' usa eso. – aaz