2017-09-25 50 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') 

也许它不是最好的选择,但它的工作原理。