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”即可領取。