La criptografía es la disciplina que permite proteger información en presencia de adversarios: personas o sistemas que intentan leerla, alterarla o suplantarla. Para un desarrollador o un perfil TI, la criptografía no es un lujo académico: es la base de las contraseñas que almacenas, de los tokens de sesión que emites, del candado que ve el usuario en el navegador y de la firma que garantiza que un documento no ha sido manipulado. En esta primera lección definiremos qué es (y qué no es) la criptografía, veremos los cuatro objetivos que persigue, haremos un brevísimo repaso histórico y presentaremos el caso práctico que nos acompañará durante todo el curso: MediNube, una plataforma SaaS ficticia de historiales médicos.

Contenido

  1. Los cuatro objetivos de la criptografía
  2. Un poco de historia (muy poca): de César a la criptografía moderna
  3. Panorama de la criptografía moderna: simétrica, asimétrica y hashes
  4. El caso MediNube: nuestro hilo conductor
  5. Un aperitivo en Python: el cifrado César
  6. Mapa del curso

Los cuatro objetivos de la criptografía

Cuando alguien dice "criptografía", casi todo el mundo piensa en "mensajes secretos". Pero mantener algo en secreto es solo uno de los cuatro objetivos fundamentales. Conviene memorizarlos desde el primer día, porque cada herramienta criptográfica que veremos en el curso existe para cumplir uno o varios de ellos:

Objetivo Pregunta que responde Ejemplo cotidiano Ejemplo en MediNube
Confidencialidad ¿Puede leer esto solo quien debe? Nadie más lee tus mensajes de WhatsApp El historial de la paciente Ana Pérez solo lo ven los médicos autorizados de Clínica Sol
Integridad ¿Ha sido modificado el dato desde que se creó? La descarga de un instalador no está corrupta ni troyanizada Nadie ha cambiado la dosis de un medicamento en una receta almacenada
Autenticidad ¿Quién generó realmente este dato o mensaje? El SMS de tu banco es realmente de tu banco La petición a la API de MediNube viene de la app oficial de Clínica Sol, no de un impostor
No repudio ¿Puede el autor negar después haberlo hecho? Una firma electrónica en un contrato La doctora que firmó una receta electrónica no puede negar haberla emitido

Algunos matices importantes:

  • Confidencialidad no implica integridad. Un mensaje puede ser ilegible para un atacante y aun así ser modificable a ciegas. Este matiz, que sorprende a casi todos los principiantes, lo veremos en profundidad al hablar de cifrado autenticado (módulo 2).
  • Autenticidad y no repudio se parecen, pero no son lo mismo. Si tú y yo compartimos una clave secreta, yo puedo verificar que un mensaje viene de ti (autenticidad entre nosotros)... pero no puedo demostrárselo a un juez, porque yo también podría haberlo creado. El no repudio exige que solo el autor pueda producir la prueba, y eso requiere firmas digitales (módulo 4).
  • Hay objetivos secundarios (disponibilidad, anonimato, frescura de los mensajes...) que tocaremos cuando aparezcan, pero estos cuatro son el núcleo.

Un esquema mental útil:

graph TD
    C[Criptografía] --> O1[Confidencialidad<br/>solo lo lee quien debe]
    C --> O2[Integridad<br/>no ha sido alterado]
    C --> O3[Autenticidad<br/>viene de quien dice venir]
    C --> O4[No repudio<br/>el autor no puede negarlo]

Lo que la criptografía NO resuelve

Igual de importante es saber qué queda fuera:

  • No sustituye al control de acceso. Cifrar la base de datos no sirve de nada si la aplicación descifra y muestra los datos a cualquier usuario logueado.
  • No arregla software vulnerable. Una inyección SQL se salta todo el cifrado del mundo, porque ataca a la aplicación que ya tiene los datos en claro.
  • No protege contra un extremo comprometido. Si el portátil del médico tiene malware, el atacante ve lo mismo que el médico.

La criptografía es una pieza (imprescindible) de un sistema seguro, no el sistema entero.

