Curso sencillo de PGP
Capítulo 1: El cifrado, en pocas palabras


por Arturo Quirantes Sierra



1.1 - Conceptos en criptografía

Según el manual "Introduction to Cryptography" que acompaña al programa PGP, "la criptografía es la ciencia de usar las matemáticas para cifrar y descifrar datos" ¿Y qué es cifrar? Todos tenemos alguna idea de lo que significa. Para nuestros fines, cifrar o encriptar [encrypt] es el proceso de transformar un texto conocido (texto llano [plaintext]) en un batiburrillo de datos que sean ininteligibles (texto cifrado [ciphertext]) para cualquiera que no posea una clave de cifrado [encryption key]. El proceso inverso de reconstruir el texto original partiendo del texto cifrado y de una clave de descifrado [decryption key] es el descifrado o desencriptación [decryption]

El proceso de cifrado está basado en un algoritmo matemático (un conjunto de procesos matemáticos) y en una clave (que, dado el algoritmo y el texto llano, nos da el texto cifrado); puede verse como la cerradura y la llave, respectivamente. Veamos un ejemplo. Una de los métodos de cifrado más antiguos es el llamado cifrado de César, consistente en desplazar todas las letras del alfabeto en una cantidad conocida. Si el desplazamiento es, digamos cinco, eso significa que la letra A se transforma en la F (la letra que hay cinco posiciones a la derecha de la A en el alfabeto), la B en la G, la C en la H, y así sucesivamente. Es decir, convertimos cada letra de texto llano (primera fila) en una letra de texto cifrado (segunda fila) de acuerdo con la siguiente secuencia:

donde hemos supuesto que tras la Z viene la A. De este modo, JULIOCESAR se convierte en OAQNTHJYFX. Podemos denotar la clave como cinco (número de posiciones a desplazar); el algoritmo sería simplemente la sustitución de una letra por la que hay x posiciones a la derecha (x es la clave). Para descifrar, no hay más que tomar el texto cifrado y sustituir cada letra por la que hay cinco posiciones a su izquierda (la O se convierte en la J, la A en la U...). Si usamos dígitos binarios en lugar de letras, podremos utilizar el sistema de César para cifrar todo tipo de archivos informáticos (documentos de texto puro, con códigos de formato, incluso archivos ejecutables).

El sistema cesariano ya no se utiliza debido a la sencillez con la que se puede romper (si bien Julio César lo utilizó con éxito durante su campaña de las Galias). Romper [break], o más correctamente, criptoanalizar [cryptanalyze] es la ciencia de obtener el texto llano a partir del texto cifrado sin conocer la clave, o bien de obtener la propia clave a través de texto llano, cifrado o de donde sea. El método de cifrado de César no es seguro porque resulta fácil presa del criptoanálisis.

Para empezar, es susceptible de un ataque de fuerza bruta, consistente simplemente en probar todas las posibles claves. Igual que si probásemos todas las combinaciones de una caja fuerte. Utilizando el alfabeto apuntado anteriormente, solamente tenemos veinticinco posibles claves (naturalmente, desplazar una letra veintisiés posiciones da igual resultado que desplazarla uno solo), lo que nos permite probar todas las combinaciones de forma cómoda. El número de posibles claves se conoce como espacio de claves [key space].

En segundo lugar, el texto cifrado "filtra" información acerca del texto llano. Si contamos todas las letras de un texto normal en la mayoría de los idiomas occidentales, veremos que la letra E es la más frecuente. Comprobar la frecuencia de las letras del texto cifrado y compararlas con la frecuencia típica de las letras en el alfabeto en el que está escrito el texto llano nos permite obtener fácilmente la clave. En el ejemplo anterior, los textos cifrados con la "clave cinco" contendrían en promedio más veces la letra J que los demás; esto se debe a que la J representa a la letra E, que aparece más frecuentemente en el texto llano.

