Criptografía, matemáticas e Internet
¿Qué es la criptografía? ¿Para qué sirve? ¿Y qué tiene que ver con Internet? La criptografía es el conjunto de técnicas de codificación destinadas a convertir un mensaje en algo ininteligible para un receptor no autorizado. Como os podéis imaginar, el ámbito de acción de la criptografía hasta hace muy poco tiempo era en el ámbito militar. El objetivo era que si el mensaje era interceptado por un enemigo, este no pudiese entenderlo.
Una de las primeras técnicas usadas era la escítala espartana que consistía en dos palos de grosor similar por el que se enrollaba una cinta de cuero en forma espiral y se escribía el mensaje longitudinalmente. Una vez escrito el mensaje, se desenrollaba la cinta y se enviaba al receptor que sólo la tenía que enrollar en su palo y así poder leer el mensaje [1] [2].
Posteriormente se desarrolló el sistema de sustitución que consiste en sustituir unas letras por otras ya sea bajo una relación previa o mediante un desplazamiento en el abecedario. Por ejemplo, el sistema de Cifrado César, nombre debido a que su más famoso usuario era Julio César, consistía en desplazar cada letra tres posiciones [3]. La a se convertiría en d, la b en e, la c en f, y así sucesivamente. La palabra hola se escribiría krñd.
En España tenemos las cartas que enviaba el Rey Fernando el Católico a Gonzalo Fernández de Córdoba, más conocido como Gran Capitán. Estas cartas estaban escritas con símbolos diferentes a los convencionales, sin espacios entre palabras, símbolos que significaban palabras enteras y varios símbolos que significaban la misma letra [4].
Y muchas veces el problema no es que tu enemigo averigüe la clave de encriptación, es que no te enteres. Dos de los casos más claros y más famosos fueron en la Segunda Guerra Mundial. Por un lado los ingleses (a la cabeza el genio Alan M. Turing) desencriptaron Enigma, la máquina de encriptación alemana [5]. Los ingleses mantuvieron un perfil bajo para evitar que los alemanes se diesen cuenta de que sus mensajes ya no eran secretos. Por otro lado, los estadounidenses consiguieron desencriptar los mensajes japoneses y así pudieron derribar el avión en el que transportaban al almirante Isoroku Yamamoto, el mejor estratega nipón [6]. Los estadounidenses hicieron correr el rumor que un civil les había dado el chivatazo a fin de evitar que los japoneses cambiasen el código.
Por cierto, si os interesa el trabajo de Turing os recomiendo esta serie de artículos de nuestro compañero Fernando Cuartero:
- ¿Pueden Pensar las Máquinas? Alan M. Turing (I)
- Bletchley Park y la máquina Enigma. Alan M. Turing (II)
- El problema de la decidibilidad. Alan M. Turing (III)
- Vida de un gran pensador. Alan M. Turing (IV)
- El héroe olvidado. Alan M. Turing (V)
Cifrar mensajes ya no es sólo imprescindible en la guerra, lo necesitamos día a día para los movimientos bancarios y a fin de evitar que datos personales se difundan libremente. Desde hace un tiempo os habréis fijado que las páginas web son http y otras https, la diferencia entre ellas es que las http envían y reciben información del servidor en texto plano, y las https la información está cifrada. Como os podéis imaginar no toda la información es sensible a ser recopilada, da igual que alguien consiga saber qué página de nuestra web estás visitando porque no hay circulación de información sensible, pero no ocurre lo mismo con las páginas bancarias o de redes sociales. Esto es crucial en redes abiertas, como la WiFi de sitios públicos donde cualquiera (con ciertos conocimientos y herramientas) podría interceptar los paquetes de información. Por eso, incluso en redes poco seguras, las webs https permiten un nivel de seguridad muy alto y no tienes que temer que te vayan a robar las claves del banco por estar conectado desde la WiFi del aeropuerto.
HTTPS (HTTP + SSL/TLS)
Aunque los navegadores lo suelen ocultar, lo que aparece antes del www en la url es http:// (HyperText Transfer Protocol). HTTP es el protocolo de transferencia de información de la World Wide Web, es decir, del www. Este protocolo es muy sólido y ha tenido muy pocas versiones. La primera versión (HTTP/0.9) lanzada en 1991 está obsoleta y nadie la usa. Las dos siguientes versiones HTTP/1.0 y HTTP/1.1 lanzadas en 1996 y 1999 respectivamente se siguen usando, sobretodo la versión 1.1 que es la más usada en la actualidad. Un año después se lanzó la versión HTTP/1.2 cuyo nombre terminó desapareciendo y quedó como algo experimental. Hasta que llegó HTTP/2.0 que se lanzó en el año 2015 que es compatible con HTTP/1.1 e incluye la opción de cifrado TLS (Transport Layer Security), aunque todos los fabricantes de navegadores importantes fuerzan la navegación con este protocolo de seguridad siempre y cuando el servidor acepte HTTP/2.0 [7] [8].
HyperText Transfer Protocol Secure (HTTPS) permite la transferencia de información mediante HTTP sobre un canal seguro SSL/TLS. ¿Y qué significa SSL/TLS? TLS significa Transport Layer Security y SSL corresponde a Secure Sockets Layer. El protocolo SSL es el predecesor al TLS y algunos servidores aún lo usan [9] [10].
Los navegadores web suelen diferenciar entre una conexión http y https mostrando sólo cuando la conexión es https. Por ejemplo, Google Chrome muestra el mensaje «Es seguro» antes de la url con HTTPS para marcar que la navegación usa SSL/TLS.
En el protocolo HTTPS tenemos dos partes, una es la autenticación e intercambio de claves, la otra es el cifrado en sí. Para la primera parte hay varias opciones, RSA y variantes de Diffie-Hellman. A mi entender el más interesante es el protocolo RSA ya que está soportado en todas las versiones de SSL y TLS, además de que el pasado 16 de enero la Fundación BBVA dio un premio a los desarrolladores de dicho protocolo, Rivest, Shamir y Adleman [11]. En la parte de cifrado habría que remarcar el cifrado por bloques AES que es increíblemente seguro [12].
RSA
El protocolo RSA se basa en dos claves, una pública y una privada. Para encriptar el mensaje usas la clave pública que todo el mundo puede conocer, para desencriptarlo necesitas la clave privada que sólo tú conoces. Se puede obtener la clave privada mediante la clave pública, pero el proceso es computacionalmente muy costoso ya que todo esto se basa en la factorización de dos números primos.
El proceso resumido que se sigue es el siguiente:
- El servidor genera dos números que son públicos $latex n$ y $latex e$
- El cliente cifra el mensaje $latex M$ usando la siguiente operación:
$latex C = (M^e)$ $latex mod$ $latex n$
- El servidor recibe el mensaje cifrado $latex C$ y lo descifra usando la siguiente operación:
$latex M = (C^d)$ $latex mod$ $latex n$
Bien, ahora una explicación de lo anterior:
- El servidor genera dos números primos grandes $latex p$ y $latex q$. En la actualidad cada uno tiene 1024 bits, es decir, 309 dígitos decimales. Los multiplica y obtiene el número $latex n$
$latex n = p*q$
- Por otro lado obtiene el indicador de phi de Euler
$latex F = (p-1)(q-1)$
- Genera la clave pública $latex e$ que es primo relativo de $latex F$. Esto significa que $latex e$ y $latex F$ no tienen divisores comunes más allá del 1. Además, el número $latex e$ tiene que ser mayor que 1 y menor que $latex F$, es decir
$latex 1<e<F$
- Por cuestiones de eficiencia y seguridad, se elije siempre el valor $latex e=65537$ que es un número primo y es el número 4 de Fermat. De esta forma el servidor no tiene que enviar dos números al cliente, sólo su clave pública.
$latex 2^{2^4}+1=2^{16}+1$
- Ahora, se genera la clave privada $latex d$ que cumpla que
$latex e*d$ $latex mod$ $latex F = 1$
Las operaciones anteriores contienen un concepto que pocos conoceréis, la aritmética modular. En la aritmética modular lo que nos interesa es el resto de la división, no el cociente. En la operación $latex a=b$ $latex mod$ $latex n$, $latex a$ es el resto de dividir $latex b$ por $latex n$. Por ejemplo, $latex 58$ $latex mod$ $latex 9=4$, porque $latex 58/9=6.44…$, $latex 9*6=54$, entonces $latex 58-54=4$
Como podéis ver, generar la clave pública y privada es muy costoso computacionalmente, y factorizar un número grande para poder reventar la clave es increíblemente complicado. No es imposible, pero lleva un tiempo altísimo.
Por norma general, los datos tienen que ir cifrados tanto en la comunicación cliente > servidor, como en servidor > cliente. Por lo tanto, el cliente genera su propia clave pública y clave privada para que el servidor pueda mandar datos encriptados a cliente.
La elección típica de un tamaño de 1024 bits ya no es del todo segura debido a que hay máquinas cada vez más potentes, algunos sistemas requieren de 2048 o 4096 bits de tamaño para considerarlos del todo seguros. Esta cifra seguirá subiendo con el paso del tiempo pero actualmente nuestras comunicaciones son más que seguras.
Cada vez que visitéis la página del banco o vuestras redes sociales, hay mucha matemática detrás que permite que vuestros datos sean seguros.
Referencias
[1] https://es.wikipedia.org/wiki/Esc%C3%ADtala
[2] https://www.imperivm.org/cont/textos/txt/plutarco_vidas-paralelas-ti-licurgo.html
[3] https://es.wikipedia.org/wiki/Cifrado_C%C3%A9sar
[4] http://www.abc.es/cultura/abci-descifra-grandes-misterios-historia-espana-codigo-gran-capitan-201802020247_noticia.html
[5] https://es.wikipedia.org/wiki/Enigma_(m%C3%A1quina)
[6] http://historiasdelahistoria.com/2018/02/04/el-almirante-yamamoto-victima-de-una-clave-descifrada
[7] https://es.wikipedia.org/wiki/Protocolo_de_transferencia_de_hipertexto
[8] https://es.wikipedia.org/wiki/HTTP/2
[9] https://es.wikipedia.org/wiki/Protocolo_seguro_de_transferencia_de_hipertexto
[10] https://es.wikipedia.org/wiki/Transport_Layer_Security
[11] https://www.premiosfronterasdelconocimiento.es/noticias/fundacion-bbva-premio-fronteras-goldwasser-micali-rivest-shamir-criptografia/
[12] https://es.wikipedia.org/wiki/Advanced_Encryption_Standard
Os recordamos que los días 13, 14 y 15 diciembre de 2018 tendremos nuestra quinta edición de Desgranando Ciencia. Para más información, seguid leyendo el blog.
Sin comentarios