Tengo el cifrado de los bits de texto que tengo que descifrar. Se cifra con AES-256-CBC. Tengo el texto cifrado, clave, y iv. Sin embargo, no importa lo que yo trato me parece que no puede conseguir que funcione.

El internet se ha sugerido que mcrypt del Rijndael cypher debe ser capaz de hacer esto, así que aquí está lo que tengo ahora:

function decrypt_data($data, $iv, $key) {
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    //initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
        //decrypt
        $decrypted = mdecrypt_generic($cypher, $data);

        //clean up
        mcrypt_generic_deinit($cypher);
        mcrypt_module_close($cypher);

        return $decrypted;
    }

    return false;
}

Tal y como está ahora tengo 2 advertencias y el resultado es un galimatías:

Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Key size too large; supplied length: 64, max: 32 in /var/www/includes/function.decrypt_data.php on line 8
Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Iv size incorrect; supplied length: 32, needed: 16 in /var/www/includes/function.decrypt_data.php on line 8

Cualquier ayuda se agradece.

OriginalEl autor Jeremy Logan | 2009-10-27

2 Comentarios

  1. 6

    No estoy muy familiarizado con estas cosas, pero parece que tratando de MCRYPT_RIJNDAEL_256 en lugar de MCRYPT_RIJNDAEL_128 sería un siguiente paso obvio…

    Edición: tienes razón-esto no es lo que usted necesita. MCRYPT_RIJNDAEL_128 es de hecho la elección correcta. Según el enlace que proporcionó su clave y IV es el doble de largo de lo que deberían ser:

    //How do you do 256-bit AES encryption in PHP vs. 128-bit AES encryption???
    //The answer is:  Give it a key that's 32 bytes long as opposed to 16 bytes long.
    //For example:
    $key256 = '12345678901234561234567890123456';
    $key128 = '1234567890123456';
    
    //Here's our 128-bit IV which is used for both 256-bit and 128-bit keys.
    $iv =  '1234567890123456';
    Sí, lo he probado. De acuerdo a la chilkatsoft.com/p/php_aes.asp que es el tamaño de bloque, no el tamaño de la clave.
    Buena captura. El enlace que usted siempre tiene la respuesta a su pregunta: Usted tiene que proporcionar un 32 bytes de la clave, y una de 16 bytes IV. Que está pasando en los valores que son dos veces tan de largo como se necesite.
    Resulta que el se hexadecimal codificado y sólo necesitan para ser ejecutado a través de pack('H*', $var).
    Lo siento por sonar tonto, pero ¿qué es exactamente lo que usted pack() ? He estado tratando de hacer esto por mí mismo, sin ninguna suerte..
    Utilice pack() para convertir la representación Hexadecimal a binario real 128/256 bits de la representación.

    OriginalEl autor Frank Farmer

  2. 1

    Puedo enviar a usted un ejemplo,
    Por favor, compruebe el código, ok

    $data_to_encrypt = "2~1~000024~0910~20130723092446~T~00002000~USD~F~375019001012120~0~0~00000000000~";
    $key128 = "abcdef0123456789abcdef0123456789";
    $iv = "0000000000000000";
    
    $cc = $data_to_encrypt;
    $key = $key128;
    $iv =  $iv;
    $length = strlen($cc);
    
    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc','');
    
    mcrypt_generic_init($cipher, $key, $iv);
    $encrypted = base64_encode(mcrypt_generic($cipher,$cc));
    mcrypt_generic_deinit($cipher);
    
    mcrypt_generic_init($cipher, $key, $iv);
    $decrypted = mdecrypt_generic($cipher,base64_decode($encrypted));
    mcrypt_generic_deinit($cipher);
    
    echo "encrypted: " . $encrypted;
    echo "<br/>";
    echo "length:".strlen($encrypted);
    echo "<br/>";
    echo "decrypted: " . substr($decrypted, 0, $length);
    Trabajó para mí! La única sugerencia que tengo es el uso de rtrim en lugar de substr para el texto descifrado ya que puede que no siempre se sabe la longitud. rtrim($descifrar, «\0»)

    OriginalEl autor Aron Elias Herrera Ponte

Dejar respuesta

Please enter your comment!
Please enter your name here