Códigos de autenticación de mensaje basados en cipfradores de bloque
Cipher Block Chaining Message Authentication Code
podemos utilizar directamente una función de cifrado de bloque, así:
$t = e(k, m)$
Nota: no podemos utilizar cifrado de flujo (directamente), ya que el cálculo de $k$ sería trivial; pero sí que podemos usar AES-128-ECB
$t = e(k, m)$
esta construcción tiene una limitación:
sólo podemos autenticar mensajes de la longitud del bloque
derivado del modo de operación CBC (Cipher Block Chaining)
(basado en Wikipedia)
pero en lugar de utilizar un $\text{IV}$, iniciaremos la cadena con $0$ (equivalente a $\text{IV}=0$)
pero rawCBC-MAC es inseguro...
...rawCBC-MAC es inseguro ya que un atacante puede combinar mensajes buenos para generar otros aparentemente "buenos"
para evitar el problema podemos cambiar el $\text{IV}=0$ por la longitud del mensaje $\text{IV}=\ell$
...o habitualmente lo que se hace es utilizar una segunda clave para cerrar el cálculo y impedir el
concatenado
(ECBC: Encrypted CBC)
(basat en Wikipedia)
ECBC-MAC es seguro mientras sea improbable encontrar una colisión
la probabilidad de colisión es cercana a $0.5$ para una cantidad de bloques generados de aproximadamente $\sqrt{|\text{bloque}|}$
e.g. en el caso de AES el bloque es de $128$ b, por tanto, no podremos usar la misma clave:
$\text{ops} \ll \sqrt{2^{128}} = 2^{64}$
(valores aceptados para una clave AES-128/192/256:
$2^{48}$ mensajes autenticados)
Poly1305-AES: longitud $\|t\| = 128 \text{b}$
Poly1305-ChaCha20: longitud $\|t\| = 128 \text{b}$
estas dos funciones se utilizan juntas frecuentemente
enviaremos la concatenación $(c, t)$ donde:
$\begin{aligned}
c &= e(k_e, m) \\
t &= \text{MAC}(k_t, c)
\end{aligned}$
Nota: hacer $t = \text{MAC}(k_t, \color{red}{m})$ no garantiza que la función MAC no revele ningún de detalle de $m$ (en realidad sí lo hace: si dos mensajes son iguales, un atacante lo sabrá simplemente inspeccionando $t$ y $t'$
Authenticated Encryption with Associated Data
(Authenticated Encryption o AEAD)
Históricamente ha habido errores concatenando el cifrado y la firma
Con los algoritmos AEAD se trata de ofrecer primitivas combinadas que dan confidencialidad, integridad y autenticidad en un único algoritmo simétricoAdicionalmente, la implementación combinada permite mayor rendimiento