Para que este ataque sea eficaz, se requiere un texto cifrado que sea lo bastante largo, ya que si no la frecuencia de las letras del texto podría no coincidir con las del alfabeto. El texto cifrado LAFIFQFOFXF contiene cuatro F; si suponemos que la F cifrada corresponde con la E sin cifrar, podríamos reconstruir la clave (un desplazamiento hacia la derecha para el cifrado). Obtenemos por tanto el texto llano KZEHEPENEVE. O se trata del nombre de un pueblo ucraniano, o hemos metido la pata. El texto llano verdadero (cifrado con clave cinco) corresponde a la palabra GUADALAJARA. Moraleja: cuanto más texto cifremos con una clave concreta, tanto más vulnerable es a un ataque criptoanalítico.

Naturalmente, la clave de César puede complicarse, pero también las herramientas de los criptoanalistas son ahora más eficades y poderosas. Esto ha dado lugar a una batalla continua entre criptógrafos (que diseñan algoritmos de cifrado resistente al criptoanálisis) y criptoanalistas (empeñados en reventar cualquier tipo de cifrado) muy similar a la lucha entre la espada y el escudo.

Se suele denominar complejidad [complexity] al conjunto de operaciones que tenemos que realizar para criptoanalizar el sistema, medidos en "unidades" de clave, es decir, respecto al número de operaciones que requeriría probar con una sola clave; si la complejidad es menor que el espacio de claves, significa que existen métodos más eficientes para "romper" un mensaje que la mera búsqueda exhaustiva de todas las claves posibles. Cualquiera de estos métodos se denomina ataque criptoanalítico, o ataque; se dice entonces que el sistema ha sido criptoanalizado. Por su parte, un criptógrafo diseñará algoritmos que no sean atacables (es decir, que no haya atajos al sistema de probar todas las claves posibles), o al menos que los ataques no sean prácticos (porque permitan ganancias marginales o porque requieran de una excesiva cantidad de mensajes en texto llano, cifrado o simplemente espacio en disco duro).

Un ejemplo sencillo nos permitirá aclarar los conceptos. Supongamos el típico maletín con cerradura de combinación, compuesta por tres ruedecitas que marcan números entre 0 y 9. La clave de cifrado sería simplemente el número de tres cifras (uno por ruedecilla) que hay que introducir para que el maletín se abra. El algoritmo vendría representado por el conjunto de mecanismos internos de la cerradura de combinación; como en otros casos, el mecanismo exacto de funcionamiento nos trae sin cuidado, del mismo modo que para conducir un coche no nos interesa saber cómo se produce la combustión interna. Un ladrón torpe tendría que probar todas las claves; a diez posibilidades por ruedecilla, habría de probar un total de 10^3 = 1.000 claves para tener la segurida de acertar.

Sin embargo, un ladrón más inteligente podría examinar los mecanismos de un maletín similar y obtener cierta información sobre el sistema, es decir, criptoanalizarlo. Podría por ejemplo llegar a la conclusión de que, si presiona fuertemente una esquina del maletín, la última rueda permite probar dos combinaciones a la vez, esto es, la combinación 613 y la 614 se comprueban simultáneamente. De ese modo, le bastará probar las combinaciones pares, y la complejidad de su ataque será de 500, es decir, estadísticamente tendrá el doble de probabilidades de acertar. Eso no significa que en un maletín concreto vaya a vencer a su compañero de "fuerza bruta" (quien a lo mejor acierta de chiripa tras el tercer intento), pero si hay muchos maletines en juego el ladrón criptoanalista tiene más papeletas a su favor.

Otro ejemplo. Muchas transacciones comerciales (entre otras, las que llevan a cabo los cajeros automáticos) se cifran mediante el algoritmo DES, que tiene un una clave de sesenta y cuatro bits (es decir, es un maletín con 64 ruedecillas, cada una de ellas con solamente dos posiciones, 0 y 1). El número de claves posibles es de 2^64, pero solamente hay 2^56 claves independientes (eso es así porque 8 de esos 64 bits son los denominados "bits de paridad" y no colaboran en la fortaleza del sistema; es como un maletín donde uno de cada ocho ruedecillas fuese innecesaria). Eso hace que el espacio de claves sea 2^56; es decir, con probar 2^56 claves ya hemos agotado todas las posibilidades.

