Hãy để tôi giải quyết câu hỏi của bạn về "chế độ." AES256 là một loại mật mã khối . Phải mất như là đầu vào 32-byte chìa khóa và một chuỗi 16 byte, được gọi là khối và kết quả đầu ra một khối. Chúng tôi sử dụng AES trong chế độ hoạt động để mã hóa. Các giải pháp trên đề xuất sử dụng CBC, đây là một ví dụ. Một cái khác được gọi là CTR và nó có phần dễ sử dụng hơn:
from Crypto.Cipher import AES
from Crypto.Util import Counter
from Crypto import Random
# AES supports multiple key sizes: 16 (AES128), 24 (AES192), or 32 (AES256).
key_bytes = 32
# Takes as input a 32-byte key and an arbitrary-length plaintext and returns a
# pair (iv, ciphtertext). "iv" stands for initialization vector.
def encrypt(key, plaintext):
assert len(key) == key_bytes
# Choose a random, 16-byte IV.
iv = Random.new().read(AES.block_size)
# Convert the IV to a Python integer.
iv_int = int(binascii.hexlify(iv), 16)
# Create a new Counter object with IV = iv_int.
ctr = Counter.new(AES.block_size * 8, initial_value=iv_int)
# Create AES-CTR cipher.
aes = AES.new(key, AES.MODE_CTR, counter=ctr)
# Encrypt and return IV and ciphertext.
ciphertext = aes.encrypt(plaintext)
return (iv, ciphertext)
# Takes as input a 32-byte key, a 16-byte IV, and a ciphertext, and outputs the
# corresponding plaintext.
def decrypt(key, iv, ciphertext):
assert len(key) == key_bytes
# Initialize counter for decryption. iv should be the same as the output of
# encrypt().
iv_int = int(iv.encode('hex'), 16)
ctr = Counter.new(AES.block_size * 8, initial_value=iv_int)
# Create AES-CTR cipher.
aes = AES.new(key, AES.MODE_CTR, counter=ctr)
# Decrypt and return the plaintext.
plaintext = aes.decrypt(ciphertext)
return plaintext
(iv, ciphertext) = encrypt(key, 'hella')
print decrypt(key, iv, ciphertext)
Điều này thường được gọi là AES-CTR. Tôi sẽ khuyên bạn nên thận trọng khi sử dụng AES-CBC với PyCrypto . Lý do là nó yêu cầu bạn chỉ định sơ đồ đệm , như được minh họa bằng các giải pháp khác được đưa ra. Nói chung, nếu bạn không phải rất cẩn thận về đệm, có các cuộc tấn công mà hoàn toàn phá vỡ mã hóa!
Bây giờ, điều quan trọng cần lưu ý là khóa phải là một chuỗi 32 byte ngẫu nhiên ; một mật khẩu không đủ. Thông thường, khóa được tạo như vậy:
# Nominal way to generate a fresh key. This calls the system's random number
# generator (RNG).
key1 = Random.new().read(key_bytes)
Một khóa cũng có thể được lấy từ một mật khẩu :
# It's also possible to derive a key from a password, but it's important that
# the password have high entropy, meaning difficult to predict.
password = "This is a rather weak password."
# For added # security, we add a "salt", which increases the entropy.
#
# In this example, we use the same RNG to produce the salt that we used to
# produce key1.
salt_bytes = 8
salt = Random.new().read(salt_bytes)
# Stands for "Password-based key derivation function 2"
key2 = PBKDF2(password, salt, key_bytes)
Một số giải pháp ở trên đề xuất sử dụng SHA256 để lấy khóa, nhưng điều này thường được coi là thực hành mật mã xấu . Kiểm tra wikipedia để biết thêm về các chế độ hoạt động.