En criptografía , el relleno es una serie de prácticas distintas que incluyen agregar datos al principio, a la mitad o al final de un mensaje antes del cifrado. En criptografía clásica, el relleno puede incluir agregar frases sin sentido a un mensaje para ocultar el hecho de que muchos mensajes terminan de manera predecible, por ejemplo, sinceramente suyo .
Los mensajes oficiales a menudo comienzan y terminan de manera predecible: Mi querido embajador, Informe meteorológico, Atentamente , etc. El uso principal del relleno con cifrados clásicos es evitar que el criptoanalista use esa previsibilidad para encontrar texto sin formato conocido [1] que ayude a descifrar el cifrado. El relleno de longitud aleatoria también evita que un atacante conozca la longitud exacta del mensaje de texto sin formato.
Un ejemplo famoso de relleno clásico que causó un gran malentendido es el incidente de " las maravillas del mundo ", que casi causó una pérdida aliada en la batalla de la Segunda Guerra Mundial frente a Samar , parte de la batalla más grande del golfo de Leyte . En ese ejemplo, el almirante Chester Nimitz , comandante en jefe de la Flota del Pacífico de EE. UU. en la Segunda Guerra Mundial, envió el siguiente mensaje al almirante Bull Halsey , comandante de la Fuerza de Tarea Treinta y Cuatro (la principal flota aliada) en la Batalla del Golfo de Leyte, el 25 de octubre. , 1944: [2]
¿Dónde está, repito, dónde está el Grupo de Trabajo Treinta y Cuatro? [3]
Con relleno (en negrita) y metadatos agregados, el mensaje se convirtió en:
TURKEY TROTS TO WATER GG FROM CINCPAC ACTION COM THIRD FLEET INFO COMINCH CTF SEVENTY-SEVEN X WHERE IS RPT WHERE IS TASK FORCE THIRTY FOUR RR THE WORLD WONDERS
[3]
El operador de radio de Halsey confundió parte del relleno con el mensaje y la almirante Halsey terminó leyendo el siguiente mensaje:
¿Dónde está, repito, dónde está el Grupo de Trabajo Treinta y Cuatro? El mundo se pregunta [3]
El almirante Halsey interpretó la frase "el mundo se pregunta" como una reprimenda sarcástica, lo que le provocó un arrebato emocional y luego se encerró en su puente y se puso de mal humor durante una hora antes de mover sus fuerzas para ayudar en la batalla frente a Samar. [2] El operador de radio de Halsey debería haber sido avisado por las letras RR de que "las maravillas del mundo" estaban rellenando; todos los demás operadores de radio que recibieron el mensaje del almirante Nimitz eliminaron correctamente ambas frases de relleno. [2]
Muchos cifrados clásicos organizan el texto sin formato en patrones particulares (p. ej., cuadrados, rectángulos, etc.) y si el texto sin formato no encaja exactamente, a menudo es necesario proporcionar letras adicionales para completar el patrón. El uso de cartas sin sentido para este propósito tiene el beneficio adicional de dificultar algunos tipos de criptoanálisis.
La mayoría de las funciones hash criptográficas modernas procesan mensajes en bloques de longitud fija; todas, excepto las primeras funciones hash, incluyen algún tipo de esquema de relleno. Es fundamental que las funciones hash criptográficas empleen esquemas de terminación que impidan que un hash sea vulnerable a ataques de extensión de longitud .
Muchos esquemas de relleno se basan en agregar datos predecibles al bloque final. Por ejemplo, el pad podría derivarse de la longitud total del mensaje. Este tipo de esquema de relleno se aplica comúnmente a algoritmos hash que utilizan la construcción Merkle-Damgård, como las familias MD-5 , SHA-1 y SHA-2, como SHA-224, SHA-256, SHA-384, SHA-512. , SHA-512/224 y SHA-512/256 [4]
El modo de encadenamiento de bloques de cifrado (CBC) es un ejemplo de modo de operación de cifrado de bloques . Algunos modos de cifrado de bloques (esencialmente CBC y PCBC) para algoritmos de cifrado de clave simétrica requieren una entrada de texto sin formato que sea un múltiplo del tamaño del bloque, por lo que es posible que sea necesario rellenar los mensajes para que alcancen esta longitud.
Actualmente hay [ ¿cuándo? ] un cambio para usar el modo de operación de transmisión en lugar del modo de operación de bloque. [ cita necesaria ] Un ejemplo de cifrado en modo de transmisión es el modo de operación del contador . [5] Los modos de operación de transmisión pueden cifrar y descifrar mensajes de cualquier tamaño y, por lo tanto, no requieren relleno. Formas más complejas de finalizar un mensaje, como el robo de texto cifrado o la terminación de un bloque residual, evitan la necesidad de relleno.
Una desventaja del relleno es que hace que el texto sin formato del mensaje sea susceptible a ataques de Oracle con relleno . Los ataques de relleno de Oracle permiten al atacante obtener conocimiento del texto sin formato sin atacar la propia primitiva de cifrado de bloque. Los ataques de relleno de Oracle se pueden evitar asegurándose de que un atacante no pueda obtener conocimiento sobre la eliminación de los bytes de relleno. Esto se puede lograr verificando un código de autenticación de mensaje (MAC) o una firma digital antes de eliminar los bytes de relleno, o cambiando a un modo de operación de transmisión por secuencias.
El relleno de bits se puede aplicar a mensajes de cualquier tamaño.
Se agrega un solo bit '1' al mensaje y luego se agregan tantos bits '0' como sean necesarios (posiblemente ninguno). El número de bits '0' agregados dependerá del límite del bloque al que se debe extender el mensaje. En términos de bits, esto es "1000...0000".
Este método se puede utilizar para rellenar mensajes que tengan cualquier número de bits de longitud, no necesariamente un número entero de bytes. Por ejemplo, un mensaje de 23 bits que se rellena con 9 bits para completar un bloque de 32 bits:
... | 1011 1001 1101 0100 0010 011 1 0000 0000 |
Este relleno es el primer paso de un esquema de relleno de dos pasos utilizado en muchas funciones hash, incluidas MD5 y SHA . En este contexto, se especifica en el paso 3.1 del RFC1321.
Este esquema de relleno está definido por ISO/IEC 9797-1 como Método de relleno 2.
El relleno de bytes se puede aplicar a mensajes que se pueden codificar como un número entero de bytes .
En ANSI X9.23, siempre se agregan entre 1 y 8 bytes como relleno. El bloque se rellena con bytes aleatorios (aunque muchas implementaciones usan 00) y el último byte del bloque se establece en el número de bytes agregados. [6]
Ejemplo: en el siguiente ejemplo, el tamaño del bloque es de 8 bytes y se requiere relleno para 4 bytes (en formato hexadecimal).
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
ISO 10126 (eliminada, 2007 [7] [8] ) especifica que el relleno debe realizarse al final del último bloque con bytes aleatorios, y el límite del relleno debe especificarse en el último byte.
Ejemplo: en el siguiente ejemplo, el tamaño del bloque es de 8 bytes y se requiere relleno para 4 bytes.
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
PKCS#7 se describe en RFC 5652.
El relleno está en bytes completos. El valor de cada byte agregado es el número de bytes que se agregan, es decir, se agregan N bytes, cada uno de los cuales tiene un valor N. La cantidad de bytes agregados dependerá del límite del bloque al que se debe extender el mensaje.
El relleno será uno de:
0102 0203 03 0304 04 04 0405 05 05 05 0506 06 06 06 06 06etc.
Este método de relleno (así como los dos anteriores) está bien definido si y sólo si N es menor que 256.
Ejemplo: en el siguiente ejemplo, el tamaño del bloque es de 8 bytes y se requiere relleno para 4 bytes
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
Si la longitud de los datos originales es un múltiplo entero del tamaño del bloque B , entonces se agrega un bloque adicional de bytes con valor B. Esto es necesario para que el algoritmo de descifrado pueda determinar con certeza si el último byte del último bloque es un byte de relleno que indica el número de bytes de relleno agregados o parte del mensaje de texto sin formato. Considere un mensaje de texto sin formato que es un múltiplo entero de B bytes, siendo el último byte de texto sin formato 01 . Sin información adicional, el algoritmo de descifrado no podrá determinar si el último byte es un byte de texto plano o un byte de relleno. Sin embargo, al agregar B bytes cada uno de valor B después del 01 byte de texto sin formato, el algoritmo de descifrado siempre puede tratar el último byte como un byte de relleno y eliminar el número apropiado de bytes de relleno del final del texto cifrado; dicho número de bytes se eliminará en función del valor del último byte.
El relleno PKCS#5 es idéntico al relleno PKCS#7, excepto que solo se ha definido para cifrados de bloque que utilizan un tamaño de bloque de 64 bits (8 bytes). En la práctica, ambos pueden usarse indistintamente.
El tamaño máximo de bloque es 255, ya que es el mayor número que puede contener un byte.
ISO/IEC 7816 -4:2005 [9] es idéntico al esquema de relleno de bits, aplicado a un texto plano de N bytes. En la práctica, esto significa que el primer byte es un byte obligatorio valorado '80' (hexadecimal) seguido, si es necesario, de 0 a N − 1 bytes establecidos en '00', hasta llegar al final del bloque. ISO/IEC 7816-4 en sí es un estándar de comunicación para tarjetas inteligentes que contienen un sistema de archivos y en sí mismo no contiene ninguna especificación criptográfica.
Ejemplo: en el siguiente ejemplo, el tamaño del bloque es de 8 bytes y se requiere relleno para 4 bytes.
... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |
El siguiente ejemplo muestra un relleno de solo un byte.
... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD 80 |
Todos los bytes que deben rellenarse se rellenan con cero. El esquema de relleno de ceros no se ha estandarizado para el cifrado, [ cita necesaria ] aunque se especifica para hashes y MAC como Método de relleno 1 en ISO/IEC 10118-1 [10] e ISO/IEC 9797-1 . [11]
Ejemplo: en el siguiente ejemplo, el tamaño del bloque es de 8 bytes y se requiere relleno para 4 bytes.
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
Es posible que el relleno con ceros no sea reversible si el archivo original termina con uno o más bytes cero, lo que hace imposible distinguir entre bytes de datos de texto sin formato y bytes de relleno. Puede usarse cuando la longitud del mensaje se puede derivar fuera de banda . A menudo se aplica a cadenas codificadas en binario [ se necesita aclaración ] ( cadena terminada en nulo ), ya que el carácter nulo generalmente se puede eliminar como espacio en blanco .
El relleno de ceros a veces también se denomina "relleno nulo" o "relleno de bytes cero". Algunas implementaciones pueden agregar un bloque adicional de cero bytes si el texto sin formato ya es divisible por el tamaño del bloque. [ cita necesaria ]
En criptografía de clave pública , el relleno es el proceso de preparar un mensaje para cifrarlo o firmarlo utilizando una especificación o esquema como PKCS#1 v2.2, OAEP , PSS , PSSR, IEEE P1363 EMSA2 y EMSA5. Una forma moderna de relleno para primitivas asimétricas es OAEP aplicado al algoritmo RSA , cuando se utiliza para cifrar un número limitado de bytes.
La operación se conoce como "relleno" porque originalmente, simplemente se agregaba material aleatorio al mensaje para que fuera lo suficientemente largo para la primitiva. Esta forma de acolchado no es segura y, por tanto, ya no se utiliza. Un esquema de relleno moderno tiene como objetivo garantizar que el atacante no pueda manipular el texto plano para explotar la estructura matemática de la primitiva y normalmente irá acompañado de una prueba, a menudo en el modelo de Oracle aleatorio , de que romper el esquema de relleno es tan difícil como resolver el problema difícil. problema subyacente a la primitiva.
Incluso si se utilizan rutinas criptográficas perfectas, el atacante puede conocer la cantidad de tráfico que se generó. Es posible que el atacante no sepa de qué estaban hablando Alice y Bob , pero puede saber qué estaban hablando y cuánto hablaron. En algunas circunstancias, esta fuga puede ser muy comprometedora. Consideremos, por ejemplo, cuando un ejército está organizando un ataque secreto contra otra nación: puede ser suficiente alertar a la otra nación para que sepa simplemente que se están llevando a cabo muchas actividades secretas.
Como otro ejemplo, cuando se cifran transmisiones de voz sobre IP que utilizan codificación de velocidad de bits variable, el número de bits por unidad de tiempo no se oculta y esto se puede aprovechar para adivinar frases habladas. [12] De manera similar, los patrones de ráfaga que producen los codificadores de vídeo comunes suelen ser suficientes para identificar de forma única el vídeo en streaming que un usuario está viendo. [13] Incluso el tamaño total de un objeto por sí solo, como un sitio web, un archivo, una descarga de paquete de software o un vídeo en línea, puede identificar de forma única un objeto, si el atacante conoce o puede adivinar un conjunto conocido del que proviene el objeto. [14] [15] [16] El canal lateral de longitud de contenido cifrado se utilizó para extraer contraseñas de las comunicaciones HTTPS en los conocidos ataques CRIME e BREACH . [17]
Rellenar un mensaje cifrado puede dificultar el análisis del tráfico al ocultar la verdadera longitud de su carga útil. La elección de la longitud para rellenar un mensaje puede realizarse de forma determinista o aleatoria; Cada enfoque tiene fortalezas y debilidades que se aplican en diferentes contextos.
Se puede agregar un número aleatorio de bits o bytes de relleno adicionales al final de un mensaje, junto con una indicación al final de cuánto relleno se agregó. Si la cantidad de relleno se elige como un número aleatorio uniforme entre 0 y un máximo de M, por ejemplo, entonces un espía no podrá determinar la longitud del mensaje con precisión dentro de ese rango. Si el relleno máximo M es pequeño en comparación con el tamaño total del mensaje, entonces este relleno no agregará mucha sobrecarga , pero el relleno oscurecerá sólo los bits menos significativos de la longitud total del objeto, dejando la longitud aproximada de los objetos grandes fácilmente observable y por lo tanto, todavía son potencialmente identificables de forma única por su longitud. Por el contrario, si el relleno máximo M es comparable al tamaño de la carga útil, la incertidumbre de un espía sobre el verdadero tamaño de la carga útil del mensaje es mucho mayor, a costa de que el relleno pueda sumar hasta un 100 % de gastos generales ( 2 veces la ampliación) a el mensaje.
Además, en escenarios comunes en los que un espía tiene la oportunidad de ver muchos mensajes sucesivos del mismo remitente, y esos mensajes son similares en formas que el atacante sabe o puede adivinar, entonces el espía puede utilizar técnicas estadísticas para disminuir y eventualmente incluso eliminar el beneficio del relleno aleatorio. Por ejemplo, supongamos que la aplicación de un usuario envía regularmente mensajes de la misma longitud y el espía sabe o puede adivinar los hechos basándose en las huellas digitales de la aplicación del usuario, por ejemplo. Alternativamente, un atacante activo podría inducir a un punto final a enviar mensajes con regularidad, por ejemplo, si la víctima es un servidor público. En tales casos, el espía puede simplemente calcular el promedio de muchas observaciones para determinar la longitud de la carga útil del mensaje normal.
Un esquema de relleno determinista siempre rellena una carga útil de mensaje de una longitud determinada para formar un mensaje cifrado de una longitud de salida correspondiente particular. Cuando muchas longitudes de carga útil se asignan a la misma longitud de salida acolchada, un espía no puede distinguir ni obtener ninguna información sobre la longitud real de la carga útil dentro de uno de estos grupos de longitud , incluso después de muchas observaciones de los mensajes de longitud idéntica que se transmiten. A este respecto, los esquemas de relleno deterministas tienen la ventaja de no filtrar ninguna información adicional con cada mensaje sucesivo del mismo tamaño de carga útil.
Por otro lado, supongamos que un espía puede beneficiarse al conocer pequeñas variaciones en el tamaño de la carga útil, como por ejemplo más o menos un byte en un ataque de adivinación de contraseña. Si el remitente del mensaje tiene la mala suerte de enviar muchos mensajes cuyas longitudes de carga útil varían en solo un byte, y esa longitud está exactamente en el límite entre dos de las clases de relleno deterministas, entonces estas longitudes de carga útil de más o menos uno producirán consistentemente diferentes También se rellenan longitudes (más o menos un bloque, por ejemplo), filtrando exactamente la información detallada que el atacante desea. Contra tales riesgos, el relleno aleatorio puede ofrecer más protección al ocultar de forma independiente los bits menos significativos de la longitud de los mensajes.
Los métodos de relleno deterministas comunes incluyen el relleno hasta un tamaño de bloque constante y el relleno hasta la siguiente potencia mayor de dos. Sin embargo, al igual que el relleno aleatorio con una pequeña cantidad máxima M , el relleno determinista a un tamaño de bloque mucho más pequeño que la carga útil del mensaje oscurece sólo los bits menos significativos de la longitud verdadera de los mensajes, dejando la longitud verdadera aproximada de los mensajes en gran medida desprotegida. Rellenar mensajes a una potencia de dos (o cualquier otra base fija) reduce la cantidad máxima de información que el mensaje puede filtrar a través de su longitud de O (log M ) a O (log log M ) . Sin embargo, el relleno a una potencia de dos aumenta la sobrecarga del tamaño del mensaje hasta en un 100%, y el relleno a potencias de bases enteras más grandes aumenta aún más la sobrecarga máxima.
El esquema PADMÉ, propuesto para blobs aleatorios uniformes acolchados o PURB , rellena de manera determinista mensajes a longitudes representables como un número de coma flotante cuya mantisa ya no es (es decir, no contiene bits más significativos) que su exponente. [16] Esta restricción de longitud garantiza que un mensaje pierda como máximo O (log log M ) bits de información a través de su longitud, como un relleno a una potencia de dos, pero incurre en una sobrecarga mucho menor de como máximo un 12 % para mensajes pequeños y que disminuye gradualmente. con tamaño de mensaje.