Frage

Ich habe einen verschlüsselten Text, in 3DES-CBC-Modus verschlüsselt, und ich einige Probleme, es zu entschlüsseln. Ich habe die folgenden Informationen (nicht Istwerte):

<?php
// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

// The initialisation vector
$ivec = '0102030405060708';

// A token which looks something like this
$token = '2ad82e09e3b4e7c491e4bb9fb7c606e1';
?>

ich anhand meiner Entschlüsselungsfunktion aus der PHP-Klasse, die in diese Blog-Post . Es sieht wie folgt aus:

<?php
function decrypt($key,$iv,$token) {
    $td = mcrypt_module_open('tripledes', '', 'cbc', ''); 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td)); 
    $expected_key_size = mcrypt_enc_get_key_size($td); 

    $key = substr(md5($key), 0, $expected_key_size); 
    mcrypt_generic_init($td, $key, $iv);

    $decrypted_string = trim(mdecrypt_generic($td, base64_decode($token)));

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $decrypted_string;
}
?>

Allerdings bin ich mir nicht sicher, wie die drei Tasten in den Algorithmus zu füttern. Ich habe versucht, sie zusammen wie so Verkettungs:... $ Key1 $ key2 $ key3 und in umgekehrter Reihenfolge, aber ohne Erfolg

Jede mögliche Hilfe würde geschätzt.

War es hilfreich?

Lösung

// Drei 16 Zeichen lange Tasten
$ expected_key_size 24, 3 * 8. Die Tasten sind am ehesten im Hex-Format.

function foo($hex) {
    $rv = '';
    foreach(str_split($hex, 2) as $b) {
        $rv .= chr(hexdec($b));
    }
    return $rv;
}

// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

$key = foo($key1.$key2.$key3);

Andere Tipps

fand ich das Problem mit der Funktion am Ende. Es war eine Kombination aus dem Schlüssel-Umwandlung, IVEC und Token von Hex, den MD5-Hash des Entschlüsselungsschlüssels zu entfernen und die Base64-Decodierung des resultierenden Klartexts zu entfernen.

Das Füllzeichen, die im Klartext in Folge war ein wenig seltsam, aber das ist mit rtrim abgestreift (). Es kann auch sein bemerkenswert, dass die Verschlüsselung zunächst in JSP mit einigen Standard-Java-Bibliotheken gemacht wurde, so könnte dies für alle anderen von Java Encryption → PHP Decryption gehen nützlich sein.

Danke für Ihre Hilfe VolkerK, hier ist die Funktion I (einschließlich Ihrer Hex-Funktion, die ich nicht unter hinzugefügt habe) am Ende mit:

$algorithm = 'tripledes';
$key   = 'F123ACA...'; // Some hex key
$ivec  = 'FE12FA1...'; // Some hex ivec
$token = 'F2ACE12...'; // Some hex token
$mode  = 'cbc';

$key    = foo($key);
$ivec   = foo($ivec);
$token  = foo($token);

function decrypt($key,$iv,$algorithm,$mode,$token) {
    $td = mcrypt_module_open($algorithm, '', $mode, '') ; 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));

    $expected_key_size = mcrypt_enc_get_key_size($td); 
    $key = substr($key, 0, $expected_key_size); 

    mcrypt_generic_init($td, $key, $iv);

    $response = rtrim(mdecrypt_generic($td, $token), '');

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $response;
}

$plaintext = decrypt($key,$ivec,$algorithm,$mode,$token);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top