No obstante, hay diversos tipos de ataques criptoanalíticos, aunque ninguno de ellos es realmente útil en la práctica. Por ejemplo, el denominado criptoanálisis diferencial es un tipo de ataque que permite obtener la clave correcta tras un esfuerzo similar al de probar 2^37 claves, es decir, es 2^(56-37) = medio millón (más o menos) de veces más eficiente que la búsqueda mediante fuerza bruta. ¿Por qué no es en la práctica útil? Porque requiere !analizar 2^36 textos cifrados con esa clave! Se conocen otros ataques, pero requieren conocer o elegir gran cantidad de texto -llano o cifrado- para extraer información suficiente para averiguar la clave.

Espero que al llegar a estas alturas, no te hayas perdido; si no, bien empezamos ;-). Pero no importa, con tal de que te hayas quedado con lo fundamental, esto es, que hay procedimientos para convertir un texto (o en general, un archivo digital de cualquier tipo) en un batiburrillo ininteligible. Esto nos sirve cuando no queramos que nadie, aparte de nosotros mismos y las personas autorizadas para ello, tenga acceso a nuestros datos.



1.2 - Cifrado simétrico (o de clave secreta)

Cuando la clave de cifrado es la misma que la de descifrado (y, por tanto, los algoritmos de cifrado y de descifrado coinciden) se habla de algoritmo de cifrado simétrico. Este es el tipo de cifrado que ha dominado la historia de la criptografía hasta hace un par de décadas.

El cifrado de César, visto anteriormente, es un buen ejemplo. El algoritmo de descifrado es el mismo que el de cifrado, sólo que recorrido de forma inversa (desplazar hacia la izquierda, en lugar de hacia la derechaa); la clave (desplazar cinco unidades) es la misma. Existen muchos algoritmos de clave simétrica resistentes al criptoanálisis: DES, RC4, RC5, Blowfish, IDEA, CAST, Triple-DES, LOKI, por nombrar solamente unos cuantos. Los algoritmos simétricos se clasifican en: algoritmos de cifrado en bloque [block cipher] y algoritmos de cifrado en flujo [stream cipher]. Esta clasificación, en la práctica, nos traerá completamente sin cuidado, del mismo modo que el cambio de marchas de un coche no depende de que sea gasolina o diesel.

Para cifrar, se coge el mensaje M y se le aplica la operación matemática Ck (es decir, se usa el algoritmo de cifrado C con la clave k), obteniendo Ck(M). Para descifrar el mensaje, se aplica la operación inversa Dk. Puesto que Ck y Dk son operaciones inversas, se tiene Dk(Ck(M)) = M, esto es, el mensaje original. Esto requiere que el emisor y el receptor del mensaje utilicen tanto el mismo algoritmo como la misma clave.

Y ahí está nudo gordiano de los sistemas de clave secreta. La comunicación segura entre el emisor y el receptor pasa por que ambos, y nadie más, conozca la clave k. Pero, ¿cómo hacemos llegar la clave k de uno a otro interlocutor? Podría enviarse por un canal seguro, esto es, uno que no pueda ser interceptado o espiado; pero ¿qué sentido tiene el cifrado si se dispone de un medio seguro de comunicación? El cifrado es para evitar a los fisgones; si no hay posibilidades de fisgar, no hay necesidad de cifrar.

Segundo problema: si la clave se filtra en cualquier momento a un tercero, la seguridad desaparece. Todos hemos visto películas donde el bueno se hace con la clave y consigue engañar al enemigo enviando mensajes falsos, o bien leyendo los mensajes auténticos de los malos. Esto puede suceder, y no sólo en las películas. Una clave comprometida (es decir, que está o puede estar en poder de un tercero) desbarata todo el sistema de comunicación segura basado en el cifrado, ya que el fisgón puede hacer cualquier cosa que puedan hacer los interlocutores.

