2012-11-12 8 views
7

Ich habe meine Verschlüsselungsfunktion funktioniert ordnungsgemäß, aber ich kann nicht herausfinden, wie die Entschlüsselungsfunktion erhalten, um richtige Ausgabe zu geben.PHP Verschlüsseln/Entschlüsseln mit TripleDes, PKCS7 und ECB

Hier ist meine Verschlüsselungsfunktion:

function Encrypt($data, $secret) 
{  
    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    //Pad for PKCS7 
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = $blockSize - ($len % $blockSize); 
    $data .= str_repeat(chr($pad), $pad); 

    //Encrypt data 
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 

    return base64_encode($encData); 

} 

Hier ist meine decrypt Funktion:

function Decrypt($data, $secret) 
{ 
    $text = base64_decode($data); 

    $data = mcrypt_decrypt('tripledes', $secret, $text, 'ecb'); 

    $block = mcrypt_get_block_size('tripledes', 'ecb'); 
    $pad = ord($data[($len = strlen($data)) - 1]); 

    return substr($data, 0, strlen($data) - $pad); 
} 

Im Moment habe ich einen Schlüssel von test bin mit und ich versuche 1234567 zu verschlüsseln. Ich bekomme die Base64-Ausgabe von der Verschlüsselung, die ich suche, aber wenn ich entschlüsseln gehe, gibt es nichts zurück (eine leere Fläche).

Ich bin nicht sehr versierte Verschlüsselung/Entschlüsselung, so dass jede Hilfe sehr geschätzt wird !!

+2

Ich empfehle, 3DES durch AES, ECB mit CBC und MAC zu ersetzen. – CodesInChaos

+0

Vielen Dank für Ihre Empfehlung @CodesInChaos. Ich bin nicht in der Lage, die Besonderheiten wie diese zu ändern und muss verwenden, was ich habe, obwohl es wahrscheinlich weniger sicher ist. –

Antwort

14

Danke für alle, die sich mein Problem angesehen haben. Ich denke, ich habe es gelöst und hier ist meine vollständige Lösung. Hoffentlich hilft es jemand anderem, der ein ähnliches Problem hat:

function Encrypt($data, $secret) 
{  
    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    //Pad for PKCS7 
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = $blockSize - ($len % $blockSize); 
    $data .= str_repeat(chr($pad), $pad); 

    //Encrypt data 
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 

    return base64_encode($encData); 

} 

Und hier ist die neue Entschlüsselungsfunktion.

function Decrypt($data, $secret) 
{ 

    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    $data = base64_decode($data); 

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb'); 

    $block = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = ord($data[$len-1]); 

    return substr($data, 0, strlen($data) - $pad); 
} 

Ich hatte den gleichen Code zur Erzeugung des Schlüssels im richtigen Format hinzufügen, bevor ich die mycrypt_decrypt Funktion lief.

+1

Sehr hilfreich, danke! –

+1

Vielen Dank! –

+1

$ block wird niemals in der Decrypt-Funktion verwendet – omarjebari

Verwandte Themen