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)
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… |
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) |
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 |
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 |
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 |
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)$ |
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 |
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 |
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$)
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)$)
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:
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$
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):
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:
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)
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:
el protocolo es un eslabón de la cadena de seguridad, tan importante como pueden ser las primitivas (o sea , los algoritmos criptográficos)
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$ |
la fortaleza (o debilidad) de la criptografía depende de todos los eslabones de la cadena
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 |
PKI: Public Key Infrastructure
¿la clave pública $k_{\text{pública}}$ de quién es?