Llamemos Ana y Belén a dichos interlocutores, y Fausto al fisgón. Belén puede recibir un mensaje cifrado por Fausto, pero ella cree que viene de Belén -ya que en teoría nadie más podría hacerlo- de manera que pica el anzuelo. Igual pasa con Ana. Tanto Ana como Belén pueden enviar mensajes a Fausto creyendo que lo hacen a su amiga; y nuestro fisgón puede leer toda la correspondencia actual, e incluso la pasada si consigue acceso a los mensajes anteriores. Mal negocio. Por supuesto, Ana y Belén pueden acabar dándose cuenta del engaño, pero el daño ya está hecho. Se verán en la necesidad de intercambiar de nuevo una clave. Y, si no quieren que Fausto se vuelva a colar en la conversación, deberán guardar cuidadosamente la clave para evitar que nadie más tenga acceso a ésta

Estos dos problemas (intercambio y gestión de claves) se resuelven con los sistemas de clave asimétrica o pública, que pasamos a ver al toque de ya.



1.3 - Cifrado asimétrico (o de clave pública)

El problema de la distribución de claves (es decir, cómo hacer llegar la clave de cifrado de Ana a Belén sin que Fausto pueda meter las narices) se resuelve mediante la llamada criptografía de clave pública -o de clave asimétrica- descubierta hacia 1975. Los detalles matemáticos son bastante engorrosos y no necesitamos aprenderlos, así que nos los saltaremos. Lo crucial y novedoso es que en la criptografía de clave pública se utilizan dos claves distintas, una para el cifrado y otra para el descifrado. La clave de cifrado es pública, esto es, conocida por todo el mundo; la de descifrado (clave privada) solamente es conocida por su propietario. Ambas constituyen un par de claves

Supongamos que tanto Ana como Belén tienen un par de claves pública/privada. Si Ana desea enviar un mensaje a Belén, los paso a seguir son los siguientes:

- Ana obtiene la clave pública de Belén k
- Ana compone un mensaje M y lo cifra con la clave pública de Belén.
- Ana envía el mensaje cifrado Ck(M)
- Belén recibe el mensaje y le aplica su clave privada k´ obteniendo Dk´(Ck(M)) = M

Es decir, cualquiera puede cifrar un mensaje y enviárselo a Belén, pero solamente ella podrá descifrar los mensajes que le llegan. Nadie más. Ni siquiera Ana podrá descifrar el mensaje que acaba de cifrar.

Véase que este elegante esquema evita los peligros de enviar la clave por un conducto inseguro; de hecho la clave pública puede ser tan diseminada cono un número de teléfono. Fausto lo va a tener ahora más difícil, ya que acceder a la clave pública le servirá para enviar mensajes, pero no para leer los que se envían Ana y Belén entre sí. Incluso si obtuviese la clave secreta de Ana, ello le permitiría leer los mensajes que Belén envía a Ana, pero no las respuestas de Ana a Belén. Por supuesto, permanece la obligación por parte de Ana y Belén de guardar celosamente sus respectivas claves privadas. Pero Fausto ya no puede aprovecharse del intercambio de claves secretas.

También permite aliviar los requisitos de almacenamiento de claves, sobre todo cuando hay más personas comunicándose. Si hay N interlocutores, el número de claves diferentes que hay que intercambiar y almacenar para comunicaciones seguras dos a dos es N*(N-1)/2. Si N=100, eso significa más de 4.950 claves distintas. Por supuesto, podemos hacer que algunas o todas las claves sean iguales, pero a lo mejor no es conveniente que Carlos tenga acceso a las comunicaciones entre Ana y Belén. Con los sistemas de clave pública, cada usuario solamente necesita tener una clave privada (la suya propia) y cien claves públicas (en realidad, sólo 99: !un usuario no necesita criptografía para hablar consigo mismo!).