Un poco de historia (muy poca)

No necesitas ser historiador para usar bien la criptografía, pero tres hitos ayudan a entender por qué la criptografía moderna es como es:

  • El cifrado César (~50 a.C.). Julio César desplazaba cada letra del alfabeto un número fijo de posiciones (con desplazamiento 3, la A se convierte en D). Es trivial de romper: solo hay 25 desplazamientos posibles en el alfabeto inglés, se prueban todos en segundos. Lección: un espacio de claves pequeño es una sentencia de muerte.
  • Enigma (Segunda Guerra Mundial). Una máquina electromecánica alemana con un espacio de claves enorme para la época. Fue rota en Bletchley Park (con Alan Turing entre otros) combinando errores de operación, patrones predecibles en los mensajes y máquinas de cálculo. Lección: la teoría no basta; el uso incorrecto y los patrones del mensaje rompen sistemas "fuertes". Veremos ecos de esto en los modos de operación (módulo 2).
  • La criptografía moderna (desde ~1970). Con la publicación de DES, el trabajo de Diffie y Hellman (1976) y RSA (1977), la criptografía pasó de arte militar secreto a ciencia pública: algoritmos publicados, analizados por miles de expertos y con seguridad basada en matemáticas, no en el secreto del método. Esta idea —que el algoritmo sea público y solo la clave sea secreta— es el principio de Kerckhoffs, al que dedicaremos la lección 01-04.

Con eso basta. Este es un curso aplicado: nos interesa la criptografía que se despliega hoy, no la arqueología.

Panorama de la criptografía moderna

Toda la criptografía que usarás como desarrollador se apoya en tres grandes familias de primitivas. Aquí solo las presentamos; cada una tiene su módulo completo más adelante.

graph TD
    M[Criptografía moderna] --> S[Simétrica<br/>una clave compartida]
    M --> A[Asimétrica<br/>par de claves pública/privada]
    M --> H[Funciones hash<br/>sin clave: huella digital]
    S --> S1[Cifrado: AES, ChaCha20]
    S --> S2[Autenticación: HMAC]
    A --> A1[Cifrado e intercambio de claves]
    A --> A2[Firmas digitales]
    H --> H1[Integridad, contraseñas,<br/>identificadores]
Familia Idea central Fortaleza Limitación principal Se desarrolla en
Simétrica Emisor y receptor comparten la misma clave secreta Muy rápida, apta para gigabytes de datos ¿Cómo comparten la clave dos partes que nunca se han visto? Módulo 2
Asimétrica Cada parte tiene un par de claves: una pública (se difunde) y una privada (jamás sale) Resuelve el intercambio de claves y permite firmas Lenta y con mensajes de tamaño limitado; casi siempre se combina con la simétrica Módulo 4
Hash Función sin clave que reduce cualquier dato a una "huella" de tamaño fijo, imposible de invertir Detecta cualquier alteración; base de contraseñas y firmas Por sí sola no da confidencialidad ni autenticidad Módulo 3

En la práctica real casi nunca se usa una familia aislada: TLS (el protocolo detrás de HTTPS, módulo 5) combina las tres, y el "cifrado híbrido" (módulo 4) es exactamente esa combinación. Quédate con la foto general; los detalles llegarán en orden.

Un flujo clásico emisor/receptor con criptografía simétrica, para fijar el vocabulario que usaremos siempre (texto en claro, texto cifrado, clave):

sequenceDiagram
    participant E as Emisor (Clínica Sol)
    participant R as Receptor (MediNube)
    Note over E,R: Ambos comparten una clave secreta K
    E->>E: cifrar(texto en claro, K) → texto cifrado
    E->>R: envía el texto cifrado (canal inseguro)
    R->>R: descifrar(texto cifrado, K) → texto en claro
    Note over E,R: Un espía del canal solo ve el texto cifrado

El caso MediNube: nuestro hilo conductor

Durante todo el curso trabajaremos sobre un mismo escenario, para que cada técnica tenga un contexto realista.

