twofish tipos serpent por hacer encriptacion ejemplo como cifrado cbc bloques asimetrico algoritmos algoritmo php vector cryptography openssl

php - tipos - ¿Cómo generar de forma segura un IV para el cifrado AES CBC?



como hacer un algoritmo de cifrado (3)

Trabajo en algunas cosas crypto.

  • Uso AES 256 con modo CBC
  • Yo uso OPENSSL

Soy consciente de las siguientes cosas (fuente = wikipedia):

un vector de iniciación debe ser:

  • Único: no debe repetirse para ningún mensaje cifrado con una clave determinada
  • Impredecible: un atacante que observa cualquier número de mensajes y sus IV no deberían tener información para predecir el siguiente con probabilidad de éxito superior al 50% por bit (es decir, indistinguible del azar)

Mi pregunta es, ¿cómo generar de forma segura IV con OPENSSL y PHP? Sé que hay una funcionalidad semejante en lib mcrypt ( http://fr2.php.net/manual/fr/function.mcrypt-create-iv.php )

No encontré nada para hacer esto con OPENSSL (generando IV único e impredecible).


Puede usar openssl_random_pseudo_bytes (len, & crypto_stron) .

El primer parámetro es la longitud que desea en bytes. Si está utilizando esto para utilizarlo en uno de los métodos abiertos de SSL, puede usar la función openssl_cipher_iv_length (método) para obtener la longitud correcta del método utilizado.

El segundo parámetro, & crypto_strong, le permite pasar una variable booleana que se establecerá en verdadero o falso, dependiendo de si el algoritmo utilizado fue criptográficamente seguro. Luego puede verificar esta variable y manejarla correctamente si la variable vuelve a ser falsa. Nunca debería suceder, pero si lo hace, probablemente querrás saberlo.

Aquí hay un ejemplo de uso adecuado:

$method = ''aes-256-cbc''; $ivlen = openssl_cipher_iv_length($method); $isCryptoStrong = false; // Will be set to true by the function if the algorithm used was cryptographically secure $iv = openssl_random_pseudo_bytes($ivlen, $isCryptoStrong); if(!$isCryptoStrong) throw new Exception("Non-cryptographically strong algorithm used for iv generation. This IV is not safe to use.");

Para más información, ver:


Simplemente más cómodo de usar las mismas cosas que Thomas sujested:

private function genIv() { $efforts = 0; $maxEfforts = 50; $wasItSecure = false; do { $efforts+=1; $iv = openssl_random_pseudo_bytes(16, $wasItSecure); if($efforts == $maxEfforts){ throw new Exception(''Unable to genereate secure iv.''); break; } } while (!$wasItSecure); return $iv; }


Use openssl_random_pseudo_bytes (más preferiblemente con el segundo parámetro establecido en una variable existente, que luego debe probar que se estableció en TRUE ). Esto generará IVs con características de aleatoriedad apropiadas.

$wasItSecure = false; $iv = openssl_random_pseudo_bytes(16, $wasItSecure); if ($wasItSecure) { // We''re good to go! } else { // Insecure result. Fail closed, do not proceed. }

Alternativamente, PHP 7 ofrece random_bytes() que es mucho más simple.