La criptografía de clave pública se asemeja a un buzón de correos. Cualquiera puede introducir una carta en el buzón, pero solamente el poseedor de la llave del buzón podrá abrirlo para acceder a su contenido. Bueno, en realidad sí hay una posibilidad. Las claves públicas y privada no son independientes, y en teoría es posible obtener la clave privada a partir de la clave pública. Pero en la práctica, el volumen de cálculos matemáticos que ha de realizarse es demasiado grande para que pueda llevarse a cabo. Como en los sistemas de clave simétrica, el "truco" es hacer que haya tantas claves posible que no resulte práctico, aun cuando sea posible en teoría.

En la actualidad, los sistemas de clave pública más utilizados son el RSA y el Diffie-Hellman. Más correctamente, Diffie-Hellman es un algoritmo de intercambio de claves. Su variante para criptografía de clave pública se conoce como "algoritmo Diffle-Hellman, variante ElGamal" Lo menciono simplemente por "si te suena" de algún otro lugar. Aquí no vamos a ponernos puristas, y diremos Diffle-Hellman, o DH.



1.4 - Cifrado híbrido (mitad carne, mitad pescado)

Los criptosistemas de clave pública tampoco son la panacea universal, y adolecen de diversos problemas. Nos ocuparemos de dos de ellos. Uno es el de la suplantación. Si Belén recibe la clave pública de Ana, ¿cómo sabe que es realmente la de Ana? Trataremos ese engorro en otro apartado.

La segunda pega, de índole práctica, se refiere a la eficiencia. Los algoritmos de clave pública son lentos. El cifrado de un mensaje mediante cifrado de clave pública es del orden de mil veces más lento que mediante un algoritmo de clave simétrica. Los ordenadores son cada vez más rápidos, pero cuando hay grandes cantidades de información por cifrar o descifrar (pensemos, por ejemplo, en una base de datos protegida mediante cifrado) puede llegar a ser una verdadera dificultad. También resulta que el mensaje cifrado es mucho mayor que el original. Esto es una molestia para nuestros medios de almacenamiento (disquetes, discos duros) y una verdadera tortura para nuestra ya sobrecargada Internet, donde cada kilobyte de información significa tiempo de espera ... y beneficios para la compañía telefónica.

Estos problemas, y algunos otros (por ejemplo, ciertos ataques criptoanalíticos) se evitan mediante un sistema híbrido que tome lo mejor de dos mundos. ¿Queremos rapidez y brevedad? Pues creamos una clave simétrica y ciframos el mensaje con ella. ¿Queremos enviar de forma segura la clave simétrica al destinatario? Pues ciframos la clave simétrica con la clave pública del destinatario.

Supongamos que Ana quiere enviar un mensaje a Belén. Lo que hace es lo siguiente:

- Crea una clave simétrica K y cifra el mensaje con dicha clave. Sea Ck(M) el resultado
- Cifra la clave simétrica con la clave pública de Belén. El resultado es Ckp(K)
- Envía a Belén dos cosas: el mensaje (cifrado con la clave simétrica K) y la clave simétrica K cifrada con la clave pública de Belén.

Cuando Belén recibe el "paquete", procede a la inversa:

- Toma Ckp(K) y lo descifra usando su clave privada. El resultado es K
- Usa K para descifrar el mensaje Ck(M). El resultado es M

Es decir, la clave pública se usa para cifrar; pero lo que se cifra no es el mensaje, sino la clave simétrica con que va cifrado el mensaje. De ese modo hacemos llegar al destinatario la clave K, y podemos hacerlo por medios inseguros de transmisión. Poco nos importa que Fausto esté la acecho, porque no puede descifrar el mensaje sin conocer K ... y no puede conocer K si no tiene la clave privada. Es decir, hemos combinado un criptosistema de clave simétrica (para intercambiar el mensaje) con uno de clave asimétrica o pública (para intercambiar la clave).

