OpenSSL为AES加密提供了一种流行的(但不安全 - 见下文!)命令行界面:
openssl aes-256-cbc -salt -in filename -out filename.enc
Python以PyCrypto包的形式支持AES,但它只提供工具。如何使用Python / PyCrypto解密使用OpenSSL加密的文件?
注意
此问题过去也涉及使用相同方案的Python加密。我已经删除了那部分以阻止任何人使用它。不要以这种方式加密任何数据,因为它不符合今天的标准。你应该只使用解密,除了后向兼容性之外没有其他原因,即当你别无选择时。想要加密?如果可能的话,使用NaCl / libsodium。
解决方案
鉴于Python的普及,起初我很失望,没有完整的答案可以找到这个问题。我花了相当多的时间在这个板上阅读不同的答案,以及其他资源,以使其正确。我想我可能会分享结果以供将来参考,或许可以复习; 我绝不是加密专家!但是,下面的代码似乎无缝地工作:
from hashlib import md5from Crypto.Cipher import AESfrom Crypto import Randomdef derive_key_and_iv(password, salt, key_length, iv_length): d = d_i = '' while len(d) < key_length + iv_length: d_i = md5(d_i + password + salt).digest() d += d_i return d[:key_length], d[key_length:key_length+iv_length]def decrypt(in_file, out_file, password, key_length=32): bs = AES.block_size salt = in_file.read(bs)[len('Salted__'):] key, iv = derive_key_and_iv(password, salt, key_length, bs) cipher = AES.new(key, AES.MODE_CBC, iv) next_chunk = '' finished = False while not finished: chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs)) if len(next_chunk) == 0: padding_length = ord(chunk[-1]) chunk = chunk[:-padding_length] finished = True
用法:
with open(in_filename, 'rb') as in_file, open(out_filename, 'wb') as out_file: decrypt(in_file, out_file, password)
如果您认为有机会对此进行改进或将其扩展为更灵活(例如,使其无盐工作,或提供Python 3兼容性),请随意这样做。
注意
这个答案过去也涉及使用相同方案的Python加密。我已经删除了那部分以阻止任何人使用它。不要以这种方式加密任何数据,因为它不符合今天的标准。你应该只使用解密,除了后向兼容性之外没有其他原因,即当你别无选择时。想要加密?如果可能的话,使用NaCl / libsodium。
最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。