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
- Clave Pública: Puede ser distribuida libremente y es utilizada para cifrar datos.
- Clave Privada: Debe mantenerse en secreto y es utilizada para descifrar datos.
- Cifrado: Proceso de convertir datos legibles en datos cifrados utilizando la clave pública.
- Descifrado: Proceso de convertir datos cifrados en datos legibles utilizando la clave privada.
- 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
- Generación de Claves: Se genera un par de claves (pública y privada).
- Cifrado:
- El remitente utiliza la clave pública del destinatario para cifrar el mensaje.
- El mensaje cifrado se envía al destinatario.
- 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).
-
Generación de Claves:
Bob genera un par de claves: Clave Pública: PU_Bob Clave Privada: PR_Bob
-
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")
-
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
-
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.
-
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.
-
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:
- Utiliza la biblioteca
cryptography
para generar un par de claves RSA. - 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:
- Cifra un mensaje utilizando la clave pública.
- 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.
Fundamentos de Seguridad Informática
Módulo 1: Introducción a la Seguridad Informática
- Conceptos Básicos de Seguridad Informática
- Tipos de Amenazas y Vulnerabilidades
- Principios de la Seguridad Informática
Módulo 2: Ciberseguridad
- Definición y Alcance de la Ciberseguridad
- Tipos de Ataques Cibernéticos
- Medidas de Protección en Ciberseguridad
- Casos de Estudio de Incidentes de Ciberseguridad
Módulo 3: Criptografía
- Introducción a la Criptografía
- Criptografía Simétrica
- Criptografía Asimétrica
- Protocolos Criptográficos
- Aplicaciones de la Criptografía
Módulo 4: Gestión de Riesgos y Medidas de Protección
- Evaluación de Riesgos
- Políticas de Seguridad
- Controles de Seguridad
- Plan de Respuesta a Incidentes
- Recuperación ante Desastres
Módulo 5: Herramientas y Técnicas de Seguridad
- Herramientas de Análisis de Vulnerabilidades
- Técnicas de Monitoreo y Detección
- Pruebas de Penetración
- Seguridad en Redes
- Seguridad en Aplicaciones
Módulo 6: Buenas Prácticas y Normativas
- Buenas Prácticas en Seguridad Informática
- Normativas y Estándares de Seguridad
- Cumplimiento y Auditoría
- Formación y Concienciación