lunes, 12 de septiembre de 2016

La Criptografía de Clave Pública (cómo funciona)

La Criptografía de Clave Pública

Quiero que cualquier persona pueda enviarme un mensaje secreto.  Pero también quiero que el sistema para hacerlo secreto sea público, es decir que cualquiera lo conozca y lo pueda utilizar. Sin embargo, aunque la “clave” sea pública sólo yo debo poder leer el mensaje.  Si quien lo envió olvidó qué escribió, ya no podrá saberlo a partir del texto en clave.
¿Es esto posible?  Sí.



Desde el momento mismo de la invención de la escritura, se generó la necesidad de enviar mensajes cuyo contenido sólo pudiera ser interpretado por el destinatario, manteniéndolo secreto para las miradas indiscretas.
Con la evolución y sofisticación de la organización social, esta necesidad se hizo fundamental para el funcionamiento de los ejércitos, las organizaciones políticas y diplomáticas, y luego también para el comercio y las finanzas.
La dificultad radica en que se pretende enviar un mensaje a través de una vía de comunicación “no segura”, es decir que puede ser interceptado y leído por un enemigo, un competidor, un cónyuge celoso, o la DGI.  Cualquiera de los medios de comunicación que usamos diariamente – internet, Wi-Fi, celulares – es claramente un canal de comunicación no seguro.
En algunos casos, existe el agravante de que podemos no enterarnos de que el mensaje ha sido interceptado, y que el sistema dejó de ser confiable.
La disciplina que comprende el estudio y desarrollo de los distintos métodos para intercambiar información en forma secreta y segura, se suele llamar “criptografía”.   Es uno de los más antiguos campos de conocimiento que pueden llamarse técnicos, y se remonta a por lo menos 4.000 años de antigüedad.

Los primeros sistemas fueron muy rudimentarios, similares a los que muchos hemos inventado para sobrevivir clases aburridas en la escuela y el liceo.  Consistían en la simple sustitución de un carácter por otro o por un símbolo arbitrario, usando una lista de sustituciones previamente acordada entre los interlocutores.
Si el texto cifrado es suficientemente extenso, o se usa la misma clave durante un período largo de tiempo en el que se genera una gran cantidad de texto, un simple análisis estadístico de las repeticiones de los símbolos, comparando con las frecuencias de uso en el idioma del que se trate, permite “quebrar” el sistema y descifrar la clave.

Por ejemplo, en español las letras más frecuentes son, en orden: e,a,o,s,r,n,i,d,l,c,
En inglés: e,t,a,o,i,n,s,h,r,d,l,u, …

Nota -Dato interesante: esa estadística fue compilada inicialmente por los linotipistas para dimensionar su stock de tipos de plomo.

A lo largo de la historia se inventaron ingeniosos sistemas para esconder la información; algunos de ellos utilizaban artificios físicos, como el que se muestra en la figura, denominado “scitalia” y atribuido a los espartanos. Consiste en escribir a lo largo de un bastón sobre el que previamente se enrolló una cinta de pergamino.   Para leer el mensaje escrito en la cinta, se debía enrollar la misma alrededor de un bastón de igual diámetro que el original.

 figura

 Una variante del sistema “liceal” de sustitución por símbolos se utilizó en la práctica hasta hace relativamente poco, de la siguiente manera:

Se diseña la tabla de equivalencias, por ejemplo (la más sencilla):       A=1, B=2, …..Z=27. 
También puede ser: A=*, B=%, C=&, ….. Z=!,  o cualquier otra.  Incluso puede ser A=A, B=B, …, Z=Z (sin sustitución) como se verá en el ejemplo descripto más adelante.

Anualmente, se genera un “libro” con 366 páginas (una para cada día del año) llenas de números al azar entre 1 y n, con n menor que 26 y se reparten copias idénticas del libro entre todos los participantes del sistema, por ejemplo el gobierno de un país y sus embajadas en diferentes países.

Si imaginamos la tabla de equivalencias como dos regletas paralelas deslizantes (o mejor aún dos discos concéntricos), una con la sucesión de caracteres (A, B, C, … Z) y la otra con la sucesión de símbolos correspondientes, la idea es que para realizar la codificación  (y la decodificación) de un mensaje, hay que utilizar la página del libro correspondiente al día del año. Esta contiene una serie de números aleatorios, y para cada caracter sucesivo a codificar se desplaza la regleta tantos lugares como indica la siguiente posición en el libro compartido.

