Taller de Criptografía - Informe 3

Los entresijos del firmado digital


 

Finales de 1997


En un informe anterior se pasó revista a la utilidad y debilidades de los algoritmos de cifrado de datos más utilizados. Un punto menos comentado es la robustez de los sistemas de firmado digital de documentos, no por ello menos importante.

En primer lugar, ¿qué es una firma digital? Básicamente, es un conjunto de caracteres que ligan un documento digital con una clave de cifrado. Cuando se desarrollaron los códigos criptográficos actuales, se cayó en la cuenta que no solamente sirven para cifrar, sino para autentificar mensajes. El mecanismo es el siguiente: elijo un conjunto de caracteres del texto, lo cifro con mi clave secreta y lo añado al propio mensaje. Evidentemente, solamente yo podré descifrar ese conjunto de caracteres; pero no es eso lo que importa (dichos caracteres pueden ser simples letras elegidas al azar), sino el hecho de que solamente yo puedo ser capaz de tal cosa. De ese modo se tiene un conjunto de bits asociados conmigo por medio de mi clave secreta. Pero como depende también del conjunto de caracteres (llamado revoltillo, resumen o "hash"), está asimismo ligado al mensaje: copiar una firma dada en otro mensaje no sirve de nada, ya que la clave pública del receptor comprueba que la firma digital a) ha sido generada con la clave secreta del autor y b) se corresponde con el texto del mensaje actual.

Para que este esquema tenga éxito, es preciso una función "hash" que elija fragmentos adecuados del texto a cifrar. Evidentemente, no sirve cifrar las cuatro primeras palabras del mensaje, ya que podría usarse esa firma en otro mensaje cuyas tres primeras palabras sean iguales. Es como un cheque donde no se pueden cambiar las palabras "páguese la cantidad de...", pero sí el resto. Por otro lado, ¿por qué no cifrar todo el mensaje? Puede hacerse, pero este procedimiento podría doblar fácilmente el tamaño del mensaje. Tampoco es aconsejable: el ataque principal contra el sistema de cifrado RSA consiste en firmar un mensaje cuidadosamente escrito por el atacante; eso puede permitirle averiguar la clave secreta del firmante.

Lo que se ha de firmar es un "resumen" o "revoltillo" (hash) representativo del mensaje particular, que solamente pueda generarse mediante la clave secreta del firmante y mediante el mensaje, y que no sea de longitud excesiva. Así que no sirven sistemas que puedan generar firmas iguales para mensajes distintos. Tampoco puede admitirse un hash que filtre información sobre el mensaje; si se puede reconstruir el mensaje a partir del hash se podría obtener un segundo mensaje con el mismo hash.

En lo que sigue, permitidme que rompa una lanza en favor de nuestro querido idioma usando el castizo "revoltillo" en vez del anglosajón "hash" para designar un conjunto de bits seleccionados del mensaje. A veces se utiliza la palabra "digest". También se puede traducir como "resumen" o "función resumen", pero soy un travieso y confieso que me encanta eso del "revoltillo".

Para sistematizar todo esto: supongamos que M es un mensaje, h el revoltillo del mensaje y H la función que, a partir de M, da como resultado h. Podemos describirlo como h=H(M). La función H ha de cumplir las siguientes condiciones:

    + Comodidad. Para un mensaje M dado, ha de ser fácil obtener h
    + Confidencialidad. Para un revoltillo h dado, ha de ser difícil obtener el mensaje M tal que h=H(M)
    + No-colisión (débil). Para un mensaje M dado, ha de ser difícil (imposible, si cabe) encontrar un segundo mensaje M´con el mismo revoltillo, esto es, que H(M)=H(M´). Cuando esto ocurre se dice que ha ocurrido una colisión.
    + No-colisión Ha de ser difícil encontrar al azar dos mensajes M y M´ con el mismo revoltillo.