MediNube es una plataforma SaaS (ficticia) que gestiona historiales médicos para clínicas privadas. Sus clientes son clínicas como Clínica Sol o Centro Médico Luna; sus usuarios finales son médicos, personal administrativo y, a través de un portal, pacientes como Ana Pérez. Tú acabas de incorporarte al equipo como desarrollador/a responsable de revisar y construir su capa de seguridad.

¿Qué necesita MediNube de la criptografía? Prácticamente todo el catálogo:

Necesidad de MediNube Objetivo(s) que cubre Dónde lo construiremos
Que los historiales almacenados no sean legibles si roban los discos o los backups Confidencialidad Módulos 2 y 6 (cifrado en reposo)
Que las contraseñas de médicos y pacientes no se filtren aunque roben la base de datos Confidencialidad (de la contraseña) Módulo 3
Tokens de sesión y de recuperación de contraseña impredecibles Autenticidad, imprevisibilidad Lección 01-03 y módulo 6 (JWT)
Que una receta electrónica emitida por un médico sea verificable y no falsificable Integridad, autenticidad, no repudio Módulo 4 (firmas)
Que la comunicación navegador ↔ API viaje protegida Confidencialidad, integridad, autenticidad Módulo 5 (TLS)
Guardar y rotar las claves de todo lo anterior sin desastres (Transversal) Módulo 6

Advertencia importante: MediNube maneja datos sanitarios, una categoría especialmente protegida por el RGPD. En este curso usamos siempre datos ficticios y ejemplos didácticos. Un despliegue real de un sistema así requiere, además de buena criptografía, una revisión por profesionales de seguridad y de cumplimiento normativo (RGPD, ENS, normativa sanitaria aplicable). Ningún ejemplo de este curso debe copiarse a producción sin esa revisión.

Un aperitivo en Python: el cifrado César

Para motivar lo que viene, implementemos el cifrado César. Ojo: esto es un juguete didáctico; jamás protegerías nada real con él. Precisamente por eso es útil: nos permite ver un cifrado completo (algoritmo + clave) y comprobar lo fácil que es romperlo.

def cifrar_cesar(texto: str, desplazamiento: int) -> str:
    """Cifra un texto desplazando cada letra un número fijo de posiciones."""
    resultado = []
    for caracter in texto:
        if caracter.isalpha():
            # base es el código del punto de partida: 'A' o 'a'
            base = ord('A') if caracter.isupper() else ord('a')
            # Desplazamos dentro del alfabeto de 26 letras con módulo (%)
            nuevo = (ord(caracter) - base + desplazamiento) % 26 + base
            resultado.append(chr(nuevo))
        else:
            resultado.append(caracter)  # espacios, dígitos, etc. no se tocan
    return "".join(resultado)


def descifrar_cesar(texto: str, desplazamiento: int) -> str:
    """Descifrar es cifrar con el desplazamiento opuesto."""
    return cifrar_cesar(texto, -desplazamiento)


mensaje = "Paciente Ana Perez cita el lunes"
clave = 3
cifrado = cifrar_cesar(mensaje, clave)
print(cifrado)                          # Sdflhqwh Dqd Shuhc flwd ho oxqhv
print(descifrar_cesar(cifrado, clave))  # Paciente Ana Perez cita el lunes

Desglosemos el código pieza a pieza:

  • ord(caracter) devuelve el código numérico del carácter (por ejemplo, ord('A') es 65) y chr() hace la operación inversa. Los cifrados trabajan con números, no con letras; esta conversión letra ↔ número es el primer paso de casi todo.
  • (ord(caracter) - base + desplazamiento) % 26 primero convierte la letra a un índice de 0 a 25 (restando base), luego suma el desplazamiento, y el módulo 26 (%) hace que al pasarnos de la Z volvamos a la A, como en una rueda.
  • La clave es el desplazamiento (aquí, 3). El algoritmo (desplazar letras) puede ser público; lo que debería ser secreto es la clave.

