Domanda

Ho la seguente funzione in Ruby che decodifica un po 'di dati:

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

Sto cercando di fare esattamente la stessa cosa in PHP, ma non sono sicuro di cosa sto facendo di sbagliato. Ecco cosa ho:

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

L'output finisce per essere spazzatura, non la stringa che sto cercando. Idee?

E prima ancora di iniziare, cambiarlo in MCRYPT_RIJNDAEL_256 non sembra essere d'aiuto e causa solo una lamentela sul fatto che la iv non sia lunga quanto la dimensione del blocco. Credo che 128 sia corretto in questo caso poiché questo sito afferma che 128/256 è un'indicazione della dimensione del blocco, non della dimensione della chiave.

È stato utile?

Soluzione 2

Si è scoperto che funzionava bene, è solo che i miei dati di test erano cattivi. Le due modifiche che ho apportato sono state usando pack () (su suggerimento di caf) e lasciando cadere i caratteri di riempimento dalla fine.

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

Altri suggerimenti

Personalmente sono un po 'sospettoso della funzione hex_to_str fatta in casa - perché non usare semplicemente il pacchetto (' H * ', $ chiave) ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top