2016-04-15 19 views
1

Ich bekomme die verschlüsselte Zeichenfolge zu pycrypto, aber es ergab ein falsches Ergebnis.Daten mit Python entschlüsseln, in PHP verschlüsseln

<?php 
define('MCRYPT_SECRET_KEY', '1d46a31baeab9cf69184d1f92ba5b9f8'); 
function decode($encode_str) { 
    $key = pack('H*',MCRYPT_SECRET_KEY); 
    //var_dump($key);echo "\n"; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ECB); 
    //var_dump($iv_size);echo "\n"; 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    //var_dump($iv);echo "\n"; 

    $encode_str = str_replace(['-', '_'], ['+', '/'], $encode_str); 
    $mod4 = strlen($encode_str) % 4 and $encode_str .= substr('====', $mod4); 
    //var_dump($encode_str);echo "\n"; 
    $decrypt = base64_decode($encode_str); 
    //var_dump($decrypt);echo "\n"; 
    $decrypt = mcrypt_decrypt(MCRYPT_3DES, $key, $decrypt, MCRYPT_MODE_ECB); 

    return $decrypt; 
} 
echo "aFOYNZB4Ye4 : ".decode("aFOYNZB4Ye4")."\n"; 

Ergebnis:

aFOYNZB4Ye4 : 13455 

aber wenn ich Python verwenden, konnte ich nicht das richtige Ergebnis bekommen.

# coding: utf-8 
import sys,os,base64 
from Crypto.Cipher import DES3 

key = "1d46a31baeab9cf69184d1f92ba5b9f8".decode("hex") 

def urlsafe_mcryptdecode(idstr): 
    try: 
     print len(key),key,'\n' 
     idstr = idstr.replace('-','+').replace('_','/') 
     mod4 = len(idstr) % 4 
     data=idstr+"===="[mod4:] 
     #print len(data),data,'\n' 
     base64_str = base64.b64decode(data) 
     #print len(base64_str),base64_str,'\n' 
     cipher = DES3.new(key, DES3.MODE_ECB) 
     id_ = cipher.decrypt(base64_str) 
     #print len(id_),id_,'\n' 
     return id_ 
    except Exception,e: 
     print "ERROR",e 
     return idstr+"#error" 

print urlsafe_mcryptdecode("aFOYNZB4Ye4") 

Ergebnis nicht 13455.

Vor der Entschlüsselung ist, ist jedes Ergebnis aller Ausgangs gleich. Was ist falsch an meinem Code? Vielen Dank.

+0

Dncrypt? necrypt? Meinst du entschlüsseln und verschlüsseln? –

+0

Entschuldigung, ein Fehler. –

+0

Wenn ich denselben Code verwende, ist das Ergebnis '\ x11 \ x88 \ xc7 \ x89 \ xd0Df \ x94'. – Francesco

Antwort

0

Das Problem ist, dass vor PHP 5.6.0 die Funktion mcrypt_decrypt() leise den Schlüssel puffert. Ihr Schlüssel ist 16 Byte, der Schlüssel muss jedoch 24 Byte sein und wird daher intern auf 24 Byte mit abschließenden NUL-Bytes aufgefüllt. Dies wird in der neueren PHP-Dokumentation für mcrypt_decrypt() erwähnt - siehe den Abschnitt Changelog.

Sie müssen dies berücksichtigen, wenn Sie in Python entschlüsseln. Sie können dies tun, indem anhängen NUL bis zum Ende des decodierten Schlüsselbytes mit ljust():

key = "1d46a31baeab9cf69184d1f92ba5b9f8".decode("hex").ljust(24, '\0') 

oder

key = "1d46a31baeab9cf69184d1f92ba5b9f8".decode("hex") + ('\0' * 8) 

Ich bemerkte, dass Ihr PHP-Code, um ein IV erzeugt, die es nicht verwenden. Das ist in Ordnung, es verursacht kein Problem, ich dachte nur, ich würde darauf hinweisen, falls du denkst, dass es benutzt wird.

Übrigens, wenn Sie PHP> = 5.6.0 verwenden, müssen Sie den Schlüssel explizit auffüllen oder einen 24-Byte-Schlüssel an erster Stelle verwenden. In Ihrem Code können Sie wie folgt pad:

$key = pack('H*x8', MCRYPT_SECRET_KEY); 

, die eine zusätzliche 8 NUL Bytes an das Ende des Schlüssels anhängen wird.

+0

Awesome.Thanks viel. –

Verwandte Themen