Café y Código

3. Cifrado Asimétrico: El Sistema de Dos Claves 🔑🗝️

¿Cómo funciona la Criptografía Asimétrica?

A diferencia del cifrado simétrico, aquí no compartimos la misma llave. Cada persona genera un par de llaves vinculadas matemáticamente:

  • Clave Pública (Public Key): Se comparte libremente con cualquiera. Se usa únicamente para encriptar mensajes destinados a su dueño o para verificar firmas digitales.
  • Clave Privada (Private Key): Se guarda bajo estricto secreto. Se usa para desencriptar los mensajes recibidos o para firmar digitalmente.

La regla de oro matemática es: Lo que cifra la clave pública solo puede descifrarlo la clave privada correspondiente.

💡 Arquitectura de Cifrado Híbrido

Cifrar datos masivos con RSA es extremadamente lento y requiere mucha CPU. Además, los algoritmos asimétricos tienen un límite de tamaño de texto plano (no se puede cifrar un mensaje más largo que la propia llave). En la vida real, se usa Cifrado Híbrido (ej. en HTTPS/TLS y SSH): se genera una clave simétrica temporal (AES) rápida para cifrar el archivo grande, y luego se cifra únicamente la clave AES (pequeña) con la clave pública RSA del destinatario.

El ascenso de ECC (Criptografía de Curva Elíptica)

Aunque RSA es el estándar clásico, la Criptografía de Curva Elíptica (ECC) es la preferida hoy en día. ECC ofrece el mismo nivel de seguridad con llaves mucho más pequeñas (una llave ECC de 256 bits equivale en seguridad a una llave RSA de 3072 bits), consumiendo menos batería en móviles y ahorrando ancho de banda.

Implementación en Código (RSA-OAEP)

Compara las implementaciones en los cuatro lenguajes para cifrar y descifrar un texto pequeño usando llaves RSA generadas dinámicamente y el esquema de padding seguro OAEP con hash SHA-256.

Cifrado Asimétrico con RSA-OAEP
PYTHON
1 from cryptography.hazmat.primitives.asymmetric import rsa, padding
2 from cryptography.hazmat.primitives import hashes
3
4 # 1. Generar par de claves RSA de 2048 bits
5 private_key = rsa.generate_private_key(
6 public_exponent=65537,
7 key_size=2048
8 )
9 public_key = private_key.public_key()
10
11 message = b"Mensaje secreto para cifrado asimetrico"
12
13 # 2. Cifrar con la clave publica usando padding OAEP y SHA-256
14 ciphertext = public_key.encrypt(
15 message,
16 padding.OAEP(
17 mgf=padding.MGF1(algorithm=hashes.SHA256()),
18 algorithm=hashes.SHA256(),
19 label=None
20 )
21 )
22 print(f"Cifrado (hex): {ciphertext.hex()[:60]}...")
23
24 # 3. Descifrar con la clave privada
25 decrypted = private_key.decrypt(
26 ciphertext,
27 padding.OAEP(
28 mgf=padding.MGF1(algorithm=hashes.SHA256()),
29 algorithm=hashes.SHA256(),
30 label=None
31 )
32 )
33 print(f"Descifrado: {decrypted.decode('utf-8')}")

Ponte a prueba

Pon a prueba tus conocimientos sobre llaves asimétricas y cifrado híbrido.

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.