使用密码而不是密钥+ iv的pycrypto AES

时间:2017-09-25 21:09:47

标签: python cryptography

我需要将此JavaScript代码移植到Python:

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方法。

非常感谢!

2 个答案:

答案 0 :(得分: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')

可能这不是最佳选择,但它确实有效。

答案 1 :(得分: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]