Criptografía en Python - AES
Joan Daemen, Vincent Rijmen diseñó el algoritmo de cifrado
Rijndael, que fue seleccionado como AES en
2000
¿Qué es AES?
conocido como Rijndael (pronunciado "Rain Doll" en inglés), es un
esquema de cifrado por bloques adoptado como un estándar de cifrado por el
gobierno de los Estados Unidos, creado en Bélgica. Se transformó en un
estándar efectivo el 26 de mayo de 2002. Desde 2006, el AES es uno de los
algoritmos más populares usados en criptografía simétrica.
Vincent Rijmen, y fue enviado al proceso de selección AES bajo el
nombre "Rijndael", como parte de un concurso.
AES y sus modos de cifrado
devuelve uno salida, él funciona con modos de operación los cuales son
varios, pero aquí una pequeña lista de los muchos que podríamos usar:
-
Cipher-block chaining (CBC):
En el modo cipher-block chaining (CBC), a cada bloque
de texto plano se le aplica la operación
XOR
con el bloque cifrado anterior antes de ser cifrado. De esta
forma, cada bloque de texto cifrado depende de todo el texto
en claro procesado hasta este punto. Para hacer cada mensaje
único se utiliza asimismo un vector de inicialización.
-
Counter (CTR): Al igual que OFB, el modo contador convierte una unidad de
cifrado por bloques en una unidad de flujo de cifrado. Genera el
siguiente bloque en el flujo de claves cifrando valores
sucesivos de un contador. El contador puede ser cualquier
función sencilla que produzca una secuencia de números donde los
resultados se repiten con muy baja frecuencia. Si bien la
operación más usada es un contador, el modo CTR tiene
características similares al OFB, pero permite también usar una
propiedad de acceso aleatorio para el descifrado.
-
Electronic Code-Book (ECB): El más sencillo es el modo electronic codebook (ECB), en el
cual los mensajes se dividen en bloques y cada uno de ellos es
cifrado por separado utilizando la misma clave K. La desventaja de
este método es que a bloques de texto plano o claro idénticos les
corresponden bloques idénticos de texto cifrado, de manera que se
pueden reconocer estos patrones como guía para descubrir el texto en
claro a partir del texto cifrado. De ahí que no sea recomendable
para protocolos cifrados. -
Galois/Counter Mode (GCM): En criptografía,
Galois/Counter Mode (GCM) es un modo de operación
para los cifrados de bloques criptográficos de clave simétrica
ampliamente adoptados para su rendimiento. Las tasas de rendimiento de GCM para canales de comunicación de
alta velocidad de última generación se pueden lograr con
recursos de hardware económicos. La operación es un
algoritmo de cifrado autenticado diseñado para proporcionar
autenticidad de datos (integridad) y confidencialidad. GCM se define para cifrados de bloques con un tamaño de bloque
de 128 bits. Galois Message Authentication Code (GMAC) es una
variante de autenticación solamente del GCM que puede formar un
código de autenticación de mensajes incremental. Tanto GCM como GMAC pueden aceptar vectores de inicialización
de longitud arbitraria.
se acople mejor a la situación, que sea seguro y eficiente.
AES en python
el
artículo anterior, pero no hemos explotado todo lo que nos ofrece, entre ello está
la posibilidad de usar AES.
para descifrar usando el modo EAX.
from Crypto.Cipher import AES
def encrypt(key, data): cipher = AES.new(key, AES.MODE_EAX) ciphertext, tag = cipher.encrypt_and_digest(data) return cipher.nonce + tag + ciphertext
comprender cada parámetro, variables y demás dato que nos sea de
utilidad.
contraseña, etc, con la que queramos cifrar los datos, mientras que
data son los datos a cifrar. Cada uno de ellos debe ser de
tipo bytes, aunque ya lo veremos detenidamente en una breves
instantes.
de los datos cifrados; tag es el código de autenticación de
mensajes (MAC) calculado durante el cifrado. Y por último pero no
menos importante el nonce (number occuring once [número que
ocurre una vez, en español]), también conocido como el vector de
inicialización, el cual es un número aleatorio que se utiliza para
mejorar la aleatorización.
def decrypt(key, data): nonce = data[:AES.block_size] tag = data[AES.block_size:AES.block_size * 2] ciphertext = data[AES.block_size * 2:] cipher = AES.new(key, AES.MODE_EAX, nonce) return cipher.decrypt_and_verify(ciphertext, tag)
De la teoría a la práctica
Lecturas recomendadas:
- https://pycryptodome.readthedocs.io
- https://pycryptodome.readthedocs.io/en/latest/src/examples.html#encrypt-data-with-aes
- https://es.wikipedia.org/wiki/Cifrado_por_bloques
- https://en.wikipedia.org/wiki/Initialization_vector
- http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html
Deja una respuesta