Ejemplo: Texto a encriptar = “HOLA”, Tabla de equivalencias: A=A, B=B, …. Z=Z (las dos regletas son iguales).
Supongamos que es el primer mensaje del día de hoy, y la página del libro de claves correspondiente a la fecha de hoy comienza con los números aleatorios  5, 2, 10, 21, …….

Desplazamiento
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26





























Regleta 1
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z
Regleta 2
5
V
W
X
Y
Z
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U





























Regleta 1
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z
Regleta 2
2
Y
Z
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X





























Regleta 1
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z
Regleta 2
10
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P





























Regleta 1
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z
Regleta 2
21
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F


El texto original “HOLA”, se convierte en “CNBG” (casilleros celestes).
El mensaje cifrado aparecerá ante un eventual interceptor del mismo como compuesto por caracteres aleatorios y no le proporcionará ninguna información de utilidad.

Dado el texto cifrado “CNBG”, para proceder a descifrarlo se utiliza exactamente el mismo procedimiento.
La desencriptación es entonces el proceso inverso de la encriptación.

Este sistema, bastante engorroso para instrumentar manualmente, es de muy fácil implementación en una computadora o incluso en los primitivos sistemas mecánicos o electromecánicos de mediados del siglo XX.

El ejemplo anterior equivale en su forma abstracta, a enviar el mensaje dentro de una caja fuerte de combinación (la combinación sería el libro de desplazamientos aleatorios).   El remitente y el destinatario conocen la combinación, y nadie más.

La dificultad intrínseca a estos sistemas y muchos otros equivalentes, es que en todos los casos, para poder enviar los mensajes codificados utilizando una vía no segura, se necesita previamente una vía segura para enviar la “clave” (en el ejemplo el libro de desplazamientos), y si se dispone de una vía segura, ¿porqué no usarla para enviar el mensaje sin encriptar?

En la mayoría de los casos, esto es prácticamente imposible o prohibitivamente caro, especialmente cuando las personas que necesitan intercambiar los mensajes no se conocen previamente o cuando se trata de mantener la privacidad en una vasta red de comunicaciones.

Nota - Un aspecto importante y anti-intuitivo en esta situación es la necesidad de que el método de encriptación (y desencriptación) sea públicamente conocido. Uno tendería a pensar que manteniendo secreta la forma de codificar la información debería hacer al sistema más difícil de crackear. Sin embargo, la única forma de saber si un método de encriptado es seguro y no va a ser roto por un atacante, es hacerlo público para que sea analizado y probado por otros criptógrafos. La única cosa que debe ser mantenida en secreto es la clave.  Es el equivalente a una cerradura.  Los planos constructivos de la cerradura (salvo la forma de los tambores) se pueden dar a conocer, pero no la forma de la llave.
 La seguridad del sistema se reduce a la posibilidad de transmitir la clave en forma secreta y almacenarla de una manera segura.

Por lo tanto, poco a poco fueron quedando claras las características que debería reunir un sistema eficiente sobre el que basar las comunicaciones cifradas.

1)      El texto original debería ser fácilmente convertible en el texto cifrado utilizando un sistema de encriptación (función o transformación E) provisto por el destinatario y conocido públicamente (p.ej. publicado en la guía telefónica o en una página web).

2)      El texto original debería poder ser reconstruido a partir del texto cifrado por el destinatario, utilizando una función de descifrado D que sólo él conoce.

3)      De la función de encriptación pública E no debe poder deducirse la función de descifrado D secreta.

4)      Idealmente, el sistema debería tener características tales que aseguraran la autenticidad de los mensajes, en otras palabras, que permitiera incluir una “firma embebida”.  La característica de “firma embebida” es fundamental en las transacciones comerciales o bancarias, porque evita la posibilidad de que el destinatario fragüe un mensaje enviado a sí mismo como si hubiera sido enviado por un tercero.

La cuestión a resolver es cómo construir un sistema de clave pública como el descrito.
Los algoritmos desarrollados están construidos sobre un principio común, el de encontrar y hacer uso de una “función unidireccional”.  Una descripción informal de la misma sería la de encontrar una función (E) tal que su aplicación (Encriptación) sea computacionalmente sencilla, pero su inversa (D, es decir, invertir su acción para desencriptar), sea en la práctica imposible, o por lo menos, computacionalmente inobtenible.

El par de funciones E y su inversa D son el análogo a una “puerta trampa” como las de las películas de misterio.  De un lado se ve y del otro no.  Para utilizarla en el sentido secreto, se debe saber qué ladrillo apretar, qué lámpara girar, o qué libro desplazar en la antigua biblioteca inglesa.   Para volver desde el cuarto secreto, la puerta es una puerta ordinaria con pestillo.

