2017-09-25 2 views
0

Ich brauche diesen JavaScript-Code zu Python zu portieren:PyCrypto AES mit Passwort anstelle Taste + iv

var decrypt = function (text, password){ 
    var decipher = crypto.createDecipher('aes-256-cbc',password); 
    var dec = decipher.update(text,'hex','utf8'); 
    dec += decipher.final('utf8'); 
    return dec; 
} 

Das Problem ist, dass die PyCrypto Bibliothek einen Schlüssel + IV und nicht nur ein Passwort benötigt, und ich don‘ Ich weiß, wie man die JavaScript-Methode crypto.createDecipher imitiert.

Vielen Dank!

+0

https://nodejs.org/api/crypto.html#crypto_crypto_createdecipher_algorithm_password_options: „Die Implementierung von crypto.createDecipher() leitet Tasten, um die OpenSSL-Funktion EVP_BytesToKey mit dem Digest-Algorithmus auf MD5, eine Iteration und kein Salt. "(Wenn Sie die Verschlüsselung stattdessen ändern können, sollten Sie dies wahrscheinlich wie in der gleichen Dokumentation empfohlen.) – Ryan

+0

Ich habe es gelesen, aber ich nicht weiß nicht, wie man es implementiert –

Antwort

0

Jetzt habe ich eine komplette Python 3 Lösung:

def decrypt(text, password): 
    key, iv = _evp_bytes_to_key(password, '', 32, 16) 
    decipher = AES.new(key, AES.MODE_CBC, iv) 
    return decipher.decrypt(bytes.fromhex(text.strip())).decode('utf8') 

def _evp_bytes_to_key(password, salt, key_len, iv_len): 
    dtot = hashlib.md5((password + salt).encode()).digest() 
    d = [dtot] 
    while len(dtot) < (iv_len + key_len): 
    d.append(hashlib.md5(d[-1] + (password + salt).encode()).digest()) 
    dtot = dtot + d[-1] 
    return dtot[:key_len], dtot[key_len:key_len+iv_len] 
0

Ok, eine mögliche Lösung ist eine Datei hat decrypt.js mit:

var crypto = require('crypto'); 
var decrypt = function (text, password){ 
    var decipher = crypto.createDecipher('aes-256-cbc',password); 
    var dec = decipher.update(text,'hex','utf8'); 
    dec += decipher.final('utf8'); 
    return dec; 
} 
console.log(decrypt(process.argv[2], process.argv[3])); 

Und in Ihrer Python-Datei verwenden, nur:

def decrypt(text, password): 
    p = subprocess.Popen(
     ['nodejs', 'decrypt.js', text, password], 
     stdout=subprocess.PIPE 
    ) 
    stdoutdata, stderrdata = p.communicate() 
    return stdoutdata.decode('utf8') 

Wahrscheinlich ist es nicht die beste Option, aber es funktioniert .

Verwandte Themen