2017-09-25 102 views
0

我需要移植這段JavaScript代碼到Python:pycrypto AES與密碼,而不是鍵+ 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; 
} 

的問題是,PyCrypto庫需要一個鍵+ IV,而不僅僅是一個密碼,我不不知道如何模仿JavaScript的方法crypto.createDecipher

非常感謝!

+0

https://nodejs.org/api/crypto.html#crypto_crypto_createdecipher_algorithm_password_options:「crypto.createDecipher(的實現)派生使用OpenSSL的功能鍵EVP_BytesToKey與摘要算法設置爲MD5,一次迭代,並沒有鹽「(如果你能夠改變加密,你應該這樣做,因爲建議在同一文件。) – Ryan

+0

我試了一下,但我不不知道如何實現它D: –

回答

0

現在我有一個完整的Python 3溶液:

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

好吧,一個可能的解決方案是有一個文件與decrypt.js:

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])); 

而在你的Python文件只需使用:

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

也許它不是最好的選擇,但它的工作原理。