Question

J'ai la fonction suivante dans Ruby qui déchiffre un peu de données:

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

J'essaie de faire exactement la même chose en PHP, mais je ne suis pas sûr de ce que je fais mal. Voici ce que j'ai:

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 sortie finit par être un déchet, pas la chaîne que je cherche. Des idées?

Et avant même de commencer, le basculer sur MCRYPT_RIJNDAEL_256 ne semble pas aider et le fait simplement se plaindre du fait que iv ne soit pas aussi long que la taille du bloc. Je pense que 128 est correct dans ce cas puisque ce site indique que le 128/256 est une indication de la taille du bloc, pas de la taille de la clé.

Était-ce utile?

La solution 2

Il s’avère que cela fonctionnait bien, c’est que mes données de test étaient mauvaises. Les deux modifications que j'ai apportées utilisaient pack () (sur suggestion de caf) et supprimaient les caractères de remplissage de la fin.

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"
    );
}

Autres conseils

Personnellement, je me méfie un peu de la fonction hex_to_str de l'homebrewed - pourquoi ne pas utiliser simplement pack ('H *', $ key) ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top