Puedo utilizar la siguiente función para descifrar los datos en mi servidor:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}

He leído mucho acerca de la NO utilización del BCE sin embargo (y sé que está en desuso, así que quería cambiar a la CBC. Simplemente el cambio de modo:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND)));
}

no funciona sin embargo. No se generan errores, pero los datos devueltos todavía está cifrada.

Lo que me estoy perdiendo?

Código actualizado – aún con errores:

$key = "hello"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

function encrypt($key, $text) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}


function decrypt($key, $text) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}


$text = 12345;

echo "Plain Number : " . $text . "<br><br>";

$encrypted = encrypt($key, $text);
echo "AES Number : " . $encrypted . "<br><br>";

echo "Plain Number : ". decrypt($key, $encrypted) . "<br><br>";

esto debería funcionar – pero devuelve el error:

blocksize en

blocksize en> Advertencia: mcrypt_encrypt()

[función.mcrypt-cifrar]: El IV
el parámetro debe ser tan largo como el
blocksize inblocksize en

blocksize en

Es el regreso de los datos de la misma como lo que pasó? Si es así, entonces algo está mal con la función de descifrado. De lo contrario, funciona normalmente, y he usado la tecla equivocada/IV, y llegado basura.
B – sí, de hecho estoy ejecutando el cifrado y descifrado en la misma página, incluso, para asegurarse de que la información es buena pero me da errores. Voy a probar y ver algunas de las sugerencias que aparecen a continuación hacer una diferencia.

OriginalEl autor JM4 | 2010-11-10

3 Comentarios

  1. 5

    Su código actualizado, tiene un problema con $iv ser una variable global que no está disponible en las respectivas es-/decodificación de funciones:

    $key = "hello"; 
    
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);
    
    function encrypt($key, $text, $iv) {
        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
    }
    
    function decrypt($key, $text, $iv) { 
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
    }
    
    $text = 12345;
    
    echo "Plain Number : " . $text . "<br><br>";
    
    $encrypted = encrypt($key, $text, $iv);
    echo "AES Number : " . $encrypted . "<br><br>";
    
    echo "Plain Number : ". decrypt($key, $encrypted, $iv) . "<br><br>";

    O todavía se puede confiar en el mundial $iv por la importación de en el ámbito local de la función:

    function encrypt($key, $text) {
        global $iv; //or use $GLOBALS['iv] instead of $iv in the call below
        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
    }
    
    function decrypt($key, $text) { 
        global $iv; //or use $GLOBALS['iv] instead of $iv in the call below
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
    }

    pero seguramente esta no es una práctica recomendada como de las parejas de su código a variables globales.

    mcrypt_create_iv elimina la advertencia, pero parece ser horriblemente lento por alguna razón.
    No sé por qué, pero en mi Linux los sistemas de uso de MCRYPT_DEV_RANDOM para la llamada a mcrypt_create_iv tuvo un buen minuto. El uso de MCRYPT_DEV_URANDOM aunque es prácticamente instantánea, como sería de esperar.
    No hay duda de que este aviso específicamente en la VM. Esto es debido a VM no tener una decente fuente de entropía para /dev/random.

    OriginalEl autor Stefan Gehrig

  2. 7

    Al descifrar que usted necesita para utilizar el mismo IV como cuando cifrados. Parece que se está generando una nueva, al azar de la IV durante el descifrado.

    Es ACEPTAR para agregar o anteponer el IV del texto cifrado. IVs no son secretos, pero que debe ser única para cada mensaje cifrado y sólo se utiliza una vez.

    gracias por la ayuda – voy a tener que mirar hacia atrás en IVs pero en la realidad – ¿cuál es el propósito general de un IV, si usted ya está usando una clave para cifrar el archivo para comenzar con (probablemente su IV se almacenan en la misma ubicación que los datos en sí, que no está muy seguro si su servidor está comprometido.
    El IV está ahí para evitar estadística técnicas de criptoanálisis. No es un secreto así que no importa si se divulga. Utilizando una muestra aleatoria de IV para cada mensaje significa que si usted cifrar el mismo mensaje dos veces con la misma clave se obtienen diferentes ciphertexts. Eso significa que un intruso no puede buscar patrones en una secuencia de mensajes, incluso si sabe el IV para cada mensaje. Esto es importante, incluso si usted no es cifrar el mismo mensaje varias veces.
    hay una nueva edición anterior que todavía da errores, incluso cuando en la misma página.
    Hmm. No estoy seguro. Intente comprobar que mcrypt_get_iv_size devuelve el número de la derecha y que mcrypt_create_iv en realidad genera un IV de la longitud correcta. Podría ser que uno se informó en bits y el otro en bytes.
    $tamaño = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); devuelve 16

    OriginalEl autor Cameron Skinner

  3. 3

    Hizo cambiar el modo de cifrado de este texto así?

    También, cuando se utiliza MCRYPT_MODE_CBC, deberá utilizar la misma clave y IV, durante el cifrado y el descifrado. Aleatorizado IV no funciona con CBC.

    me hizo cambiar el modo de cifrar así; sin embargo, a su último punto de la ‘aleatorizado IV’ no trabajo – código de ejemplo en php.net parece que se indique lo contrario (aunque no uso tripledes como sistema de cifrado) : php.net/manual/en/function.mcrypt-cbc.php
    Creo que @Dan estaba diciendo que no se puede descifrar con cualquiera al azar de edad IV, debe ser el mismo que se utilizó para el cifrado. BCE no uso de una inyección INTRAVENOSA.
    nueva edición anterior.
    Tenga en cuenta que el IV para el modo ECB es cero, por lo que el IV creado para el BCE es una cadena vacía. De cualquier otro modo, el IV longitud es mayor que cero.

    OriginalEl autor Dan Grossman

Dejar respuesta

Please enter your comment!
Please enter your name here