可以通過標準的base64
模塊輕鬆處理基礎64編碼和解碼。
PyCrypto和M2Crypto均支持CBC模式下的AES-256解密和加密。
唯一的非標準(也是最困難的)部分是從密碼派生出IV和密鑰。 OpenSSL通過它自己的EVP_BytesToKey
函數來完成它,該函數被描述爲in this man page。
Python的當量是:
def EVP_BytesToKey(password, salt, key_len, iv_len):
"""
Derive the key and the IV from the given password and salt.
"""
from hashlib import md5
dtot = md5(password + salt).digest()
d = [ dtot ]
while len(dtot)<(iv_len+key_len):
d.append(md5(d[-1] + password + salt).digest())
dtot += d[-1]
return dtot[:key_len], dtot[key_len:key_len+iv_len]
key_len
哪裏是32和iv_len
是16 AES-256。該函數返回可用於解密有效負載的密鑰和IV。
OpenSSL提供並期望鹽在加密有效負載的前8個字節中。
最後,CBC模式下的AES只能處理與16字節邊界對齊的數據。使用的默認填充是PKCS#7。因此
用於加密的步驟如下:
- 生成8個字節的隨機數據作爲鹽。
- 使用步驟1中的鹽從密碼中導出AES密鑰和IV。
- 使用PKCS#7填充輸入數據。
- 加密使用AES-256在CBC模式下與該鍵並從步驟2以Base64的IV
- 編碼和輸出從第1步
- 編碼在Base64和輸出加密的從步驟數據中的鹽的填充4.
從解密的步驟是相反的:
- 解碼從Base64的所述輸入數據爲二進制字符串。
- 將解碼數據的前8個字節視爲鹽。使用鹽從步驟1
- 解密
- 派生AES密鑰和IV從密碼的剩餘使用AES密鑰和從步驟3
- 的IV驗證並從結果中刪除PKCS#7填充解碼數據。