Criptografía:
Objetivos, Primitivas y Aplicación

Creative Commons License
“Curso de Introducción a la Criptografía” by Jordi Íñigo Griera is licensed under a
Creative Commons Attribution 4.0 International License.
Project hosted at github.com/jig/crypto

Criptografia: Objetivos

la protección de los mensajes en transmisión a través de medios desprotegidos entre un emisor y un/varios destinatario/s

esta protección debe soportar ataques de una complejidad razonable${}^{\dagger}$


${}^{\dagger}$) hay algoritmos que soportan ataques de complejidad infinita (dan seguridad incondicional) y algoritmos que soportan "sólo" ataques con computación limitada o finita (dan seguridad computacional)

Objetivos

Confidencialidad sólo el legítimo destinatario debe poder ser capaz de leer el contenido del mensaje original. Adicionalmente, nadie, aparte del legítimo destinatario, debe poder ser capaz de extraer ninguna información estadística del mensaje original (a parte de su longitud)
Integridad el destinatario debe ser capaz de verificar que el contenido del mensaje original no ha sido modificado
Autenticidad el destinatario debe ser capaz de verificar que el emisor es realmente el autor del mensaje
No repudio el emisor no debe ser capaz de negar que es el autor del mensaje
Otros acuerdo de claves, partición de secretos, PRNG…

Primitivas criptográficas: tipos

Sin clave el emisor usa sólo el mensaje $m$ como argumento de la función criptográfica
Clave simétrica el emisor usa el mensaje $m$ y una clave $k$ como argumento de la función criptográfica; el destinatario debe conocer esa clave $k$ para invertir la función
Clave asimétrica el emisor usa el mensaje $m$ y una clave $k'$ como argumento de la función criptográfica; el destinatario debe conocer la pareja de esa clave $k''$ para invertir la función
una pareja de la clave (llamada ${k}_{\text{privada}}$) permite calcular la otra pareja (llamada ${k}_{\text{pública}}$) pero la operación inversa és infactible (por ello se conoce también a la criptografía de clave asimétrica como criptografía de clave pública)

Primitivas criptográficas: tipos

Sin clave Hash, Partición de secretos
Clave simétrica Cifrado simétrico, firma simétrica (MAC/HMAC)
Clave asimétrica Cifrado asimétrico, firma asimétrica, acuerdo de clavess

Primitivas criptográficas: sin clave

Hash $r=h(m)$

calcula un resumen $r$ único${}^{\dagger}$ para cada mensaje $m$

para validarlo, debemos aplicar $h(\circ)$ sobre el mensaje $m$ y compararlo con el resumen $r$

$\dagger$) muy probablemente

Primitivas criptográficas: clave simétrica

Cifrado simétrico $\begin{aligned}c &= e_{\text{sim}}(k,m) \\ m &= d_{\text{sim}}(k,c)\end{aligned}$ $e_{\text{sim}}(\circ)$ convierte un mensaje $m$ (texto en claro) en su versión cifrada $c$ (texto cifrado);
$d_{\text{sim}}(\circ)$ devuelve el mensaje $m$ a partir de $c$ (sii se conoce la $k$ que se usó para generar $c$)
Firma simétrica $t = \text{HMAC}(k, m)$ devuelve un resumen $t$ (o etiqueta o firma) para el mensaje $m$;
para validarse, debemos conocer $k$ (y el mensaje $m$) y aplicar la misma función

Primitivas criptográficas: clave asimétrica

Cifrado asimétrico $\begin{aligned}c &= e_{\text{asim}}(k_{\text{pública}},m) \\ m &= d_{\text{asim}}(k_{\text{privada}},c)\end{aligned}$ $e_{\text{asim}}(\circ)$ convierte un mensaje $m$ (texto en claro) en su versión cifrada $c$ (texto cifrado);
$d_{\text{asim}}(\circ)$ devuelve el mensaje $m$ a partir de $c$ sii se conoce $k_{\text{privada}}$
Firma asimétrica $\begin{aligned}f &= e_{\text{asim}}(k_{\text{privada}},m) \\ m &= d_{\text{asim}}(k_{\text{pública}},f)\end{aligned}$ $e_{\text{asim}}(\circ)$ devuelve el mensaje "cifrado" $f$ (firma) para el mensaje $m$;
para validarse, debemos conocer $k_{\text{pública}}$ y la firma $f$, y aplicar $d_{\text{asim}}(\circ)$