¿Y romperlo? No hace falta ni conocer la clave: solo hay 25 desplazamientos posibles, así que un atacante los prueba todos (ataque de fuerza bruta):

cifrado = "Sdflhqwh Dqd Shuhc flwd ho oxqhv"
for posible_clave in range(1, 26):
    print(posible_clave, descifrar_cesar(cifrado, posible_clave))
# En la línea 3 aparece el texto legible: clave encontrada.

Este bucle de cinco líneas ilustra la idea más importante de la lección 01-03: la seguridad depende del tamaño del espacio de claves. 25 claves se prueban en microsegundos; 2^128 claves (lo habitual en criptografía moderna) no se pueden probar ni con todos los ordenadores del planeta. También adelanta la lección 01-04: aunque hubiéramos mantenido en secreto "usamos César", un atacante lo deduce en minutos; el secreto del algoritmo no protege nada.

A partir del módulo 2 dejaremos los juguetes y usaremos la librería cryptography (del proyecto pyca), el estándar de facto en Python para criptografía seria. En este primer módulo nos basta con la librería estándar (base64, secrets, os.urandom).

Mapa del curso

Así encaja todo lo que viene:

  1. Módulo 1 (este): fundamentos y vocabulario — qué es cifrar y qué no lo es (01-02), de dónde sale la aleatoriedad que alimenta todo (01-03) y las reglas de oro que nunca romperemos (01-04).
  2. Módulo 2: criptografía simétrica — AES, ChaCha20, modos de operación, cifrado autenticado y derivación de claves. Con esto cifraremos los documentos de MediNube.
  3. Módulo 3: hashes, HMAC y almacenamiento seguro de contraseñas de usuarios.
  4. Módulo 4: criptografía asimétrica — RSA, curvas elípticas, firmas digitales (recetas electrónicas), Diffie-Hellman y cifrado híbrido.
  5. Módulo 5: PKI, certificados X.509 y TLS: el candado del navegador, por dentro.
  6. Módulo 6: criptografía en el desarrollo real — gestión de claves y secretos, cifrado en reposo/tránsito, JWT, errores comunes y una mirada a la criptografía post-cuántica.

Errores Comunes y Consejos

  • Confundir "cifrado" con "seguro". Cifrar con un algoritmo débil (o usar bien un algoritmo fuerte pero con claves mal gestionadas) da una falsa sensación de seguridad peor que no cifrar, porque relaja el resto de controles.
  • Creer que la confidencialidad incluye la integridad. Son objetivos distintos y se logran con mecanismos distintos. Grábatelo ya: te evitará el error más común del módulo 2.
  • Usar "encriptar". Es un anglicismo extendido; en este curso usaremos el término normativo cifrar/descifrar. Lo importante no es el purismo, sino que "descifrar" (con clave) y "criptoanalizar" o "romper" (sin clave) son cosas distintas, y el vocabulario preciso ayuda a pensar con precisión.
  • Empezar a programar criptografía sin identificar el objetivo. Antes de elegir herramienta, pregunta siempre: ¿necesito confidencialidad, integridad, autenticidad, no repudio... o varias? La herramienta sale de la respuesta, no al revés.
  • Consejo: cuando leas documentación de seguridad, traduce mentalmente cada mecanismo a "¿cuál de los cuatro objetivos cubre?". Es un ejercicio que ordena las ideas de forma sorprendente.

Ejercicios

Ejercicio 1. Para cada situación de MediNube, indica qué objetivo u objetivos criptográficos están en juego: (a) un atacante intercepta el tráfico entre el navegador de un médico y la API y lee los datos de Ana Pérez; (b) alguien con acceso a la base de datos cambia "500 mg" por "5000 mg" en una receta almacenada; (c) un paciente afirma que él nunca autorizó compartir su historial con otra clínica, aunque hay un registro de que lo hizo; (d) una app falsa se hace pasar por el portal de pacientes de MediNube.

