Pregunta

Tengo un fragmento de texto cifrado que necesito descifrar. Está encriptado con AES-256-CBC. Tengo el texto cifrado, la clave y iv. Sin embargo, no importa lo que intente, parece que no puedo hacer que funcione.

Internet ha sugerido que el cifrador Rijndael de mcrypt debería poder hacer esto, así que esto es 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 como está ahora, recibo 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 sería apreciada.

¿Fue útil?

Solución

No estoy muy familiarizado con estas cosas, pero parece que intentar MCRYPT_RIJNDAEL_256 en lugar de MCRYPT_RIJNDAEL_128 sería un próximo paso obvio ...

Editar: Tienes razón: esto no es lo que necesitas. MCRYPT_RIJNDAEL_128 es, de hecho, la elección correcta. Según el enlace que proporcionó, su clave y su IV son dos veces más largos 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';

Otros consejos

Te envío un ejemplo, Por favor, verifique 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top