objetivos $\rightarrow$ primitivas

confidencialidad cifrado simétrico, cifrado asimétrico
integridad hash, firma simétrica, firma asimétrica
autenticidad firma simétrica, firma asimétrica
no repudio firma asimétrica
compartir clave simétrica acuerdo de clave

Composición

Habitualmente no usamos una única primitiva/función criptográfica por/para:

objetivos múltiples me interesa confidencialidad, integridad y autenticidad simultáneamente para la transmisión del mensaje $m$
eficiencia los algoritmos simétricos son varios órdenes de magnitud más rápidos que los asimétricos
robustez muchas primitivas (individuales) no devuelven error en caso de que algo vaya mal (una firma asimétrica simplemente devuelve un mensaje firmado distinto)
secuencias de mensajes nos interesa proteger no sólo los mensajes individuales si no secuencias de mensajes $\{m_1, m_2 \dots m_n \}$ o diálogos $\{m_{a_1}, m_{b_1}, m_{a_2}, m_{b_2} \dots \}$ u otros tipos de combinaciones de mensajes

Ejemplo de Composición 1/4: firma práctica

En caso de que queramos que un documento firmado lo pueda verificar cualquiera, usaremos firma asimétrica .

Pero es muy ineficiente (muy lenta) en comparación a componer:

firma asimétrica $+$ hash

Así: $\begin{aligned} r &= \text{hash}(m) \\ f &= e_{\text{asim}}(k_{\text{privada}}, r) \end{aligned}$

Nota 1: con $e_{\text{asim}}(\circ)$ sólo tratamos $r$, que mide unos pocos bytes

Nota 2: Ahora debemos enviar la firma $f$ junto con el mensaje $m$ (usaremos la notación $m\|f$ para concatenar) para que el destinatario pueda realizar la validación (no basta con $d_{\text{asim}}(\circ)$ ya que sólo nos devolvería el resumen/hash $r$, no el mensaje original $m$)

Ejemplo de Composición 2/4: cifrado práctico

En caso de queramos cifrar un documento, para que sólo lo pueda descifrar el legítimo destinatario, lo podemos hacer de forma eficiente:

cifrado asimétrico $+$ cifrado simétrico

Así: $\begin{aligned} k &= \text{\{nueva clave generada por el emisor\}} \\ k_c &= e_{\text{asim}}(k_{\text{pública}}, k) \\ c &= e_{\text{sim}}(k, m) \end{aligned}$

Nota: con $e_{\text{asim}}(k_{\text{pública}},\circ)$ sólo tratamos $k$, que mide unos pocos bytes

Ahora debemos enviar la clave cifrada asimétricamente $k_c$ junto con el mensaje cifrado $c$ ($k_c \| c$); el destinatario debe primero descifrar la clave simétrica (mediante $d_{\text{asim}}(k_{\text{privada}},k_c)$) y luego puede descifrar simétricamente el mensaje cifrado $c$ (mediante $d_{\text{sim}}(k, c)$)

Ejemplo de Composición 3/4: cifrado y firmado

En el caso de queramos cifrar y firmar asimétricamente combinaremos las dos combinaciones de primitivas anteriores

Atención: se debe tener en cuanta que:

  • la clave privada del emisor se usa para firmar
  • la clave privada del receptor se usa para descifrar

firma asimétrica $+$ hash & cifrado asimétrico $+$ cifrado simétrico

El mensaje enviado es el resultado de:

$\begin{aligned} r &= \text{hash}(m) \\ f &= e_{\text{asim}}(k_{\text{privada-autor}}, r) \\ k &= \text{\{nueva clave generada por el emisor\}} \\ k_c &= e_{\text{asim}}(k_{\text{pública-destinatario}}, k) \\ c &= e_{\text{sim}}(k, m\|f) \end{aligned}$

y enviamos: $k_c \| c$

Alternativamente se puede cifrar y luego firmar:

$\begin{aligned} k &= \text{\{nueva clave generada por el emisor\}} \\ k_c &= e_{\text{asim}}(k_{\text{pública-destinatario}}, k) \\ c &= e_{\text{sim}}(k, m) \\ r &= \text{hash}(k_c \| c) \\ f &= e_{\text{asim}}(k_{\text{privada-autor}}, r) \end{aligned}$

y enviamos: $k_c \| c \| f$

Ejemplo de Composición 4/4: secuencia de mensajes

Nos centramos en integridad (autenticidad, confidencialidad y no repudio se consiguen individualmente)

se usa el concepto de secuencia de mensajes o sesión

la sesión protege de que los mensajes (integridad de sesión):

  • no se pierdan
  • no se dupliquen
  • y no se desordenen

las primitivas criptográficas anteriores no cumplen con estos objetivos (e.g. un atacante borrando un mensaje no tiene contramedida); puede considerarse la sesión como una primitiva criptográfica adicional

se puede solucionar con:

  • añadiendo un identificador de secuencia $\{1\|m_1, 2\|m_2 \dots \}$
  • añadiendo el hash del mensaje anterior $\{m_1, \text{hash}(m_1)\|m_2, \text{hash}(m_2)\|m_3 \dots \}$

no es posible perder mensajes, duplicarlos o desordenarlos sin detectarlo… a excepción de un caso:

si eliminamos mensajes del final, no lo detectamos

podemos corregir el problema añadiendo una señal de final. Si no la recibimos, es que se han perdido uno (o más) mensajes del final (bit more o mensaje de final)

Protocolo

La secuenciación de mensajes y la composición de primitivas se materializa en un "protocolo"

El protocolo (el lenguaje) se define a partir de:

  • Formatos/estructuras de los mensajes o "sintaxis" (funciones/algoritmos, secuenciación)
  • "Máquina de estados" (que tipos de mensajes son posibles después de otros)
  • Especificación del significado de mensajes y/o estado, "semántica"

el protocolo es un eslabón de la cadena de seguridad, tan importante como pueden ser las primitivas (o sea , los algoritmos criptográficos)

Protocolos: ejemplos

TLS (SSL), SSH, VPN

PKCS #7, AdES, w'flow

Git, Docker

JWT tokens

download, ISO

$\vdots$

firma y cifrado, secuenciación

firma y cifrado, semántica (razón de firma)

resumen encadenado (integridad de BB.DD., append)

firma simétrica o asimétrica

resumen

$\vdots$

Protocolos: tipos

  • Transmisión interactiva: TLS, VPN, SSH, etc. autentican los extremos, cifran el tráfico y impiden alteración del encadenamiento de mensajes
  • Transmisión no interactiva: PKCS #7, S/MIME (correo), autentica el origen, cifrado de contenido
  • Almacenamiento: disco, BB.DD., BB.DD. documentales (Git, etc.), etc. dan integridad mediante encadenamiento de hashes (Git, Docker) o integridad y confidencialidad con firma y cifrado simétricos

Seguridad

la fortaleza (o debilidad) de la criptografía depende de todos los eslabones de la cadena

  • algoritmos (diseño, criptoanálisis)
  • algoritmos (dimensionado, longitud de claves, security strength)
  • protocolos (estructura, secuenciación)
  • implementación (condiciones de uso, abuso de buffers, abuso de la máquina de estados)

Objetivos: "otros"

  • Acuerdo de claves: permite que un grupo de actores generen un número (pseudo) aleatorio sin que nadie externo al grupo pueda conocerlo
  • Partición de secretos: permite repartir un secreto entre un grupo de actores, exigiendo un mínimo de actores para recomponerlas
  • PRNG (Pseudo Random Number Generation): permite generar una secuencia aparentemente aleatoria para cualquiera que no conozca la semilla
  • etcétera

Algoritmos: ejemplos

hash SHA-2; SHA-3
cifrado simétrico AES; ChaCha20
firma simétrica HMAC (SHA-2/3); ECBC-MAC (AES); Poly1305
cifrado asimétrico RSA
firma asimétrica RSA; ECDSA
acuerdo de claves Diffie-Hellman
partición de secretos Shamir split
PRNG AES; ChaCha20; SHA-2; SHA-3

Composición… de composición: PKI

PKI: Public Key Infrastructure

¿la clave pública $k_{\text{pública}}$ de quién es?

(Introducción/Historia) $\rightarrow$