Lassen Sie mich Ihre Frage zu "Modi" beantworten. AES256 ist eine Art Blockchiffre . Als Eingabe werden ein 32-Byte- Schlüssel und eine 16-Byte-Zeichenfolge verwendet, die als Block bezeichnet werden, und es wird ein Block ausgegeben. Wir verwenden AES in einer Betriebsart, um zu verschlüsseln. Die obigen Lösungen schlagen die Verwendung von CBC vor, was ein Beispiel ist. Eine andere heißt CTR und ist etwas einfacher zu bedienen:
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)
Dies wird oft als AES-CTR bezeichnet. Ich würde zur Vorsicht bei der Verwendung von AES-CBC mit PyCrypto raten . Der Grund dafür ist, dass Sie das Auffüllschema angeben müssen , wie in den anderen angegebenen Lösungen dargestellt. Wenn Sie beim Auffüllen nicht sehr vorsichtig sind , gibt es im Allgemeinen Angriffe , die die Verschlüsselung vollständig aufheben!
Nun ist es wichtig zu beachten, dass der Schlüssel eine zufällige 32-Byte-Zeichenfolge sein muss . Ein Passwort reicht nicht aus. Normalerweise wird der Schlüssel wie folgt generiert:
# Nominal way to generate a fresh key. This calls the system's random number
# generator (RNG).
key1 = Random.new().read(key_bytes)
Ein Schlüssel kann auch aus einem Passwort abgeleitet werden :
# 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)
Einige der oben genannten Lösungen schlagen vor, SHA256 zum Ableiten des Schlüssels zu verwenden. Dies wird jedoch im Allgemeinen als schlechte kryptografische Praxis angesehen . Weitere Informationen zu den Betriebsarten finden Sie in Wikipedia .