domingo, 15 de enero de 2017

Criptografía (XLI): ataque a RSA mediante módulo común

En anteriores posts de esta serie he hablado de algunos ataques teóricamente posibles al algoritmo de cifrado RSA (cifrado cíclico y paradoja del cumpleaños), pero que tal y como comenté son ineficientes cuando se utilizan números primos lo suficientemente grandes para generar el par de claves (pública y privada).

Además de los ya mencionados existen otros ataques posibles; y en este post trataré sobre uno de ellos: el ataque a RSA mediante módulo común.

La idea de este ataque consiste en explotar el hecho de que se utilice el mismo módulo (n) a la hora de generar pares de claves para diferentes usuarios (cada uno de ellos con su exponente publico y privado propios). En principio, esto no compromete la seguridad del algoritmo, pero deja la "puerta abierta" a que si se cifra el mismo mensaje para más de un usuario un criptoanalista que intercepte los criptogramas pueda hacerse con el mensaje en claro.

Veamos un ejemplo:

1.- Módulo común a los usuarios (n):  52.841.

2.- Clave pública de dos usuarios a los que se envía el mismo mensaje:

- Usuario 1 (e1, n): (11, 52.841).
- Usuario 2 (e2, n): (7, 52.841).

3.- Mensaje común a ambos usuarios (m): 16.708.

4.- Cifrado para cada uno de los dos destinatarios:

- El emisor utiliza la clave pública del Usuario 1: c1 = me1 mod n = 16.70811 mod 52.841 = 7.860.
- El emisor utiliza la clave pública del Usuario 2: c2 = me2 mod n = 16.7087 mod 52.841 = 52.061.

Supongamos ahora que se interceptan estos dos criptogramas y el criptoanalista sabe que el mensaje en claro es el mismo en ambos casos. Lo único que debe hacer para obtenerlo, ya que conoce e1e2, n, c1 y c2, es lo siguiente:

1.- Como e1 y e2 son primos entre sí (lo que ocurre en nuestro caso y es muy probable que en cualquier otro), existirán dos enteros (s, t) tales que:

e1 s + e2 t = mcd(e1e2) = 1

2.- Se calculan s y t mediante el algoritmo de Euclides extendido, de la siguiente forma:

a) r0 = e1 = 11; r1 = e2 = 7; s0 = 1; t0 = 0; s1 = 0; t1 = 1

b) i = 1

c) Mientras ri distinto de 0:

c.1) Dividir ri-1 entre ri para obtener el cociente qi+1 y el resto ri+1
c.2) si+1 = si-1 - qi+1 si; ti+1 = ti-1 - qi+1 ti
c.3) i = i + 1

d) Cuando ri = 0, el resultado buscado es ri-1 = r0 si-1 + r1 ti-1.

En nuestro caso:
3.- Y, finalmente, el criptoanalista obtiene el mensaje en claro realizando la siguiente operación (nótese que alguno de los dos valores obtenidos será necesariamente negativo. En nuestro caso: s = 2 y t = -3):

m = (c1s x inv(c2n)-t) mod n
m = (7.8602 x 23.1013) mod 52.841 = 16.708, que efectivamente, tal y como se puede comprobar más arriba, es el mensaje en claro.

Sin embargo, este tipo de ataque no es muy viable en la práctica a nada que se adopten unas mínimas precauciones en el uso de este algoritmo, ya que requiere que se intercepten criptogramas correspondientes a mensajes en claro idénticos para usuarios diferentes que compartan el mismo módulo, por lo que, por lo visto en éste y anteriores posts, y aunque hay otros tipos de ataques posibles, tras casi cuatro décadas desde su desarrollo, RSA parece gozar de una "salud" envidiable; a prueba de ruptura, salvo que alguien consiga dar con un algoritmo eficiente para hallar los dos factores primos de un número lo suficientemente grande, un incremento muy significativo de la potencia de cálculo de los ordenadores actuales y/o los avances que se logren en la computación cuántica, pero todo esto será, si es el caso, objeto de posts posteriores.

No hay comentarios:

Publicar un comentario