En la década de los 70 comenzaron a aparecer desarrollos de algoritmos implementables en computadoras digitales que cumplían estos requisitos.

En todos los algoritmos propuestos, si bien es imposible demostrar la seguridad del sistema, se puede confiar en que ésta es suficiente debido a que su inviolabilidad no se basa en consideraciones teóricas sino prácticas.   Para deducir la función D conocida la función E, es muy sencillo escribir un algoritmo que lo intente por “fuerza bruta”, dedicando masivos recursos computacionales a probar alternativas, sabiendo que el número de combinaciones posibles es enorme pero finito.  Sin embargo, se puede demostrar que la computadora más grande concebible hoy y en el futuro (con tantos elementos lógicos como partículas hay en el universo) necesitaría billones de años para lograr el objetivo, lo cual garantiza la inviolabilidad práctica del sistema.

Se puede asegurar esto con confianza porque los sistemas diseñados pertenecen a un tipo de problemas identificados en la teoría de números como “polinomiales no determinísticos” (NP por su sigla en inglés).  Para ellos, las posibles soluciones pueden ser rápidamente verificadas, pero la cantidad de pasos computacionales necesarios para hallar soluciones generales aumenta muy rápidamente con el tamaño del problema.

Tempranamente quedó claro que las matemáticas que mejor se prestan para la construcción de funciones unidireccionales están vinculadas con la aritmética modular.
Se define A mod B = C como el resto de la división entera de A por B  (A módulo B igual C, también se suele representar computacionalmente como mod(A,B)=C  ).
La característica de la función módulo que la hace apropiada para este uso es que, si bien el resultado de la aplicación de la función es único, su inversa no lo es, o sea que al incorporarla en la función E (encriptación) se obtiene un texto encriptado único, pero al pretender ir hacia atrás, se abren infinitas alternativas. Si conozco A y B obtengo C único, pero si conozco C y B, la solución es A, pero también A+nB, para cualquier valor de n.

Los primeros sistemas que hicieron historia son:

-          El sistema de Ralph Merkle, Whitfield Diffie y Martin Hellman, basado en el problema de la mochila (ver recuadro).

-          El sistema RSA (iniciales de sus inventores, Ronald Rivest, Adi Shamir y Leonard Adleman), basado en el problema de la factorización en números primos.

-          El sistema DES desarrollado por IBM (Data Encryption Standard) y el triple-DES.

Luego aparecieron múltiples variantes buscando mayor seguridad, más fácil implementación en computadoras pequeñas, menor tiempo de procesamiento para uso en internet, etc.

Cuando enviamos instrucciones al banco por internet o cuando le pedimos a Windows que encripte con contraseña la información de una carpeta en nuestro disco duro, seguramente estamos usando uno de estos sistemas sin saberlo explícitamente.

En el cuadro, se desarrolla un ejemplo simplificado del sistema basado en el “problema de la mochila”.
No ha tenido la generalizada aplicación de los sistemas RSA y DES por ser menos seguro, pero es suficientemente sencillo como para que la idea general, común a casi todos los sistemas, sea comprendida por un lego.

El problema de la mochila es un problema NP cuya idea conceptual es la siguiente:
Se tiene un conjunto abundante y ordenado de discos del mismo diámetro pero de espesores diferentes. Se elige un subconjunto de discos de distintos espesores, manteniendo el orden, se los coloca en una pila, y se construye una “mochila” o cilindro que los contenga con la misma altura.  Luego se devuelven los discos al conjunto, y se le pide a otra persona que llene la mochila nuevamente, volviendo a escoger los discos correctos.
Ocurre que dado un número grande de discos de distintos espesores, hacer una pila con algunos discos de tal manera que sumen cierta altura exacta (la altura de la mochila), es un problema difícil, de tipo NP.
Para cantidades grandes de discos la resolución por “fuerza bruta” consume enormes recursos computacionales, a pesar de que el algoritmo (receta) es trivial.

La altura de la mochila y los discos son sólo una metáfora para representar el proceso.  Lo que se hace en la práctica es, obviamente, operar con números.
Por ejemplo: si los espesores del conjunto de discos, medidos en milímetros, son:
43, 135, 8, 64, 227, 173, 58, 17, 39, 201 y la mochila mide 331 mm de alto, el subconjunto que soluciona el problema es (8,64,58,201)  porque 8+64+58+201=331.

Para aplicar la metáfora de la mochila y los discos a la encriptación de un texto, en el ejemplo que se muestra en el recuadro, se dividirá previamente el texto en bloques y se asignará a cada bloque un número proveniente de la sustitución de cada letra por un valor numérico de acuerdo a una convención prefijada. Estos números determinarán qué discos se escogerán, y la suma de sus espesores (altura de la mochila) será el número que represente al bloque de texto.

