使用 pycrypto 進行對稱加密

Python 的內建加密功能目前僅限於雜湊。加密需要第二方模組,如 pycrypto 。例如,它提供 AES 演算法 ,該演算法被認為是對稱加密的現有技術。以下程式碼將使用密碼加密給定的訊息:

import hashlib
import math
import os

from Crypto.Cipher import AES

IV_SIZE = 16    # 128 bit, fixed for the AES algorithm
KEY_SIZE = 32   # 256 bit meaning AES-256, can also be 128 or 192 bits
SALT_SIZE = 16  # This size is arbitrary

cleartext = b'Lorem ipsum'
password = b'highly secure encryption password'
salt = os.urandom(SALT_SIZE)
derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                              dklen=IV_SIZE + KEY_SIZE)
iv = derived[0:IV_SIZE]
key = derived[IV_SIZE:]

encrypted = salt + AES.new(key, AES.MODE_CFB, iv).encrypt(cleartext)

AES 演算法採用三個引數:加密金鑰,初始化向量(IV)和要加密的實際訊息。如果你有一個隨機生成的 AES 金鑰,那麼你可以直接使用該金鑰,只生成一個隨機初始化向量。密碼短語不具有正確的大小,但也不建議直接使用密碼短語,因為它不是真正隨機的,因此具有相對較小的熵。相反,我們使用 PBKDF2 演算法內建實現從密碼生成 128 位初始化向量和 256 位加密金鑰。

注意隨機鹽對於每個加密的訊息具有不同的初始化向量和金鑰很重要。這尤其可以確保兩條相同的訊息不會產生相同的加密文字,但它也可以防止攻擊者重複使用另一個密碼加密的訊息猜測一個密碼的工作。該鹽必須與加密訊息一起儲存,以便匯出相同的初始化向量和用於解密的金鑰。

以下程式碼將再次解密我們的訊息:

salt = encrypted[0:SALT_SIZE]
derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                              dklen=IV_SIZE + KEY_SIZE)
iv = derived[0:IV_SIZE]
key = derived[IV_SIZE:]
cleartext = AES.new(key, AES.MODE_CFB, iv).decrypt(encrypted[SALT_SIZE:])