Entender RSA (y II)

Imagen de Agustín
Enviado por Agustín en

Foros: 

Por Agustín

(Reitero mis disculpas hacia los que esto ya se lo saben, benditos ellos)

Vamos a tratar de aclarar la parte más misteriosa del algoritmo RSA, es decir, el funcionamiento de las operaciones de cifrado y de descifrado, que en nuestra primera entrega se dejó en el aire. Me ha sido útil parte del contenido de este documento, pero hay otras muy buenas explicaciones en la Red. Todo es cuestión de apoyar un poco los codos y tratar de seguir el razonamiento...

Recordemos que disponemos de dos números primos, p y q, y de su producto N=p*q, con los que obteníamos el valor (p-1)*(q-1), que. como luego veremos, es la función φ(N) de Euler. Recordemos también que se eligió un número entero e que fuera coprimo con (p-1)*(q-1) es decir que no tuvieran ningún divisor común. Este valor e, junto con el producto N, constituyen la Clave Pública. Posteriormente obtuvimos otro número entero d, que será la Clave Privada, que junto con e cumple la condición:

e*d – 1 = múltiplo de (p-1)*(q-1) = (p-1)*(q-1) * y

donde y es un entero.

En nuestro ejemplo, los valores que obtuvimos fueron

p = 439
q = 449
N = 197111
(p – 1)*(q - 1) = 196224
e = 1045
d =  ((p – 1)*(q - 1)* y + 1)/e = 5821
(para y = 31)

Ahora no tenemos más remedio que arremangarnos un poco, matemáticamente hablando. Empezaremos por hablar de la función φ de Euler, también llamada “indicatriz”, y que, para un número entero n es igual al número de enteros positivos menores o iguales a n y que son coprimos con él, es decir, que no tienen divisores comunes. Por ejemplo:

φ(1) = 1  {1}
φ(2) = 1  {1}
φ(3) = 2  {1, 2}
φ(4) = 2  {1, 3}
φ(5) = 4  {1, 2, 3, 4}

En general, para un número p primo, φ(p) = p – 1

Como además, se trata de una función multiplicativa, es decir que φ(a*b) = φ(a)*φ(b), tenemos que:

(p-1)*(q-1) = φ(p)*φ(q) = φ(p*q) = φ(N)

¡Aaaaarf! Ahora debemos tomar un poco de aire, y seguir.

La gracia del cifrado asimétrico es que nuestros corresponsales toman nuestra clave pública, y con el mensaje convertido en un número x, se limitan a hacer la operación:

Cifrado
C = x^e modulo N  [i]

Y nosotros, recuperamos el mensaje con nuestra clave privada

Descifrado
x = C^d modulo N [ii]

Y aquí nos quedamos con la pregunta: ¿Por qué funciona esto?
Si reemplazamos [i] en [ii], tendremos:

Descifrado
x = C^d modulo N = (x^e)^d modulo N = x^(e*d) modulo N [iii]

Ahora recordemos la relación que hay entre el producto e*d y (p-1)*(q-1), de forma que [iii] se puede reescribir así:

Descifrado
x = x^(e*d) modulo N = x^((p-1)*(q-1)*y + 1) modulo N
x = (x^((p-1)*(q-1))^y) * x modulo N
(el  +1 del exponente nos da x como factor)