Ejercicio 2. Modifica el bucle de fuerza bruta del cifrado César para que, en lugar de imprimir los 25 candidatos, devuelva automáticamente el más probable. Pista sencilla: el texto correcto en español contendrá con casi total seguridad la palabra " el " o una alta proporción de vocales. Implementa la heurística que prefieras.

Ejercicio 3. El cifrado César tiene 25 claves útiles. Un "cifrado de sustitución general" asigna a cada una de las 26 letras cualquier otra letra distinta (una permutación del alfabeto). (a) ¿Cuántas claves posibles tiene? (b) ¿Significa ese número que es seguro? Razona la respuesta (pista: piensa en las frecuencias de las letras en español).

Soluciones

Solución 1. (a) Confidencialidad (lectura no autorizada en tránsito; lo resolverá TLS, módulo 5). (b) Integridad (modificación de datos almacenados; hashes y MAC, módulo 3, y cifrado autenticado, módulo 2). (c) No repudio: necesitamos poder demostrar que el paciente realizó la acción, de forma que no pueda negarla; requiere firma digital (módulo 4), no basta un registro en la base de datos (que MediNube podría haber fabricado). (d) Autenticidad (verificar la identidad del servicio; certificados y TLS, módulo 5).

Solución 2. Una heurística simple y efectiva: puntuar cada candidato por número de apariciones de palabras frecuentes.

def romper_cesar(cifrado: str) -> tuple[int, str]:
    palabras_frecuentes = [" el ", " la ", " de ", " que ", " en "]
    mejor = (0, 0, cifrado)  # (puntuacion, clave, texto)
    for clave in range(1, 26):
        candidato = descifrar_cesar(cifrado, clave)
        puntuacion = sum(candidato.lower().count(p) for p in palabras_frecuentes)
        if puntuacion > mejor[0]:
            mejor = (puntuacion, clave, candidato)
    return mejor[1], mejor[2]

print(romper_cesar("Sdflhqwh Dqd Shuhc flwd ho oxqhv"))  # (3, 'Paciente Ana Perez cita el lunes')

Recorremos las 25 claves, descifamos con cada una y contamos apariciones de palabras muy comunes en español; la clave correcta produce texto real y gana la puntuación. En textos muy cortos la heurística puede fallar: contar frecuencias de vocales o de las letras E/A/O es más robusto.

Solución 3. (a) Es el número de permutaciones de 26 elementos: 26! ≈ 4 × 10^26, un espacio de claves de unos 88 bits — enorme, inalcanzable por fuerza bruta. (b) No es seguro en absoluto. La fuerza bruta no es el único ataque: cada letra del texto en claro se sustituye siempre por la misma letra cifrada, así que las frecuencias del idioma (en español la E y la A dominan) se conservan en el texto cifrado. Con un análisis de frecuencias, un texto de unas pocas frases se rompe a mano en minutos. Moraleja clave del curso: un espacio de claves grande es necesario, pero no suficiente; el algoritmo no debe filtrar patrones del mensaje. Volveremos sobre esta idea con los modos de operación del módulo 2.

Conclusión

En esta lección has adquirido el mapa y el vocabulario del curso: la criptografía persigue confidencialidad, integridad, autenticidad y no repudio; se apoya en tres familias de primitivas (simétrica, asimétrica y hash) que se combinan entre sí; y su historia enseña dos lecciones que siguen vigentes — el espacio de claves debe ser enorme y el mal uso rompe sistemas teóricamente fuertes. También has conocido MediNube, la plataforma de historiales médicos cuya capa de seguridad iremos construyendo, y has visto con el cifrado César que un cifrado es siempre algoritmo + clave... y que un espacio de 25 claves no protege nada.

Antes de cifrar nada de verdad necesitamos deshacer una confusión que causa vulnerabilidades reales a diario: la diferencia entre codificar, ofuscar y cifrar. Base64 aparecerá por todas partes en este curso y no cifra absolutamente nada. Eso es exactamente lo que veremos en la siguiente lección.

© Copyright 2026. Todos los derechos reservados