Permítanme abordar pregunta sobre "modos". AES256 es un tipo de cifra de bloque. Toma como entrada un de 32 bytes clave y una cadena de 16 bytes, llamada bloque y emite un bloque. Usamos AES en un modo de operación para encriptar. Las soluciones anteriores sugieren el uso de CBC, que es un ejemplo. Otro se llama CTR, y es un poco más fácil de usar:
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)
Esto se refiere a menudo como AES-CTR. Aconsejo precaución al usar AES-CBC con PyCrypto. La razón es que requiere que especifique el esquema de relleno , como se ejemplifica con las otras soluciones proporcionadas. En general, si no está muy teniendo cuidado con el relleno, hay attacks que rompen completamente el cifrado.
Ahora, es importante tener en cuenta que la clave debe ser un al azar, de 32 bytes cadena; una contraseña no es suficiente.Normalmente, la clave se genera de este modo:
# Nominal way to generate a fresh key. This calls the system's random number
# generator (RNG).
key1 = Random.new().read(key_bytes)
Una clave puede ser deriva de una contraseña, también:
# 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)
Algunas soluciones anteriores sugieren utilizando SHA256 para derivar la clave, pero esto es generalmente considerado bad cryptographic practice. Consulte wikipedia para obtener más información sobre los modos de operación.
[os.urandom] (http://docs.python.org/3/library/os.html) está _ incentivado_ en [PyCrypto] (https://www.dlitz.net/software/pycrypto/) sitio web. Utiliza [CryptGenRandom] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942 (v = vs.85) .aspx) de Microsoft es una función que [CSPRNG] (http: // en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator) –
o '/ dev/urandom' en Unix –
Solo para aclarar, en este ejemplo ** ** frase de contraseña es la _key_ que puede ser de 128, 192, o 256 bits (16, 24 , o 32 bytes) – Mark