Pregunta

Tengo la siguiente función en Ruby que descifra un poco de datos:

def decrypt(key, iv, cipher_hex)
    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')

    cipher.decrypt
    cipher.key = key.gsub(/(..)/){|h| h.hex.chr}
    cipher.iv = iv.gsub(/(..)/){|h| h.hex.chr}

    decrypted_data = cipher.update(cipher_hex.gsub(/(..)/){|h| h.hex.chr})
    decrypted_data << cipher.final

    return decrypted_data
end

Estoy tratando de hacer exactamente lo mismo en PHP, pero no estoy seguro de qué estoy haciendo mal. Esto es lo que tengo:

function decrypt_data($key, $iv, $cipher_hex) {
    return mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128, 
        hex_to_str($key), 
        hex_to_str($cipher_hex), 
        MCRYPT_MODE_CBC, 
        hex_to_str($iv)
    );
}

function hex_to_str($hex_str) {
    preg_match_all('/(..)/', $hex_str, $matches);

    $to_return = '';
    foreach ($matches[1] as $val)
        $to_return .= chr(hexdec($val));
    return $to_return;
}

La salida acaba siendo basura, no la cadena que estoy buscando. Ideas?

Y antes incluso de que comencemos, cambiarlo a MCRYPT_RIJNDAEL_256 no parece ayudar y solo hace que se queje de que el iv no sea tan largo como el tamaño del bloque. Creo que 128 es correcto en este caso ya que este sitio dice que el 128/256 es una indicación del tamaño del bloque, no del tamaño de la clave.

¿Fue útil?

Solución 2

Resulta que estaba funcionando bien, es solo que mis datos de prueba eran malos. Los dos cambios que hice fueron usar pack () (a sugerencia de caf) y soltar los caracteres de relleno desde el final.

function decrypt_data($key, $iv, $cipher_hex) {
    return rtrim(
        mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128, 
            pack('H*', $key), 
            pack('H*', $cipher_hex), 
            MCRYPT_MODE_CBC, 
            pack('H*', $iv)
        ), 
        "\x00..\x1F"
    );
}

Otros consejos

Personalmente, sospecho un poco de la función hex_to_str casera - ¿por qué no usar solo pack ('H *', $ key) ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top