Ahora sólo nos queda demostrar (más o menos, que tampoco esto es Princeton) que

 (x^((p-1)*(q-1))^y modulo N = 1

El pequeño teorema de Fermat afirma que:

a^(p-1) modulo p = 1
siendo p primo y a no divisible por p

Pero el Teorema de Euler-Fermat nos dice que:

 x^φ(N) modulo N = 1,
 y por lo tanto, también
 (x^(p-1)(q-1))^y modulo N = 1

De este modo, obtenemos que C^d modulo N = x, nuestro mensaje buscado.

(En el posterior debate se ha aclarado más esta cuestión: Ver (1) y (2))

Ejemplo: Las dos primeras letras de la palabra KRIPTOPOLIS tienen los valores 21 28 en la tabla de caracteres. De manera que para mandar KR como mensaje, tenemos x = 2128.

Cifrado
KR = 2128
C = 2128^1045 modulo 197111 = 17797
Descifrado
x = 17797^5821 modulo 197111 = 2128
2128 = KR

Imágenes: 

Bravo,

Aunque hay un detalle que me llama la atención, estamos aplicando el pequeño teorema de Fermat y la función de Euler como si N fuera primo pero no lo es, puesto que N=p·q

Ok, pero

Expresado así parece que N debiera ser primo para poder asumir que φ(N)=N-1. Más que el de Fermat habría que hablar sólo del de Euler que sólo requiere que N y x sean coprimos, pero que vamos, que no quiero desmerecer tu trabajo, que está genial.

Si si,

Si decimos lo mismo, lo que pasa es que si hacemos sólo referencia al pequeño teorema de Fermat nos falla el hecho de que N no sea primo, por eso hay que ir a la generalización de Euler (o Euler-Fermat). Sólo es una puntualización por que en el texto parece que los consideres igualmente aplicables.

Y yo también he tenido que repasar conceptos que tenía bastante oxidados de teoría de números.

Mis 2 ctvs

No se si aclara o oscurece, pero para mi es algo más claro tratar las operaciones modulares como congruencias, al menos para llegar a [iii].

x = C^d modulo N = (x^e)^d modulo N = x^(e*d) modulo N

tenemos que

c≡x^e (mod N)  [i]
x≡c^d (mod N)  [ii]

Entonces dado que si k es entero y a≡b (mod m), entonces a^k≡b^k (mod m), tenemos desde [i]

(c)^d≡(x^e)^d (mod N)

Es decir

x≡x^(e·d) (mod N)

Dado que x es menor que N (ya que x = c^d modulo N) se cumplirá también la igualdad

x=x^(e·d) modulo N [iii]

También con congruencias

Se ve asequible la otra demostración, la de que (x^((p-1)*(q-1))^y modulo N = 1

partiendo del teorema de Euler

x^φ(N)≡1 (mod N)

Con lo que, dado que y es entero

x^φ(N)^y≡1^y (mod N)

Es decir

x^((p-1)·(q-1))^y≡1 (mod N)

que es lo que queríamos demostrar

vamos a ver, y perdonar mi ignorancia.

en realidad RSA se trata de descifrar los factores primos de un numero no? imaginad que tengo un numero de 1024 bits, que son unos 309 digitos, si consigo factorizar ese numero encontrando sus dos multiplos se puede decir que he descifrado el numero no? se puede decir que si descifro cualquier clave de 1024 bits o mas en por ejemplo 5 minutos estaria echando por tierra la seguridad informatica mundial? por favor, una respuesta sincera, necesito opiniones, que viene despues de acabar con las claves RSA?
Llevo dias intentando que alguien me de una respuesta mas o menos logica y nada, muchas gracias.

Sí, la respuesta está en el primer RSA

Tienes razón Agustín, si hubiera respondido aquí y enlazado tu primera respuesta a alexis allí, como dejo hecho ahora, habría sido mejor porque un par de comentarios después se pueden ver ambos. Menos mal que de esta forma se puede corregir fácilmente.

Es el foro Técnico o forum/2 (no hay más que 4 foros) donde se pueden ver mejor las entradas existentes, cuantos comentarios contienen y quien ha enviado el último... yo me acostumbré a acceder a las entradas de los foros de esta forma; usando el sencillo menú superior de la página inicial. Cuesta un poco acostumbrarse pero está perfecto. Muchas gracias admin y, como de costumbre...

Saludos cordiales,

Pedro Fernández
--

Teorema de Euler-Fermat

Si lo he entendido bien, el Pequeño Teorema de Fermat sería como un caso particular del Teorema de Euler-Fermat, ya que sólo se cumple para los número primos, mientras que la función phi de Euler engloba números primos y otros casos, como el que se usa en el algoritmo de RSA.

Tenía una duda

No acababa de ver que
<code>
x^φ(N) modulo N = 1,
implicara:
(x^φ(N))^y modulo N = 1
</code>
Pero he visto que se cumple para varios casos particulares tomados al azar, por lo que supongo que se podrá demostrar con carácter general.
No se cumple para otras congruencias, como por ejemplo
<code>
x^a mod N = 2
(x^a)^y modn N != 2
</code>

opinar

Texto puro

  • No se permiten etiquetas HTML.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
By submitting this form, you accept the Mollom privacy policy.