Los esquemas de relleno nacen debido a que algunos sistemas de cifrado y las funciones Hash necesitan completar el tamaño del bloque, ya que no todos los mensajes en claro coinciden con un múltiplo del tamaño del bloque. Existe un pequeño inconveniente, incluso si el mensaje original contiene el número de bytes correcto se debe agregar relleno para completar el proceso, por lo general, se agrega un nuevo bloque que solo contendrá bytes sin valor. Existen tres formas simples de relleno y otras de mayor complejidad.
Relleno por bits.
Se agrega un solo bit con valor ‘1’ al mensaje y luego tantos bits a ‘0’ hasta completar el bloque. Existen distintas formas de llevarlo a cabo, algunas de ellas están recogidas en un formato seudo normativo como: RFC, PKCS, IETF o verdaderamente normalizadas como las ISO/IEC. De todas formas el relleno más conocido es el que utiliza la congruencia 448, módulo 512, es decir, el mensaje se extiende para que tenga 64 bits menos que un múltiplo de 512 bits. Cuando se trata de procesar mensajes de tamaño variable, en cifrados por bloques, se suele utilizar el relleno ISO / IEC 9797-1.
Relleno por bytes.
Para el relleno por bytes se siguen los mismos caminos normativos que para el relleno por bits:
- ANSI X.9.23. Los bytes necesarios se rellenan con ceros (0) y el último byte define el número de bytes rellenados.
- ISO 10126. Obsoleto, rellena el último bloque con bytes aleatorios y el último byte define el número de bytes rellenados.
- PKCS7 – RFC 3852. El valor de cada byte de relleno es el número de bytes que se agregan.
Algunos ejemplos:
- ANSI X9.23. El último byte del relleno (el último byte del bloque) es el número de bytes de relleno. Todos los demás bytes del relleno son ceros.
Por ejemplo: 0xBA 0x10 0x25 0x26 0x33 0xBA 0x00 0x00 0x03
- ISO 7816-4. El primer byte del relleno es 0x80. Todos los demás bytes del relleno son ceros. Tal construcción permite crear rellenos de cualquier tamaño.
- ISO 10126-2. El último byte del relleno (por lo tanto, el último byte del bloque) es el número de bytes de relleno. Todos los demás bytes del relleno son algunos aleatorios.
Por ejemplo: 0xBA 0x10 0x25 0x26 0x33 0xBA 0x06 0x33 0x03
- PKCS-5 y PKCS-7. El valor de cada byte de relleno es el número total de bytes que se agregan. Si el mensaje es 6 bytes más corto que un múltiplo entero del tamaño del bloque, entonces debemos agregar 6 bytes de relleno, cada uno de ellos con un valor 6.
Por ejemplo: 0xBA 0x10 0x25 0x26 0x33 0xBA 0x06 0x06 0x06 0x06 0x06 0x06
Zero Padding
Todos los bytes que se deben rellenar se rellenan con cero. Si el archivo original termina con uno o más bytes cero, tenemos un problema, es imposible distinguir entre bytes de datos del texto en claro y los de relleno.
OAEP (+, 3R, 4X) (Optimal Asymmetric Encryption Padding).
OAEP fue presentado por Mihir Bellare y Phillip Rogaway en 1.994, más tarde en 1.998 se incluyó en el RFC 2437. Victor Shoup, en 2.001, describió una modificación llamada OAEP +, que estudia la conversión de cualquier permutación de una vía (f) en un sistema de seguridad de texto cifrado en el modelo “oráculo” aleatorio.
En 2.003, Duong Hieu Phan y David Pointcheval introducen OAEP-3R. En 2008, Masayuki Abe, Eike Kiltz y Tatsuaki Okamoto demuestran que la reducción de seguridad de OAEP-3R hace que la sobrecarga de texto cifrado sea 2t, introducen OAEP-4X, que reduce la sobrecarga del texto cifrado de t-bit con respecto a OAEP-3R , pero solo tiene una aplicación práctica limitada en una red muy restringida de ancho de banda, por lo tanto, para aplicaciones generales la reducción de la sobrecarga de texto cifrado por t-bits es un caso menos interesante.
En principio, OAEP y OAEP+ tienen mecanismos análogos, utilizan un generador aleatorio r para modificar una entrada m: m’ = OAEP (m) = F(m, r), donde m’ se reenvía a la función de cifrado. En el caso de RSA, el cifrado del mensaje m ahora da como resultado c = RSA(e, n) (OAEP (m, r)), donde (e, n) es la clave pública del receptor. Al aplicar esta modificación a m, OAEP y OAEP + proporcionan las siguientes propiedades:
- Cifrado probabilístico: al agregar aleatoriedad, el esquema de cifrado determinístico (por ejemplo, RSA) se convierte en un esquema de cifrado probabilístico. En otras palabras: idéntico texto en claro ahora resultará en diferentes textos cifrados.
- Seguridad de todo o nada (AONS): el objetivo de AONS es evitar el descifrado parcial de los textos cifrados (u otra fuga de información) asegurando que un atacante no pueda recuperar cualquier parte del texto en claro m sin conocer todos los bits de m’.
Las entradas m tienen una longitud de n – k0 – k1 bits respectivamente. El generador de aleatorios r (longitud k0 bits se eligen internamente al azar). El valor k1 está determinado por la función hash empleada y m se rellena hasta la longitud n – k0 con ceros en el caso de OAEP y mediante el uso de la función H’ en el caso de OAEP +. La longitud de salida para ambos, OAEP y OAEP +, es n bit.
La función G es la llamada función de generación de máscara que expande una semilla en la entrada a un valor de máscara de longitud adecuada. Sea s la entrada de G. La salida de G es una cadena de bits t obtenida mediante la concatenación de valores hash sucesivos Hash(s || i) con 0 ≤ i <⌈t / L⌉ con L comenzando la salida de la función hash.
