CRIPTOGRAFÍA: UN ANTES Y UN DESPUÉS
La
ciencia de la criptografía es casi tan antigua como la humanidad. Consta
históricamente que determinados mensajes codificados decidieron importantes
batallas en las guerras Médicas. Pero esa criptografía primitiva estaba más
basada en la ocultación del mensaje en dobles fondos, maletas, vainas e incluso
el cuerpo del mensajero, más que en una auténtica codificación que privara del
contenido del mensaje a un posible interceptor.
Para
ello es necesario algún sistema, y éste debe resumirse en una “función de
transformación”, previamente conocida por el destinatario. En términos
matemáticos, el cifrado consiste en pasar del texto x al f(x), siendo f la función de transformación. El
restablecimiento del mensaje original se conseguirá aplicando a f(x) una nueva función g[f(x)], que naturalmente debe ser la
función inversa de f. O sea, g[f(x)] = f-1[f(x)] = x.
El
código más antiguo conocido se basa en la substitución de cada letra del
alfabeto por un signo o incluso otra letra, lo que hace el mensaje
ininteligible a primera vista. Sea, por ejemplo, el llamado “texto llano” (sin
cifrar) y el que llamaremos “alfabeto cifrado”, escrita debajo del primero:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
MOPSUGKLVZABCDENWXJQRIYHFT
Es claro
que el mensaje “BARCELONA” queda transcrito como “OMWPUADCM”. Pero este sistema,
en cuanto tenga una determinada longitud, no resiste lo más mínimo a los
esfuerzos de un buen criptógrafo, como se pone en evidencia en la deliciosa novela
El escarabajo de oro, de Edgar Allan
Poe. Toda lengua tiene sus particulares frecuencias en la aparición de sus
letras, por lo que, entre los signos del mensaje cifrado, se darán también
frecuencias desiguales. Unos rápidos tanteos las ajustarán a las letras
correspondientes, y permitirán pasar del “alfabeto cifrado” al “alfabeto llano”.
En el ejemplo anterior, pese a tratarse de un mensaje tan corto, la observación
detecta enseguida el signo “M” repetido, lo que lleva a sospechar que se trate
de las letras E o A, como así sucede.
Pronto
se impuso, pues, la necesidad de complicar la clave de transformación, por
ejemplo, haciendo que las letras más abundantes tuvieran varios signos
posibles, que se utilizarían de manera aleatoria. Pero en la lengua no se dan
sólo determinadas frecuencias en las letras, sino también determinadas
combinaciones preferentes (v. gr., en español la Q va siempre seguida de una U,
las combinaciones PL y BR aparecen, pero no las MZ o PF), y a partir de ellas
es posible nuevamente, eso sí con mayores dificultades, atacar el sistema.
Blaise
de Vigenère innovó imaginativamente este método, definiendo varios “alfabetos
cifrados”, que a lo largo del proceso se van alternando según un determinado
patrón, dado por una clave determinada, que dicta cada cuándo hay que cambiar
entre los “alfabetos cifrados” disponibles. Pero este método tiene también sus
debilidades, y se consigue atacarlo “construyendo” palabras usuales,
cifrándolas con diversos “alfabetos cifrados” y buscando en los textos a
analizar la aparición de los cifrados de esas palabras.
Observaremos
que, en cada caso, van siendo necesarios textos y textos más largos para hallar
su clave a partir de los correspondientes estudios. Por ello la solución
definitiva sería la “clave única”, que se utiliza una sola vez para un mensaje
determinado. Sin embargo, este método no resulta viable en la práctica, pues la
cantidad de texto cifrado entre instituciones es tan ingente que el trabajo
requerido en cambiar de claves (¡y comunicarlas a los receptores!) haría el
proceso muy engorroso y caro, por no hablar de los nuevos riesgos de
intercepción que introduciría.
El
esfuerzo más importante en ese terreno que se hizo hasta la II Guerra Mundial
fue la llamada “Máquina Enigma”, obra de Arthur Scherbius, que conseguía el
cifrado sometiendo el texto mecanográfico a una “mezcla” aparentemente
aleatoria mediante la superposición de diversas ruedas cuyos giros formaban un
mejunje caótico en los signos iniciales. Este método tenía la ventaja de ser
mecanizable, lo que resultó de gran utilidad para la formidable cantidad de mensajes
que cada contendiente libraba interiormente durante la guerra.
Claro
está que estos mensajes, emitidos muy a menudo por radio, eran captados por el
adversario, pero la extraordinaria complejidad de la Enigma hizo imposible
decodificarlos durante mucho tiempo. ¡Pero también eso se logró! La historia de
este hito es un triunfo de la inteligencia y la perseverancia, personificadas
en Alan Turing, quien combinó suposiciones sobre la naturaleza de los mensajes
(por ejemplo, suponiendo que la palabra Wetter,
‘tiempo’, figuraría en algunos de ellos, aparentes partes meteorológicos, que a
determinada hora se emitían desde Alemania), y sometiendo estas
“palabras-puntal” a la prueba de máquinas Enigma hasta hallar concordancias y
correlaciones.
Tras
lo cual pareció, por un tiempo, que la lucha entre codificadores y
descodificadores había restablecido, una vez más, la supremacía de éstos. Pero
unas nuevas ideas aparecieron en el campo a partir de los años 70, que hacían
posible conceptualmente el envío de una clave del emisor A al receptor B sin
que en ningún momento ésta quedara al alcance de los descifradores piratas.
Supongamos que A manda a B una caja con dos cerraduras, cerrada con una llave
que sólo posee A. B la recibe, añade el cierre de la segunda cerradura cuya
llave él posee y la reexpide a A, el cual abrirá su propio cierre y reexpedirá
la caja una vez más a B. Éste no tiene más que abrir su propio cierre y tendrá
finalmente la clave.
Esto
suena a complicado, pero supone una doble garantía para A y B de que el mensaje
procede de su compañero, y su práctica mediante el uso de la electrónica es más
sencillo. Supóngase que A desea pasar el mensaje x a B, con lo cual lo codifica y
= f(x). B la somete a un nuevo cifrado, z
= j[f(x)], y este mensaje es nuevamente remitido a A. Éste lo
cifra de nuevo según f-1{[j[f(x)]}, y lo reexpide a B, quien finalmente aplica su propia
transformación inversa j-1{f-1{[j[f(x)]}}.
¿Dará
este tratamiento de nuevo x? Todo depende de que las sucesivas aplicaciones f-1j y
f j-1 sean conmutativas. Por ejemplo, si A desea
intercambiar con B una clave, puede hacerlo de la siguiente manera: en realidad
no le envía la clave, sino mA
= a mod p[1] y lo envía a B. Simultáneamente, B enviará mB = b mod p. Seguidamente,
A calculará bA = A’ mod p, y B calculará aM = B’ mod p.
A’ coincidirá con B, ya que A’ = B’ = mAB
mod p.
***
Pero
el verdadero descubrimiento, que alteró los conceptos criptográficos
tradicionales, se produjo a través de las propiedades de los números primos con
el sistema RSA (por sus creadores, Adleman, Rivest y Shamir), más llamado “criptografía
de clave pública”, que permitía aprovechar el hallazgo anterior con una clave
que ya no hay interés en manetener secreta, que
incuso puede ser pública. En efecto, la clave de cifrado de un texto es
conocida por todo el mundo, pero no así la de descifrado.
En
la actualidad se hallan desarrollados unos tests de primalidad bastante
eficaces, que permiten saber, con poco tiempo de trabajo de ordenador, si un
número es o no primo, pero ninguno para determinar, en poco tiempo, los
factores que integran éste. Por ejemplo, en la revista Scientific American, Martin Gardner desafió en 1977 a los lectores a factorizar el
siguiente número:
N
= 114.381.625.757.888.867.669.235.779.976.146.612.010.218.296.721.242.362.562.561.842.935.706.935.245.733.897.830.597.123.563.958.705.058.989.075.147.599.290.026.879.543.541
Hasta
después de 17 años no se logró hacerlo. En 1994 un equipo de 600 voluntarios,
repartidos por todo el mundo, dio con sus dos factores primos:
p =
32.769.132.993.266.709.549.961.988.190.834.461.413.177.642.967.992.942.539.798.288.533
q
=
3.490.529.510.847.650.949.147.849.619.903.898.133.417.764.638.493.387.843.990.820.577
Esta
circunstancia proporciona un sistema enormemente eficaz para codificar. Es
sabido que es relativamente fácil determinar si un número es primo mediante el
pequeño teorema de Fermat: si p es primo, entonces ap-1 = 1 mod p[2]. Esto
ahorra inacabables divisiones, y con un ordenador puede terminarse con poco
trabajo la primalidad de un número, incluso los increíblemente grandes (digamos
de varios centenares de cifras). Pero en cambio no se conoce ningún método
relativamente breve para determinar los factores primos de un número dado, y la
mayoría de los matemáticos sospechan que éste es un problema “intrínsecamente
complejo”, es decir, que necesitaría para su resolución de un número de
operaciones del orden del mismo número.
¿Qué
significa esto? Que podemos codificar un mensaje mediante el siguiente
procedimiento: elevemos el número codificado a una potencia fija s módulo r, siendo r un número
compuesto. Recibido el mensaje, el
descodificador lo elevará a otra potencia t
y lo reducirá módulo r. Pero el
número t sólo podrá ser obtenido por
quienes conozcan p y q.
El
método está pues claro: elegir dos números primos muy grandes al azar,
multiplicarlos y fijar el resultado del producto como base de transformación.
El resto viene solo.
El
sistema RSA está conociendo actualmente un gran éxito, y son miles las
empresas, los organismos políticos e incluso los particulares que lo utilizan,
sin miedo alguno. El único riesgo que se corre es: ¿Qué sucederá si alguien
halla un método rápido para decodificar N en sus factores p y q? Pero este riesgo
parece por el momento tan remoto que nadie lo toma seriamente.
JMAiO,
ago 03
[1]El significado de a = b mod p es: el
número a, al ser dividido por p, da el resto b. Se dice entonces que a y b son
congruentes módulo p.
[2] En realidad esto no es rigurosamente exacto:
algunos números llamados pseudoprimos no cumplen con
esta condición. Pero este obstáculo puede obviarse mediante unos cálculos
complementarios, que no es del caso exponer aquí.