La operación en el núcleo de RSA es una exponenciación modular: dada la entrada m , computar me módulo n . Aunque en general esta es una permutación unidireccional de enteros modulo n , no cumple todas las características necesarias para el cifrado asimétrico genérico:
-
Si e es pequeño y m es pequeño, entonces me podría ser más pequeño que n , en cuyo punto la exponenciación modular ya no es modular y se puede revertir de manera eficiente.
-
La operación es determinista, lo que permite una búsqueda exhaustiva en el mensaje : el atacante cifra los mensajes posibles hasta que se encuentra una coincidencia con el mensaje cifrado real.
-
La exponenciación modular es maleable: dado el "cifrado" de m1 y m 2 , una simple multiplicación produce el cifrado de m1m2 . Esto es similar a cifrado homomorfo , que puede ser una buena propiedad, o no, según el contexto.
Por este motivo, el entero m que está sujeto a RSA no debe ser el dato para cifrar solo, sino que debe ser el resultado de una transformación que garantice que m es "no pequeño", contiene algunos bytes aleatorios y disuade a la maleabilidad.
El relleno "v1.5" en PKCS # 1 hace el trabajo razonablemente bien, sujeto a dos advertencias (conocidas):
-
Un motor de descifrado se puede convertir en un oráculo de relleno si el atacante puede enviar mensajes maliciosos para descifrar, y observe si el motor de descifrado encontró una estructura de relleno correcta o no. Este es el ataque de Bleichenbacher, que podría funcionar contra el servidor SSL, requiriendo alrededor de un millón de apretones de manos abortados para recuperar la clave simétrica de SSL. Desde entonces, los servidores SSL han sido parcheados (si el descifrado no encuentra un relleno, el motor continúa con un blob aleatorio en lugar del "secreto maestro previo"), pero esto resalta un problema potencial con PKCS # 1 v1.5.
-
Este esquema de relleno nunca fue "probado". Las pruebas de seguridad son una buena cosa para tener. En mi opinión, este relleno tiene algo mejor, que es que se ha implementado en el campo y se ha utilizado ampliamente durante casi 20 años; pero muchas personas lo prefieren cuando hay algunas matemáticas que corroboran la experiencia.
OAEP tiene como objetivo mejorar las cosas en estos dos puntos. Resultó que para los oráculos de relleno, las cosas no están tan claras ; y la primera prueba se mostró algo equivocada por Shoup. La prueba fue "reparada" por Fujisaki, Okamoto, Pointcheval y Stern en el caso de RSA (OAEP se diseñó como un esquema de relleno genérico, pero ahora tenemos una prueba de seguridad solo cuando se utiliza con RSA).
Para resumir , OAEP intenta mejorar sobre el relleno anterior para la resistencia contra ataques de texto cifrado elegidos (no ataque de texto simple elegido : desde la clave pública es pública, cualquiera puede cifrar cualquier cosa a voluntad), pero el relleno v1.5 ya era heurísticamente bueno en eso, hasta un millón o más de descifrado, lo cual es suficiente para muchos propósitos, y puede ser parcheado para otros (como se hizo para SSL). OAEP funciona mejor si se implementó correctamente , lo cual no es tan fácil como se suele creer.