Google+ Seguidores

sábado, 15 de septiembre de 2018

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.

Resultado de imagen para criptografia

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):


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'l\xa1=R\xcap\xc8\x83\xe0\xf0\xbb\x10\x1eBZ\x89\xe8bM\xe5\x1d\xb2\xd29%\x93\xafj\x84\x11\x80\x90'

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.

No hay comentarios :
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Powered by Blogger .