Frage

Ich habe die folgende Funktion in Ruby, die ein bisschen von Daten dechiffriert:

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

Ich versuche, die genau die gleiche Sache in PHP zu tun, aber ich bin mir nicht sicher, was ich falsch mache. Hier ist, was ich habe:

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

Die Ausgabe endet gerade seinen Müll auf, nicht die Zeichenfolge, die ich suche. Ideen?

Und noch bevor wir beginnen, es zu MCRYPT_RIJNDAEL_256 Schalen scheint nicht helfen und nur bewirkt, dass es über die iv nicht beschweren, solange die Blockgröße zu sein. Ich glaube, 128 seit dieser Seite sagt, dass die 128/256 ist ein Hinweis auf die Blockgröße, nicht die Schlüsselgröße.

War es hilfreich?

Lösung 2

Es stellt sich heraus, dass es funktioniert gut, es ist nur, dass meine Testdaten waren schlecht. Die beiden Änderungen, die ich gemacht wurden pack() mit (bei caf Vorschlag) und Ablegen der Füllzeichen vom Ende.

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

Andere Tipps

Persönlich bin ich ein wenig verdächtig der homebrewed hex_to_str Funktion - warum nicht nur pack('H*', $key) verwenden

?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top