Para comprender lo anterior, veamos un ejemplo y su construcción matemática:




Veamos cómo funciona un algoritmo asimétrico, con un ejemplo simple tomado del artículo original de Martin Hellman en Scientific American (agosto 1979).                
------------------------------------------------------------------------------------------------------------------------------------------------------
Juan y Pedro acuerdan utilizar un sistema basado en el problema de la mochila, pero sumamente simplificado.  Pedro hace conocida su clave pública, y Juan le envía un mensaje.

Los textos a codificar se deberán transformar en una cadena de bits (unos y ceros).
Para ello se expresará en binario el sencillo método de equivalencia  A=0, B=1, …. , Z=26,  con 5 bits por carácter: 

A = 00000, B = 00001, C = 00010, …. , Z = 11010

Tomarán bloques de 2 caracteres, por lo tanto 10 dígitos binarios
En los sistemas reales, estos bloques deberían ser de por lo menos 100 dígitos binarios para que el sistema sea razonablemente seguro.

         1) Pedro confecciona su clave pública a partir de su clave secreta.

La clave secreta de Pedro consistirá en un vector supercreciente arbitrario de 10 números, tantos como dígitos binarios contiene cada bloque a codificar (un conjunto se llama supercreciente cuando cada elemento sucesivo es mayor que la suma de todos los anteriores):

as = (as1, … as10) = (3, 5, 11, 20, 41, 83, 169, 340, 679, 1358),               as = vector a secreto creado arbitrariamente

y dos números, también arbitrarios, primos entre sí:

 w = 764,    m = 2731.

Nuevamente, en un sistema real los elementos del vector deberían ser por lo menos 100, y los números w y m, de por lo menos 50 dígitos.

También necesita calcular w-1, la inversa modular de w, definida como w x w-1 mod m = 1.

w-1 se obtiene mediante un método sencillo que es una extensión del algoritmo de Euclides para hallar los factores primos, y que no viene al caso desarrollar aquí.

Para w = 764 y m = 2731, resulta w-1 = 1605.


A partir de su clave secreta, Pedro obtiene la clave pública mediante la siguiente transformación de cada término:
apn = (asn x w) mod m;              para el primer término: ( 3 x 764 ) mod 2731 = 2292.

Así se obtiene el vector ap:                                       ap = vector a público para difundir

ap = (ap1,…ap10) = (2292, 1089, 211, 1625, 1283, 599, 759, 315, 2597, 2463)

Pedro difunde públicamente su clave consistente en el vector de 10 elementos ap.
------------------------------------------------------------------------------------------------------------------------------------------------------
                2) Método para preparar el mensaje a codificar.

Juan comienza por transformar el texto en una cadena de bits (unos y ceros).

Supongamos que el mensaje es “HOY ES EL DIA”.

El primer bloque a codificar será “HO”, en números “7, 14”, que con la convención de 5 bits por carácter, se traduce en “00111 01110”.
------------------------------------------------------------------------------------------------------------------------------------------------------

                3) Juan encripta el primer bloque.

Se encripta el bloque “HO” = 00111 01110, haciendo el producto escalar entre el vector “HO” y el vector de la clave pública ap.

El producto escalar se define como la suma de multiplicar entre sí las posiciones correspondientes de cada vector, y se suele representar por un punto:

“HO” :     0         0       1        1         1       0       1       1        1        0
 ap    :  2292, 1089, 211, 1625, 1283, 599, 759, 315, 2597, 2463

“HO” . ap = 0x2292 + 0x1089 + 1x211 + 1x1625 + 1x1283 + 0x599 + 1x759 + 1x315 + 1x2597 + 0x2463 = 6790

 Hacer el producto escalar es el equivalente a escoger un subconjunto de discos en la metáfora conceptual de la mochila.  El número del vector que se multiplica por 1 es escogido, el que se multiplica por 0 no; como si la cadena de unos y ceros fuera la receta de cómo “armar” el número correspondiente a la altura de la mochila C.

Por lo tanto, el primer bloque encriptado (C) a transmitir por vía no segura (ej. internet) es el número 6790.
------------------------------------------------------------------------------------------------------------------------------------------------------

                4) Pedro recibe el mensaje y lo decodifica.

Si se intentara deshacer el camino de codificación probando alternativas a partir de las combinaciones posibles de elementos de ap que den como resultado 6790, los tiempos necesarios no son viables en la práctica.