Sencillo, ¿no? Pues, a juzgar por el panorama, no lo parece. Tenemos algoritmos sólidos y eficaces para cifrado de documentos, pero por alguna razón el esquema de una función revoltillo que cumpla las condiciones antedichas es mucho más difícil de encontrar. Estos son los principales algoritmos revoltillo que existen:

    MD2 (Message Digest 2). Se diseñó para ordenadores con procesador de 8 bits, y hoy apenas se utiliza. Se conocen ataques a versiones parciales de MD2.

    MD4 (Message Digest 4). Fue desarrollado por Ron Rivest, de RSA Data Security. Su diseño es la base de otros revoltillos, aunque se le considera inseguro. Un ataque desarrollado por Hans Dobbertin permite generar colisiones (mensajes aleatorios con los mismos valores de revoltillo) en cuestión de minutos para cualquier PC. Por ese motivo, está en desuso.

    MD5 (Message Digest 5). También fue creado por Ron Rivest. Hasta hace poco se consideraba un algoritmo de revoltillo seguro, hasta tal punto que es el utilizado en el programa de cifrado PGP para firmar mensajes con claves de tipo RSA; también se utiliza como autentificador de mensajes en el protocolo SSL. Sin embargo, en 1996 el mismo Hans Dobbertin que reventó MD4 consiguió demostrar que la función de compresión del algoritmo MD5 es insegura, consiguiendo colisiones en ese caso. Sus ataques son parciales y no pueden extenderse a la totalidad del algoritmo MD5. Asimismo hay que resaltar que estos ataques comprometían la propiedad de no-colisión. Esto significa que se puede obtener idéntico revoltillo para dos mensajes obtenidos al azar, pero queda por demostrar que se pueda encontrar un mensaje con igual revoltillo a otro mensaje concreto; es decir, el revoltillo del mensaje que yo he firmado sigue siendo único. Con todo, resulta inquietante que un algoritmo de revoltillo considerado seguro tenga tales puntos flacos. A menos que se le refuerce, su uso irá decreciendo en el futuro.

    RIPEMD-160 (RIPE Message Digest). Fue desarrollado por un grupo europeo encabezado por Hans Dobbertin (sí, el revientarevoltillos), Antoon Bosselaers y Bart Preneel, dentro del proyecto RIPE (RACE Integrity Primitives Evaluation). Su versión primera (RIPEMD) causaba colisiones del mismo tipo de las de MD4 y MD5. Posteriormente se reforzó y se llamó RIPEMD-160. Al contrario que la mayoría de los algoritmos (que dan revoltillos de 128 bits), RIPEMD-160 crea un revoltillo de 160 bits. Existe una versión de 128 bits, y se planean versiones con revoltillos de 256 y 320 bits. Es uno de los algoritmos de revoltillo más rápidos, no está patentado y su código fuente es de libre acceso. Por el momento, se le considera seguro.

    SHA-1 (Secure Hash Algorithm). Fue desarrollado como parte del Estándar de Revoltillo Seguro (Secure Hash Standard, SHS) y el Estándar de Cifrado Digital (Digital Signature Standard, DSS) por la Agencia de Seguridad Nacional norteamericana (NSA). A pesar de su origen, parece un revoltillo seguro y sin fisuras, al menos por ahora. La primera versión, conocida como SHA, fue mejorada como protección ante un tipo de ataque que nunca fue revelado. El documento FIPS (Federal Information Processing Standard) que oficialmente lo describe afirma que los principios subyacentes al SHA-1 son similares a los del MD4 de Rivest (esperemos que no en lo referente a la vulnerabilidad). Su implementación "puede estar cubierta por patentes en EEUU y el extranjero". A falta de ataques ulteriores, se le puede considerar seguro. Es el algoritmo de firmado utilizado por el programa PGP en sus nuevas claves DH/DSS (que significa: cifrado mediante clave Diffie-Hellman y firmado mediante función revoltillo Digital Signature Standard).

No se suele pensar mucho en el firmado digital cuando se considera la seguridad global de un protocolo criptográfico. Muchos usuarios se preocupan solamente de tamaños de clave y procedimientos de cifrado, con la idea de que sus mensajes permanezcan secretos, y consideran el firmado de mensajes como una curiosa pero poco importante cualidad, al igual que esos botones del mando a distancia cuya función no nos preocupamos de aprender. Pero, si bien pocas veces nos vemos en la necesidad de cifrar nuestros datos, sí es importante autentificarlos.

Al hacer un pedido a una cibertienda por correo electrónico, importa relativamente poco que los datos vayan cifrados (a no ser que incluyamos información sensible como números de cuenta corriente); pero es imprescindible tener un medio de certificar que he enviado ese mensaje. Si compro la tostadora de 5.000 pts. y el vendedor se empeña en que mi mensaje pedía el televisor de 50.000 pts, ¿cómo puedo demostrar lo contrario? Y al revés, si yo soy el vendedor, ¿cómo sé que el comprador no se va a echar atrás alegando que jamás envió ese mensaje? Las cabeceras de los mensajes no constituyen ninguna prueba (son demasiado fáciles de falsificar o alterar). ¿Cómo convencer al jefe de que ese mensaje electrónico que menciona a su madre en términos poco favorables no lo he escrito yo?

En algunos estados norteamericanos, la firma digital se acepta como elemento de prueba en iguales términos que la firma autógrafa en papel. En España se acepta un fax como documento vinculante, a pesar de que resulta un juego de niños digitalizar una firma (!o fotocopiarla!) y adosarla a otro documento, de manera que ¿por qué no aceptar firmas digitales sin están convenientemente construidas? Por desgracia, no podremos efectuar tal cosa hasta que dispongamos de un procedimiento seguro de creación de firmas digitales. Y sin un algoritmo de revoltillo (hash) adecuado, la situación resulta algo "revuelta" (pido perdón por este chiste, pero no he podido evitarlo).

 


© Arturo Quirantes 2005.  Correo electrónico: aquiran arroba ugr.es


 

Vuelta a la sección Informes del Taller de Criptografía