Introducción

La criptografía asimétrica, también conocida como criptografía de clave pública, es un método de cifrado que utiliza un par de claves: una clave pública y una clave privada. Este enfoque resuelve muchos de los problemas asociados con la criptografía simétrica, como la distribución segura de claves.

Conceptos Clave

  1. Clave Pública: Puede ser distribuida libremente y es utilizada para cifrar datos.
  2. Clave Privada: Debe mantenerse en secreto y es utilizada para descifrar datos.
  3. Cifrado: Proceso de convertir datos legibles en datos cifrados utilizando la clave pública.
  4. Descifrado: Proceso de convertir datos cifrados en datos legibles utilizando la clave privada.
  5. Firma Digital: Proceso de utilizar la clave privada para crear una firma que puede ser verificada con la clave pública.

Funcionamiento de la Criptografía Asimétrica

Proceso de Cifrado y Descifrado

  1. Generación de Claves: Se genera un par de claves (pública y privada).
  2. Cifrado:
    • El remitente utiliza la clave pública del destinatario para cifrar el mensaje.
    • El mensaje cifrado se envía al destinatario.
  3. Descifrado:
    • El destinatario utiliza su clave privada para descifrar el mensaje.

Ejemplo Práctico

Supongamos que Alice quiere enviar un mensaje seguro a Bob. Bob tiene un par de claves (pública y privada).

  1. Generación de Claves:

    Bob genera un par de claves:
    Clave Pública: PU_Bob
    Clave Privada: PR_Bob
    
  2. Cifrado:

    Alice obtiene la clave pública de Bob (PU_Bob).
    Alice cifra el mensaje "Hola Bob" utilizando PU_Bob.
    Mensaje Cifrado: C = E(PU_Bob, "Hola Bob")
    
  3. Descifrado:

    Bob recibe el mensaje cifrado C.
    Bob descifra el mensaje utilizando su clave privada PR_Bob.
    Mensaje Descifrado: M = D(PR_Bob, C)
    

Ejemplo en Código (Python)

A continuación, se muestra un ejemplo simple utilizando la biblioteca cryptography en Python:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# Generación de claves
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

public_key = private_key.public_key()

# Mensaje a cifrar
message = b"Hola Bob"

# Cifrado
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Mensaje Cifrado:", ciphertext)

# Descifrado
decrypted_message = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Mensaje Descifrado:", decrypted_message.decode())

Explicación del Código

  1. Generación de Claves:

    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
    )
    public_key = private_key.public_key()
    
    • Se genera un par de claves RSA con un tamaño de 2048 bits.
  2. Cifrado:

    ciphertext = public_key.encrypt(
        message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    
    • El mensaje se cifra utilizando la clave pública y el esquema de padding OAEP con SHA-256.
  3. Descifrado:

    decrypted_message = private_key.decrypt(
        ciphertext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    
    • El mensaje cifrado se descifra utilizando la clave privada y el mismo esquema de padding.

Ventajas y Desventajas

Ventajas

  • Distribución de Claves: No es necesario compartir la clave privada, lo que simplifica la distribución de claves.
  • Autenticación: Permite la autenticación mediante firmas digitales.
  • Integridad: Garantiza que el mensaje no ha sido alterado.

Desventajas

  • Rendimiento: Es más lento que la criptografía simétrica debido a la complejidad de los cálculos.
  • Tamaño de Clave: Requiere claves más largas para alcanzar el mismo nivel de seguridad que la criptografía simétrica.

Ejercicios Prácticos

Ejercicio 1: Generación de Claves

Objetivo: Generar un par de claves RSA y mostrar las claves pública y privada.

Instrucciones:

  1. Utiliza la biblioteca cryptography para generar un par de claves RSA.
  2. Muestra las claves en formato PEM.

Solución:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# Generación de claves
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

public_key = private_key.public_key()

# Serialización de claves
pem_private_key = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

pem_public_key = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

print("Clave Privada:\n", pem_private_key.decode())
print("Clave Pública:\n", pem_public_key.decode())

Ejercicio 2: Cifrado y Descifrado

Objetivo: Cifrar y descifrar un mensaje utilizando las claves generadas.

Instrucciones:

  1. Cifra un mensaje utilizando la clave pública.
  2. Descifra el mensaje utilizando la clave privada.

Solución:

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# Mensaje a cifrar
message = b"Hola Bob"

# Cifrado
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Mensaje Cifrado:", ciphertext)

# Descifrado
decrypted_message = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Mensaje Descifrado:", decrypted_message.decode())

Conclusión

La criptografía asimétrica es una herramienta poderosa en la seguridad informática, proporcionando soluciones efectivas para la distribución de claves y la autenticación. Aunque es más lenta que la criptografía simétrica, sus ventajas en términos de seguridad y facilidad de uso la hacen indispensable en muchas aplicaciones modernas.

En el próximo tema, exploraremos los Protocolos Criptográficos, donde veremos cómo se utilizan estas técnicas en protocolos de comunicación seguros.

© Copyright 2024. Todos los derechos reservados