Cryptography: Cifrado simétrico, algoritmos asimétricos, mensajes de resúmenes y mucho más
Introducción:
Hola amigos de Internet, les doy la bienvenida a Mi Diario Python, el mejor blog en español para Aprender Python.
En este articulo veremos como funciona el modulo "cryptography" cuyo propósito es proporcionarnos una gran variedad de métodos y funciones para cifrar y descifrar cadenas de texto.
cryptography nos trabaja con cifrados simétricos, resúmenes de mensaje y funciones de derivación de clave.
Se que te sera de mucha utilidad.
¿Listo? Comencemos.
Cryptography - Instalación y Uso:
Antes de podemos utilizar cryptography, debemos tenerlo. Para ello lo podemos instalar a través de PIP, de la siguiente manera:
pip install cryptography
Una vez que dispongamos de cryptography, podremos utilizar sus métodos.
Fernet (cifrado simétrico) :
Fernet garantiza que un mensaje cifrado no puede ser manipulado o leído sin la clave. Fernet es una implementación de criptografía autenticada simétrica (también conocida como "clave secreta"). Fernet también tiene soporte para implementar la rotación clave a través de MultiFernet.
Realicemos un ejemplo sencillo.
# Importamos Fernet from cryptography.fernet import Fernet # Generamos una clave clave = Fernet.generate_key() # Creamos la instancia de Fernet # Parametros: key: clave generada f = Fernet(clave) # Encriptamos el mensaje # utilizando el método "encrypt" token = f.encrypt(b'Mensaje secreto') # Mostramos el token del mensaje print(token)
b'gAAAAABbnU_sTUwSgdwiMe6Gvebm5e-5WLSrYvkwAfLjgvD8u6nbddlKBcvv4-e6TZ2V5iPxZDSOS6IsWZHI9R9KbJJflXCIPg=='
Muy fácil ¿No?. Fíjate en que el mensaje a encriptar debe estar en formato binario, por ello la b antes de "Mensaje secreto".
Muy bien, como resultado tenemos el token, el cual es el cuerpo del texto, pero cifrado.
Para poder descifrar tus token, lo unico que debes hacer es utilizar el método decrypt. Veamos un ejemplo:
# Podemos descifrar el mensaje utilizando # el método "decrypt". des = f.decrypt(token) print(des)
b'Mensaje secreto'
Perfecto, un resultado satisfactorio.
Te recomiendo seguir leyendo y aprendiendo más: https://cryptography.io/en/latest/fernet/.
Algoritmos Asimétricos:
La criptografía asimétrica es una rama de la criptografía donde una clave secreta se puede dividir en dos partes, una clave pública y una clave privada . La clave pública se puede dar a cualquier persona, de confianza o no, mientras que la clave privada debe mantenerse en secreto (al igual que la clave en la criptografía simétrica).
La criptografía asimétrica tiene dos casos de uso principales: autenticación y confidencialidad. Al usar la criptografía asimétrica, los mensajes se pueden firmar con una clave privada, y luego cualquier persona con la clave pública puede verificar que el mensaje fue creado por alguien que posee la clave privada correspondiente. Esto se puede combinar con un sistema de prueba de identidad para saber qué entidad (persona o grupo) posee realmente esa clave privada, proporcionando autenticación.
El cifrado con criptografía asimétrica funciona de una manera ligeramente diferente de la encriptación simétrica. Una persona con la clave pública puede encriptar un mensaje, proporcionando confidencialidad, y solo la persona que posee la clave privada puede descifrarla.
Realicemos un ejemplo utilizando el algoritmo RSA:
# Empezaremos generando la clave privada from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa # Utilizaremos el método "generate_private_key" # para generar nuestra clave # asignamos algunos parametros private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() )
# Ahora generaremos la clave pública public_key = private_key.public_key()
""" Firma: Una clave privada se puede usar para firmar un mensaje. Esto permite a cualquier persona con la clave pública verificar que el mensaje fue creado por alguien que posee la clave privada correspondiente. Las firmas RSA requieren una función hash específica y relleno para ser utilizado. Aquí hay un ejemplo de firma messageusando RSA, con una función hash segura y relleno: """ from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding message = b"A message I want to sign" signature = private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() )
""" Procedemos a cifrar el dato. Para ello utilizaremos el método encrytp. """ message = b"Dato para cifrar" ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) )
""" Ahora vamos a descifrar el mensaje. Para ello utilizaremos el método decrypt. """ plaintext = private_key.decrypt( ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) )
# Comprobamos que sean el mismo dato plaintext == message
True
Excelente, hemos tenido como resultado True. Todo esto, sin que el usuario deba ver más alla que la verificación.
Te recomiendo seguir aprendiendo más acerca del tema: https://cryptography.io/en/latest/hazmat/primitives/asymmetric/.
Resúmenes de mensaje (Hashing):
Ya hemos hablado de los hash en este blog (https://www.pythondiario.com/2017/09/algoritmos-hash-criptografia-con-python.html).
Veamos algunos ejemplos utilizando cryptography:
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes digest = hashes.Hash(hashes.SHA256(), backend=default_backend()) digest.update(b"abc") digest.update(b"123") digest.finalize()
b'lxa1=Rxcapxc8x83xe0xf0xbbx10x1eBZx89xe8bMxe5x1dxb2xd29%x93xafjx84x11x80x90'
Muy bien, excelente.
Hemos llegado al final, mi trabajo aquí a terminado, pero el tuyo acaba de empezar. ¿Que esperabas? ¿Que te mostrara mil ejemplos? No!!!. Vamos amigo, lee la documentación:https://cryptography.io/en/latest/.
¿Alguna duda? No dudes en dejar tu comentario.
Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
Subir
Deja una respuesta