Los sistemas "híbridos" no se consideran un tipo de cifrado aparte, sino que normalmente se hace la división entre sistemas de clave simétrica y de clave asimétrica (o de clave secreta - clave pública), pero nos hemos detenido aquí por su importancia. PGP es un programa de cifrado híbrido, es decir, combina cifrado simétrico y asimétrico de la manera que he descrito aquí. De modo similar, los protocolos criptográficos SSL utilizados por los navegadores en conexiones seguras (https) utilizan esta combinación híbrida.

Se puede hacer mejor de lo que hemos descrito hasta ahora. Se puede elegir K de manera que sea distinta para cada comunicación. Es decir, diferentes mensajes se cifran con diferentes claves. Esto mejora la seguridad de diversas maneras. En primer lugar, un atacante puede obtener información (cuando menos, reducir la complejidad del ataque) si sabe que diversos mensajes se cifran con la misma clave, aunque el atacante no conozca cuál es dicha clave. Existe, por tanto, un cierto riesgo si ciframos todos nuestros mensajes con la misma clave simétrica. También hay un riesgo asociado al hecho de que siempre ciframos la misma clave simétrica K con la clave pública del destinatario.

Cambiar K de un mensaje a otro elimina estos peligros (reducidos pero que existen). Y si el atacante lograra por el medio que fuese obtener K, solamente le serviría para un solo mensaje, ya que el siguiente estaría cifrado con otra clave distinta. Por eso, la clave simétrica "de usar y tirar" se denomina clave de sesión. Por supuesto, dicha clave ha de ser aleatoria, para que no se pueda obtener información favorable a un posible atacante. Eso se consigue mediante los programas generadores de números aleatorios. No entraremos en ello, pero cualquier programa de cifrado híbrido que se precie ha de contar con un generador de números aleatorios adecuado.



1.5 - Más información

Muchas veces, cuando voy a la sección de bibliografía adicional de un libro, me encuentro una y otra vez con frases del tipo "esta bibliografía, necesariamente breve y que por supuesto no abarca todas las fuentes importantes...", lo que a mí siempre me suena como si el autor quisiese decir "jo, pues anda que si me pongo a buscar referencias en serio, ibas tú a alucinar; conténtate con esta mínima muestra de mi saber, pobre gusano."

En este caso, es cierto que los enlaces que incluyo son una referencia mínima, pero no porque os considere pobres gusanos, sino simplemente porque ni quiero ni cansaros con múltiples enlaces ... ni tengo yo el cuerpo para ponerme a buscar por la Red, todo sea dicho. Solamente os incluyo algunos enlaces para los que queráis ahondar un poco más (no mucho) en el asunto. Y, además, son de manufactura propia, así que todo queda en casa:

Informe 1 Sobre la inseguridad de criptosistemas con espacio de clave pequeño.
Informe 2 Sobre la seguridad de los algoritmos, simétricos y asimétricos.
Informe 3 Se analiza el protocolo híbrido SSL.
Informe 4 Actualización al Informe anterior.

Para aquellos que quieran una ración mayor, he aquí algunos textos a algo más de nivel:

Criptografía para principiantes, por José de Jesús ángel. Para los que deseen una base de conocimientos con matemáticas.
Criptología, por Manuel Pons Martorell. Para mi gusto, más asequible y ameno.
Descripción del algoritmo DES, por Jorge Sánchez Arriazu. Disección del algoritmo simétrico más conocido. Sólo para estómagos endurecidos.

También tenéis a vuestra disposición muchas direcciones sobre criptografía, PGP y seguridad informática en general. Hay algunos, como Kriptópolis, que piden a gritos ser saqueados vilmente. Adelante, devoradores de la información, y ojo no os vayáis a atragantar.

© Arturo Quirantes Sierra 2001