Pero Pedro tiene un atajo; previamente transforma el mensaje de manera que pueda ser descompuesto usando el vector secreto as en lugar del vector púbico ap:

La transformación es: = (C x w-1 ) mod m  = ( 6790 x 1605 ) mod 2731 = 1260

 Recordemos que w-1  y m son secretos.  Sólo los conoce Pedro, así como el vector
as = (3, 5, 11, 20, 41, 83, 169, 340, 679, 1358)

Como el vector as es supercreciente, el proceso de descomposición de   usando el vector as es muy sencillo; simplemente se prueba primero con el número más grande.  Si es mayor que se lo descarta (se le asigna un cero), si es menor se lo conserva (se le asigna un 1) y se resta de C´.  Luego se prueba el siguiente número más grande contra el resto de que nos va quedando y se hace lo mismo, y así sucesivamente.

1260 = 0x3 + 0x5 + 1x11 + 1x20 + 1x41 + 0x83 + 1x169 + 1x340 + 1x679 + 0x1358

que se interpreta como el bloque original “HO” = 00111 01110.

Si alguien quisiera descifrar el bloque “6790” sin conocer los elementos secretos, la única manera es probar con combinaciones de los números del vector ap, primero de a uno, luego de a 2, luego de a 3, etc.
En nuestro ejemplo, las combinaciones posibles son 1.023, pero para un vector de 100 elementos, son 1,27x1030 (un uno seguido de 30 ceros, un millón de millones de millones de millones de millones).

Posibilidad de “embeber” la firma en el mensaje.

Si Juan quiere enviarle el mensaje a Pedro asegurándose de que Pedro tenga la plena certeza de que el autor es Juan, hace lo siguiente: aplica al texto original su propia función de descifrado (secreta) DJuan y al resultado le aplica la función de encriptación (pública) EPedro de Pedro.
Pedro, al recibirlo, sabiendo que es un mensaje de Juan, le aplica su función de descifrado (secreta) DPedro, y luego la de encriptación (pública) de Juan EJuan.
Si de este procedimiento obtiene un texto legible, no sólo sabe que el mensaje no ha sido interceptado o modificado, sino que puede estar seguro de que Juan es el autor.


Resumen:

Existen básicamente dos tipos de algoritmos para encriptar información. Los algoritmos simétricos, que son los métodos en que pensamos naturalmente cuando imaginamos  cómo podría mandarse un mensaje en forma secreta. Se basan en que quien envía el mensaje y quien lo recibe tienen un método para encriptar y desencriptar la información, para el cual ambos comparten una clave secreta. Toda la criptografía desde la antigüedad hasta 1976 ha estado basada exclusivamente en este tipo de métodos, y continúan siendo ampliamente utilizados.
 Y los algoritmos asímétricos, o ‘de clave pública’, basados en una forma enteramente diferente de preservar el secreto e introducidos en 1976 por Whitfield Diffie, Martin Hellman y Ralph Merkle. En esta criptografía quien recibe el mensaje posee una clave secreta como en la criptografía simétrica, pero también una clave pública con la que se encriptó la información.
CLAVE PÚBLICA

Los métodos criptográficos modernos basados en algoritmos de clave simétrica o secreta son seguros, rápidos y de uso extendido. Sin embargo tienen varios inconvenientes, asociados principalmente al problema de distribución segura de las claves, al número de claves a distribuir y a que no proporcionan seguridad contra el engaño por parte de los participantes.

Para solucionar estos problemas es que Diffie, Hellman y Merkle hicieron una propuesta revolucionaria basada en la siguiente idea: no es necesario que la clave que posee la persona que encripta (envía) el mensaje sea secreta. Lo crucial es que sólo lo pueda descifrar quien recibe el mensaje, utilizando una clave secreta asociada de alguna manera a la pública. Para la realización de un sistema así, quien va a recibir la información secreta hace pública una clave de encriptación, accesible a todo el mundo.  Pero este receptor, tiene una clave secreta capaz de desencriptar el mensaje que consiste de dos partes, una pública y una privada.

Un sistema de tal tipo funciona en forma análoga a un buzón de correos: todo el mundo puede depositar en él correspondencia (encriptar), pero sólo una persona con una llave privada (secreta) puede retirar las cartas (desencriptar).

Referencias:

-          “The Mathematics of Public-Key Cryptography”
Martin E. Hellman
Scientific American, Agosto 1979
-          Wikipedia

Bibliografía sugerida:
-          Modern Cryptography, Theory and Practice
Wenbo Mao


No hay comentarios:

Publicar un comentario