Antes de comenzar a hablar del criptosistema RSA es necesario introducir algunos términos básicos para comprender mejor los temas que vamos a tratar en este libro. Los conceptos básicos para esta parte son criptografía, criptoanálisis y criptología.
El objetivo de la criptografía es proporcionar, mediante alteraciones linguísticas o cifrado de mensajes, comunicaciones seguras a través de un canal, es decir, permitir que dos personas puedan enviarse mensajes privados por medio de un canal susceptible de ser interceptado por terceras personas no deseadas. Un ejemplo de canal sería un teléfono, un correo electrónico, etc.
Por otra parte, el criptoanálisis trata de romper la confidencialidad de tales comunicaciones.
Por último, la criptología es la ciencia cuyo estudio abarca la conjunción de criptografía y criptoanálisis.
Existen dos tipos de sistemas criptográficos o criptosistemas: sistemas de clave pública y sistemas de clave privada.
a) En los sistemas de clave privada, el emisor y el receptor comparten en secreto una determinada clave que utilizan para cifrar y descifrar los mensajes. Algunos ejemplos de criptosistemas de clave privada.
b) En los sistemas de clave pública cada usuario elige y maneja dos claves íntimamente relacionadas, una pública que el usuario pone a disposición del resto de usuarios del sistema, y una clave privada, solo conocida por él. Entre los criptosistemas de clave pública caben destacar los criptosistemas de curvas elípticas y RSA, objeto de este proyecto.
La seguridad de los criptosistemas de clave pública se basa en el uso de funciones unidireccionales.
Los sistemas de clave privada, presentan un par de problemas importantes. El primero es determinar la forma en que dos usuarios se ponen de acuerdo en la clave privada a utilizar, y el segundo es que el número de claves necesarias para comunicar n usuarios es del orden de .
Los criptosistemas de clave pública resuelven estos inconvenientes pero a su vez plantean otros problemas como un mayor coste computacional en los procesos de cifrado y descifrado, y la autenticación de la clave pública. Algunas ventajas de los criptosistemas de clave pública son las siguientes:
El criptosistema RSA fue introducido por Rivest, Shamir y Adleman en 1978. Se trata del criptosistema de clave pública más ampliamente usado.
La seguridad de este criptosistema se basa en la dificultad computacional que supone resolver el problema matemático de la factorización de números enteros.
Problema de la factorización: dado un entero n, se trata de encontrar su descomposición como producto de factores primos. Este problema es computacionalmente muy costoso si el número n no tiene factores pequeños.
El problema de la factorización afecta directamente al RSA ya que para generar la clave pública se consideran enteros n que verifican
n = p · q
con p y q números primos muy grandes.
No obstante, existen trabajos que demuestran que dependiendo de las condiciones, romper el criptosistema RSA puede no ser equivalente a resolver el problema de la factorización.
2.1 Protocolo RSA
El protocolo consta de tres partes:
A continuación, y apoyándonos en ejemplos interactivos, veremos cómo funciona cada uno de estos tres puntos.
2.1.1 Generación de las claves
Cada usuario U debe elegir sus claves, pública y privada, mediante el siguiente protocolo:
En este caso, al ser n un producto entre dos primos distintos, ϕ(n) se calcula del siguiente modo
ϕ(n) = ϕ(p·q) = (p - 1) (q - 1)
mcd(e, ϕ(n)) = 1
e · d ≡1 mod(ϕ(n))
Nota: El cálculo de este inverso se puede hacer automáticamente con Maple y es eficiente pues utiliza el algoritmo extendido de Euclides.
De este modo U ya tiene su clave pública, la pareja (n,e), y su clave privada, que es el número d. Se deberá mantener secretos los números p, q y ϕ(n), ya que si se conocen p y q es muy fácil calcular ϕ(n) y descubrir la clave privada d a partir de la clave pública.
Los valores e y d son los denominados exponente de cifrado y exponente de descifrado, respectivamente. El elemento n se denomina módulo del criptosistema RSA.
A continuación veremos unos ejemplos de generación de claves con la función
Genera_clave
de la librería
HerramientasRSA
.
Los ejemplos son modificables a gusto del lector.
La función contiene dos parámetros, el primero es un entero K que define la longitud de los primos p y q, el segundo parámetro es un nombre en el que se almacenará la clave privada. La función obtiene una clave pública (la clave privada se almacena en el nombre que pongamos) obtenida a partir de la pareja de primos p y q. Recordamos que la clave pública la forman el par (n,e).
La clave pública es:
> | clavePublica:=Genera_clave(3,clavePrivada);
|
![]() |
(2.1.1.1) |
> |
En este ejemplo n sería el primer número del par anterior,
> | n:=clavePublica[1]; |
![]() |
(2.1.1.2) |
y e, el exponente de cifrado, el segundo.
> | e:=clavePublica[2]; |
![]() |
(2.1.1.3) |
El valor de la clave privada es
> | clavePrivada; |
![]() |
(2.1.1.4) |
La forman n, al igual que en la pública, y d, el exponente de descifrado:
> | d:=clavePrivada[2]; |
![]() |
(2.1.1.5) |
Para comprobar si son correctas, veremos si la clave pública es inversa de la privada y para ello realizamos la siguiente operación.
> | e * d mod (numtheory[phi](n)); |
![]() |
(2.1.1.6) |
> |
El resultado de la multiplicación módulo phi de n es 1, por lo que corroboramos que la clave pública y la privada son inversas entre sí, y por lo tanto que es un par de claves válido.
Supongamos que dos usuarios A y B desean comunicarse un mensaje m, que estará escrito en un alfabeto A y se puede convertir a un número entero mediante la función Mensaje_numérico . En este caso es B el que quiere enviarle el mensaje a A. Para ello realizará las siguientes operaciones:
c = (mod nA)
que envía a A.
La restricción de mcd(m,n)=1 no es una condición demasiado restrictiva ya que la probabilidad de que no se cumpla es despreciable. La probabilidad de que el número elegido m dé problemas viene dada por la siguiente expresión:
cuyo valor es prácticamente despreciable si p y q son grandes.
Ahora pondremos en práctica lo explicado utilizando la función RSA de la librería " HerramientasRSA" , los ejemplos dados a continuación son modificables.
La función RSA tiene tres argumentos:
> | mensaje:="Primer mensaje cifrado por RSA."; |
![]() |
(2.1.2.1) |
> | alfabeto:=Castellano; |
![]() ![]() ![]() |
(2.1.2.2) |
> | clavePublica; |
![]() |
(2.1.2.3) |
Ahora procedemos a cifrar el mensaje:
> | mensajeCifrado:=RSA(mensaje,alfabeto,clavePublica); |
![]() ![]() |
(2.1.2.4) |
Los dígitos que observamos corresponden al mensaje cifrado o criptograma.
2.1.3 Descifrado de mensajes
Cuando A recibe el criptograma, para recuperar el mensaje original m, debe realizar el siguiente proceso:
A usa su clave privada dA y realiza el siguiente cálculo a cada elemento perteneciente al criptograma: . Después obtiene el equivalente de texto de cada número y concatena todas las cadenas de caracteres.
Con esto se recupera el mensaje ya que:
≡ m (mod
)
(Esto es por la consecuencia del teorema de euler)
Para descifrar podemos utilizar de nuevo la función RSA contenida en la librería " HerramientasRSA ", aunque esta vez se invocará con los parámetros adecuados para descifrar:
> | mensajeCifrado; |
![]() ![]() |
(2.1.3.1) |
> | alfabeto; |
![]() ![]() |
(2.1.3.2) |
> | clavePrivada; |
![]() |
(2.1.3.3) |
Ahora procedemos a descifrar el mensaje:
> | mensajeDescifrado:=RSA(mensajeCifrado,alfabeto,clavePrivada); |
![]() |
(2.1.3.4) |
Podemos ver que recuperamos el mensaje original "Primer mensaje cifrado por RSA.".
Uno de los grandes problemas que ha preocupado a la criptografía es confirmar la identidad del emisor, de forma que se pueda comprobar que no existe una suplantación de identidad. Este problema se conoce como autenticación de identidad.
Los criptosistemas de clave pública dan una solución a este problema.
De esta manera surge la firma digital, con la cual el destinatario puede verificar que el emisor es quien dice ser, además de asegurar que el mensaje no ha sido modificado.
El emisor crea la firma digital a partir del mensaje, su clave privada y la clave pública del destinatario.
Existen diferentes tipos de firmas digitales, las cuales se clasifican de la manera siguiente:
En todo caso la firma siempre será fácil de generar y verificar, y difícil de falsificar, si no, no tendría sentido su utilización. Nosotros solo trataremos firmas explícitas, públicas e irrevocables.
3.1 Protocolo de firma digital
Dado un criptosistema de clave pública, se puede definir un protocolo de firma digital, que está formado por dos procesos:
3.1.1 Firma
En el caso de que el usuario B desee enviar un mensaje m al usuario A junto con su firma digital, en primer lugar deberá obtener el criptograma del mensaje cifrado con la clave pública de A, kA:
siendo f la función de cifrado que se utilice.
A continuación, B calculará su firma de la siguiente forma:
r =
s =
Por último enviará la pareja (c,s) al destinatario A.
De esta manera solo el usuario B es capaz de generar la rúbrica r del paso 1, ya que solo él conoce su clave privada.
3.1.2 Verificación
A continuación veremos los pasos que ha de realizar A para verificar que el mensaje ha sido enviado por B.
r = =
s = = m
El protocolo que hemos descrito genera una firma digital con las siguientes características:
3.2 Firma digital del RSA
Sean las claves de los usuarios A y B las siguientes:
Si B quiere enviar un mensaje m cifrado y firmado a A, deberá realizar lo siguiente:
r ≡ (mod nB)
s ≡ (mod nA)
Por último, B enviará la pareja (c,s), c es el criptograma correspondiente al mensaje m, cifrado con la clave pública de A.
En el protocolo de Firma digital, basado en RSA, el distinto tamaño de los módulos de las claves de A y B puede dar problemas, cuando al hacer los cálculos módulo nA se obtiene un número mayor que módulo nB.
Para solventar este problema se puede hacer lo siguiente:
Ahora procederemos a usar la función Firma_RSA contenida en la librería " HerramientasRSA " para ejemplificar cómo se firma un mensaje.
Esta función tiene 4 parámetros de entrada.
> | alfabeto:= Castellano; |
![]() ![]() ![]() |
(3.2.1.1) |
> | mensaje:="Ejemplo de mensaje cifrado y firmado por el usuario B."; |
![]() |
(3.2.1.2) |
> | publica_B:=Genera_clave(3,privada_B); |
![]() |
(3.2.1.3) |
> | privada_B; |
![]() |
(3.2.1.4) |
> | publica_A:=Genera_clave(3,privada_A); |
![]() |
(3.2.1.5) |
> |
A continuación realizaremos el cifrado y la firma de la siguiente forma:
> | mensajeFirmado:=Firma_RSA(alfabeto,mensaje,publica_A,privada_B); |
![]() ![]() ![]() ![]() ![]() ![]() |
(3.2.1.6) |
Este es el mensaje cifrado y firmado por el usuario B, siendo el criptograma:
> | criptograma:= mensajeFirmado[1]; |
![]() ![]() ![]() |
(3.2.1.7) |
y la firma:
> | firma:= mensajeFirmado[2]; |
![]() ![]() ![]() |
(3.2.1.8) |
3.2.2 Verificación RSA
Para verificar la firma de B, el usuario A deberá:
(mod nA) ≡ r
(mod nB) ≡
Ahora veremos cómo actuaría el usuario A con otro ejemplo complementario al visto en el anterior punto (3.2.1 Firma RSA). Para ello usaremos la función Comprueba_firma incluída en la librería HerramientasRSA . En esta ocasión la función necesitará los siguientes parámetros.
> | alfabeto:=Castellano; |
![]() ![]() ![]() |
(3.2.2.1) |
> | mensajeFirmado; |
![]() ![]() ![]() ![]() ![]() |
(3.2.2.2) |
> | privada_A; |
![]() |
(3.2.2.3) |
> | publica_B; |
![]() |
(3.2.2.4) |
Ahora A procederá a verificar la firma y a descifrar el criptograma.
> | Comprueba_firma(alfabeto,mensajeFirmado,privada_A,publica_B); |
![]() ![]() |
(3.2.2.5) |
Si el procedimiento es correcto obtendremos el mensaje "La firma es correcta verificamos la procedencia del mensaje" y además mostrará el mensaje, en este caso "Ejemplo de mensaje cifrado y firmado por el usuario B."
Un ataque contra el protocolo de firma digital (hablando del criptosistema RSA) se realizaría de la misma forma, ya que las operaciones ejecutadas son las mismas.
En algunas ocasiones, la propia rúbrica se utiliza como firma digital del mensaje, de modo que solo se realizaría el primer paso tanto para firmar como para verificar. De este modo agilizamos el proceso de firma, reduciendo su tiempo.
3.3 Funciones resumen
En general, para firmar digitalmente se recurre a un resumen del mensaje y no al mensaje completo. Esto es para evitar trabajar con una firma de la misma longitud que el mensaje a cifrar, ya que los procesos de cifrado y descifrado son, por lo tanto, más lentos.
Las funciones resumen son funciones unidireccionales públicas y se aplican a un mensaje de tamaño arbitrario para obtener un resumen de tamaño fijo.
Si se desea utilizar con propósitos criptográficos, esta función debe verificar las siguientes propiedades:
En la práctica el protocolo de firma digital para RSA se realiza sustituyendo el mensaje por un resumen de éste.
En nuestro caso usaremos la función resumen Hash MD5.
Es una función resumen propuesta por Rivest y es de 128 bits. Fue creada para mejorar a su antecesora la función MD4, ya que se encontraron problemas de colisiones. Ha sido muy utilizada, aunque también se han encontrado numerosas debilidades.
Se han encontrado una tasa de colisiones más alta de lo que se esperaba para su función de compresión.
Por ello en EEUU no se admite. Pese a ello en este libro hemos decidido utilizarla por su importancia histórica ya que su diseño ha servido como modelo para otras posteriores.
Ahora usaremos la función Mensaje_firmado contenida en la librería HerramientasRSA para obtener la firma de un mensaje. Esta función, que utiliza la función resumen MD5 recibe 3 parámetros:
> | mensaje:= "Firma realizada con función resumen MD5"; |
![]() |
(3.3.1.1) |
> | alfabeto:=Castellano; |
![]() ![]() ![]() |
(3.3.1.2) |
> | publica_A; |
![]() |
(3.3.1.3) |
> | privada_B; |
![]() |
(3.3.1.4) |
Ahora firmamos el mensaje y obtenemos:
> | resultado:=Mensaje_firmado(mensaje,alfabeto,publica_A,privada_B); |
![]() ![]() ![]() |
(3.3.1.5) |
Como resultado obtenemos el par criptograma y firma:
> | criptograma:=resultado[1]; |
![]() ![]() |
(3.3.1.6) |
> | firma:=resultado[2]; |
![]() |
(3.3.1.7) |
Podemos observar la gran ventaja señalada anteriormente, la firma es mucho más pequeña que el mensaje, lo que agiliza los procesos de cifrado y descifrado posteriores. Ahora veremos cómo la longitud de la firma no aumenta aunque aumentemos la longitud del mensaje, esta es otra gran ventaja de las funciones resumen frente a la firma convencional, que aumentaba el tamaño de la firma al aumentar el del mensaje.
Usaremos los mismos datos que en el anterior ejemplo aunque modificaremos el mensaje:
> | mensaje2:="Ahora vamos a realizar una prueba de firma de mensaje con la función resumen MD5, la cual fue propuesta por Rivest."; |
![]() ![]() ![]() |
(3.3.1.8) |
Ahora procedemos a firmar el mensaje:
> | resultado:=Mensaje_firmado(mensaje2,alfabeto,publica_A,privada_A); |
![]() ![]() ![]() ![]() ![]() ![]() |
(3.3.1.9) |
Obtenemos como resultado:
> | criptograma:=resultado[1]; |
![]() ![]() ![]() ![]() ![]() ![]() |
(3.3.1.10) |
> | firma:=resultado[2]; |
![]() |
(3.3.1.11) |
El criptograma, obviamente, aumenta su longitud, por otro lado la firma permanece con una longitud idéntica a la del ejemplo anterior. En la actualidad las funciones resumen son fundamentales en estos procesos.
4. Criptoanálisis elementales al RSA
Todo criptosistema debe mantener la seguridad, esto significa que tiene que ser resistente a posibles ataques realizados por criptoanalistas. Nosotros haremos un repaso por los ataques que se han realizado a lo largo de la historia para romper el RSA.
Debido a que el RSA es un criptosistema muy extendido y utilizado, han sido numerosos los estudios que se han realizado para romperlo. Aún con estos estudios todavía no se ha logrado romper su fortaleza, siempre y cuando tomemos una serie de medidas para dificultar los ataques del criptoanalista.
Primeramente, para tener una visión más general de lo que es un ataque a un criptosistema, veremos los tipos de ataques que se utilizan para romper un criptosistema genérico. Se debe partir de la premisa de que el criptoanalista desconoce tanto las claves utilizadas como el texto en claro.
4.1 Tipos de ataques
Antes de describir los ataques, se ha de tener en cuenta que existen dos puntos de vista a considerar: en relación a la actitud del atacante y en relación con el tipo de ataque.
Con relación a la actitud del atacante, podemos distinguir dos clases de ataques:
Si hablamos de los ataques en relación a su tipo, sin incluir el ataque por fuerza bruta en el cual se prueban todas las posibles claves hasta que se da con la correcta, la clasificación se regirá por las herramientas de que se disponga y del conocimiento sobre el criptosistema que se intenta atacar. Los ataques pasivos conocidos son los siguientes:
En el criptosistema RSA cualquiera puede cifrar un texto en claro y obtener el criptogama, ya que la clave de cifrado es pública por lo que en general la mayoría de los ataques se centran en intentar obtener la clave privada a partir de la clave pública, por ejemplo intentado factorizar n para conseguir y así poder obtener d, la clave privada. Algunos algoritmos de factorización.
En el caso de los ataques activos tenemos los siguientes tipos:
RSA se defiende de los ataques activos mediante los protocolos de autenticación como firma digital .
4.2 Elección de los primos p y q
Principalmente, la fortaleza del criptosistema RSA se debe a la dificultad computacional de factorizar n, ya que n = p · q y conociendo ambos valores (p y q) se conocería también ϕ(n). A partir de ϕ(n) y de e (que forma parte de la clave pública junto con n), se puede obtener fácilmente la clave privada () que se puede calcular de modo eficiente utilizando el algoritmo de Euclides extendido.
En este apartado veremos las condiciones que deberán cumplir los primos p y q para que la tarea del criptoanalista sea lo más complicada posible. Las tres primeras propiedades que analizaremos serán referentes a la pareja p y q, mientras que las dos últimas son de cada uno de los primos.
4.2.1 p y q deben ser de la misma longitud
Ambos deberán tener una longitud aproximadamente igual, para que el número de divisiones necesarias para intentar encontrar un factor de n sea próximo a Actualmente, la recomendación mínima para la longitud de p y q es de 512 bits, por lo que n será al menos de 1024 bits.
4.2.2 p y q no deben estar demasiado cercanos
Ambos valores no deben ser demasiado cercanos ya que de ser así y, si por ejemplo p < q, entonces sería pequeño y se tendría:
de modo que la diferencia:
también sería pequeña. Como el segundo miembro es un cuadrado perfecto, con pocos tanteos se puede encontrar un entero x > , tal que
Entonces se obtiene que:
p = x - y q = x + y
con lo que n quedaría factorizado.
Algoritmo de factorización de Fermat.
4.2.3 El mcd(p-1,q-1) debe ser pequeño
Si mcd(p-1,q-1) es grande, el mcm(p-1,q-1) va a ser muy pequeño en comparación a ϕ(n)=, ya que:
u = mcm(p-1,q-1) =
Ahora, cualquier inverso de e módulo u, por ejemplo k, sirve como exponente de descifrado y verifica:
≡1 mod(n)
para todo mensaje m. Entonces si u es pequeño, esta propiedad se aprovecha para romper el criptosistema realizando los siguientes pasos:
Si u es realmente pequeño en comparación con ϕ(n) el éxito de los pasos anteriores se puede alcanzar con relativa eficiencia computacional.
4.2.4 p - 1 y q - 1 deben contener factores primos grandes
Los factores primos de p-1 y q-1 deben ser grandes, ya que en cualquier otro caso existen algoritmos capaces de calcular ϕ(n). Veáse algoritmo p - 1 de Pollard.
4.2.5 p y q deben ser robustos
Un primo p impar se califica como robusto cuando verifica las siguientes condiciones:
En el criptosistema RSA tanto p como q deberían de cumplir estas condiciones para que la factorización de n sea lo más costosa posible.
Ahora aplicaremos los puntos anteriores con ayuda de la función Primos_buenos de la librería " HerramientasRSA ". Esta función nos dirá qué requisitos de los anteriormente estudiados se cumplen para una pareja de primos p y q. La función recibe como parámetros:
> | primos:=[7,11]; |
![]() |
(4.2.1) |
Ahora ejecutaremos la función para estudiar cómo de eficiente es esta pareja:
> | Primos_buenos(primos); |
![]() |
(4.2.2) |
Podemos comprobar que esta pareja no es excesivamente segura previniendo ataques.
En este otro ejemplo usaremos otra pareja de primos que sea más segura:
> | Primos_seguros:=[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531,71384962635873976996118143625544625443742054130746649214492268913008304288974695172589041723413789895923279772049694412091264539202699010740625712658132479]; |
![]() ![]() ![]() ![]() ![]() ![]() |
(4.2.3) |
> | Primos_buenos(Primos_seguros); |
![]() |
|
![]() |
|
![]() |
(4.2.4) |
Esta segunda pareja de primos vemos que cumplen más propiedades que la anterior, por lo que estaremos más seguros de que será más difícil de factorizar nuestra n.
4.3 Elección del exponente de cifrado e
Una vez elegido un valor grande para n,el módulo RSA, seleccionaremos un exponente de cifrado pequeño. El motivo para elegir e pequeño se debe a que para cifrar un mensaje m se realiza operación , de modo que si e es demasiado grande la tarea de cifrado será poco eficiente. También es aconsejable que la expresión binaria de e sea sencilla dado que, en general, se usa un
algoritmo de potenciación modular rápida
para calcular el cifrado de m.
4.3.1 Exponente de cifrado pequeño
Por las razones mencionadas anteriormente, se aconsejan valores de e pequeños y fáciles de escribir en binario. Los valores más usuales son e=3 ó e= 65537. En efecto:
4.3.2 Exponente de cifrado común
En caso de que varios usuarios de un grupo coincidan en la elección del elemento e (exponente de cifrado) deberán tener distinto n. En otro caso, tendrían el mismo exponente de descifrado d (o clave privada).
4.3.3 Exponente pequeño con mensajes iguales
Si se desea enviar el mismo mensaje a distintos destinatarios, no es recomendable usar valores pequeños de e ya que un posible criptoanalista podría obtener los siguientes criptogramas:
x ≡ C1 (mod n1)
x ≡ C2 (mod n2)
x ≡ C3 (mod n3)
En el caso de resolver este sistema, se obtendría el mensaje original.
Para estar prevenidos de estos ataques, deberemos generar una secuencia aleatoria de bits que añadiremos al comienzo del mensaje previamente al cifrado. Este proceso se denomina "salar" el mensaje.
4.4 Elección del exponente de descifrado d
Una sugerencia es que el tamaño (número de bits de su representación en binario) del exponente de descifrado sea el mismo que el de n. En caso contrario, si
número de bits (d) ≤ 1/4 número de bits (n)
entonces existe un algoritmo eficiente para calcular d.
En esta parte abordaremos algunas de las aplicaciones que se pueden desarrollar utilizando el criptosistema RSA o bien, utilizando la complejidad del problema de la factorización de números enteros. Un gran número de estas aplicaciones se conocen por "protocolos criptográficos", esto quiere decir que son procedimientos que resuelven determinado tipo de problemas, haciendo uso de herramientas criptográficas, claves, criptosistemas, firmas digitales, etc.
5.1 Lanzamiento de moneda por teléfono
Dos personas quieren decidir quién va a llevar a cabo una determinada acción. Si las personas están en el mismo lugar, esa decisión se puede tomar lanzando una moneda y elegir cara o cruz. Pero ¿y si esas personas están en lugares distintos, cómo se puede diseñar un proceso que sea equivalente a lanzar una moneda por teléfono?
El protocolo que se presenta se basa, al igual que el criptosistema RSA, en la dificultad de factorizar un entero n producto de dos primos grandes y en la idea de que este problema es equivalente a calcular raíces cuadradas módulo n.
En la sección 5.1.1 veremos como conocida la factorización se pueden calcular raíces cuadradas módulo n. Esta parte se utliza para emular el "lanzamiento de monedas". En la sección 5.1.2 veremos cómo conocidas las raíces cuadradas obtenemos la factorización de n. Este resultado se usa para comprobar que el otro contendiente no está haciendo trampa.
5.1.1 Cálculo de raíces cuadradas conocida la factorización
Sea n = p · q, p, q primos distintos. Sea a ≡ (mod n), esto es, a es un cuadrado módulo n. Entonces la ecuación
≡ a (mod n), tiene exactamente cuatro soluciones distintas:
Dichas soluciones se obtienen resolviendo primero las ecuaciones:
≡ a (mod p)
≡ a (mod q)
y aplicando, después, el Teorema Chino de los restos. Si además , p, q ≡ 3 (mod 4) se verifica que las soluciones son:
u = (mod p)
v = (mod q)
y las cuatro raíces cuadradas de a módulo n son:
r = ± u · q · ( mod p) ± v · p . (
mod q)
Veamos ahora el procedimiento para "lanzar una moneda por teléfono".
± a, ± b ( ≡
≡ y (mod n))
Elige una y se la envía a B. Esto equivale a elegir cara o cruz. Supongamos que envía a.
5.1.2 Factorización conocida la raíz cuadrada (o de cómo A puede estar seguro de que B no le engaña)
Si a es un cuadrado módulo n, conocidas las cuatro raíces de a es fácil factorizar n.
Sean x , y tales que ≡ a (mod n),
≡ a (mod n) ⇒ (
-
) = (x - y) (x + y) ≡ 0 (mod n) ⇒ n | (x - y) (x + y)
Por construcción:
n ∤ (x - y) mcd(n, x - y) = p
⇒
n ∤ (x + y) mcd(n, x + y) = q
¿Cómo puede estar A seguro de que B no le engaña?
Si a ≢ ± x ⇒ B conoce las 4 raíces de y :
Calculando mcd(a - b, n) = p , B proporciona a A la factorización de n. Sólo puede dar la factorización en poco tiempo si conoce las raíces, en otro caso, tardaría mucho tiempo.
5.1.3 Ejemplos
En esta sección veremos cómo actúa este protocolo a través de diferentes funciones de la librería " HerramientasRSA ". Se realizarán dos ejemplos, uno completo para ver cómo se usan las funciones y luego otro en blanco para que el lector introduzca sus propios datos. Antes de esto veremos las funciones que usaremos.
Ya que los primos que elijamos deben de cumplir el requisito de que ambos sean congruentes con 3 módulo 4, p,q ≡ 3 (mod 4), usaremos la función Genera_primos que nos dará un par de primos válidos para realizar el protocolo. Esta función recibe como parámetro:
Ahora veremos cómo actúa:
> | parejaPrimos:=Genera_primos(3); |
![]() |
|
![]() |
(5.1.3.1) |
Como vemos la función genera dos primos de longitud 3, vamos a comprobar si cumplen el requisito p, q ≡ 3 (mod 4) :
> | p:= parejaPrimos[1];
q:= parejaPrimos[2]; |
![]() |
|
![]() |
(5.1.3.2) |
> | p mod 4;
q mod 4; |
![]() |
|
![]() |
(5.1.3.3) |
Vemos que ambos lo cumplen, por lo que son válidos para usarlos en nuestro ejemplo.
A continuación veremos cómo usar la función Lanza_moneda , la cual no recibe ningún parámetro, pero tiene un comportamiento especial ya que el usuario deberá introducir ciertos datos para simular el lanzamiento de la moneda. La función simulará las acciones realizadas por el usuario B y el lector deberá tomar las decisiones correspondientes al usuario A.
Cuando ejecutemos la función habrá que seguir los pasos siguientes:
Veamos un ejemplo de ejecución:
> | Lanza_moneda(); |
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
(5.1.3.4) |
5.2 Protocolo SET Comercio Electrónico
A medida que las tecnologías de la información han ido evolucionando, nuevos modos de comercio han aparecido, aunque esto también provoca que los criptoanalistas busquen métodos para atacar los nuevos sistemas. Es en estos casos cuando la seguridad de la información se convierte en una herramienta necesaria para evitar posibles fraudes como robos de información vital de los usuarios.
5.2.1 Transacción electrónica segura
Siempre que se emite una transacción electrónica de parte de alguien por internet, se transmiten grandes cantidades de información. Estos datos son personales y se deben proteger para ocultar la identidad del comprador y prevenir el fraude. A continuación mostramos los requisitos esenciales para una transacción electrónica segura:Autenticidad: Los participantes en la transacción no pueden ser suplantados ni sus firmas falsificadas.Integridad: Documentos, como una orden de compra y las instrucciones de pago, no pueden ser alterados.Privacidad: Los detalles de la transacción deberían permanecer tan seguros como sea posible.Seguridad: Tanto la información sensible de la cuenta bancaria, como los números de la tarjeta deben estar protegidos.Durante estas transacciones el banco no debe saber qué es lo que el cliente está comprando, y por motivos de seguridad el mercader no debe saber el número de la tarjeta del pago. La doble firma soluciona este problema.Los tres participantes de la transacción son el Cliente (propietario de la tarjeta), el Banco y el Mercader (vendedor).El Cliente tiene dos informaciones diferentes:GSO (Goods and Services Order): Contiene información como el nombre del mercader y del cliente, la cantidad de cada elemento a comprar, los precios, etc. Este elemento sería la orden de compra.PI (Payment Instructions): Contiene las instrucciones de pago, que incluyen el nombre del mercader, el número de la tarjeta de crédito, el precio total, etc.
5.2.2 Sistema o proceso de pago
Para el proceso se utilizará una función hash, en este caso usaremos la función MD5 implementada en Maple, que llamaremos H. Se utilizarán también las funciones RSA del Cliente, Mercader y Banco, las cuales llamaremos Ec, Em y Eb para las de cifrado, y Dc, Dm y Db para las de descifrado que usan las claves privadas, respectivamente: El Cliente realizará las siguientes operaciones:1. Calcula GSOMD = H(Em (GSO)), primero se cifra la orden de pago con la clave pública del Mercader y luego se aplica la función hash.2. Calcula PIMD = H(Eb(PI)), ahora ciframos los datos bancarios con la clave pública del Banco y se vuelve a aplicar la función hash.
3. Concatena GSOMD y PIMD para obtener GSOMD||PIMD, ahora le aplicamos el hash para obtener POMD, POMD = H(GSOMD||PIMD).4. Firma POMD con su clave privada calculando DS = Dc(POMD). Esta es la doble firma.5. Envía Em(GSO), DS, PIMD y Eb(PI) al Mercader.• El Mercader realiza las siguientes operaciones:1. Calcula H(Em(GSO)), que debería ser igual que GSOMD.2. Calcula H(H(Em(GSO)) || PIMD) y Ec(DS). Si son iguales estos valores, el Mercader verifica la firma del Cliente y se asegura que no hay suplantación de la identidad.3. Calcula Dm(Em(GSO)) para obtener GSO (la orden de compra).4. Envía GSOMD, Eb(PI) y DS al Banco.• El Banco realiza lo siguiente:1. Calcula H(Eb(PI)) que debería ser igual que PIMD. 2. Concatena GSOMD || H(Eb(PI)) .3. Calcula H(GSOMD||H(Eb(PI))) y Ec(DS). Si son iguales, el Banco verifica la firma del Cliente.4. Realiza Db(Eb(PI)), obteniendo las instrucciones de pago PI.5. Devuelve una autorización firmada y encriptada de pago (con Em) al Mercader, garantizando el pago.• El Mercader completa el proceso con lo siguiente:1. Devuelve un recibo encriptado y firmado (con Ec) al Cliente, indicando que la transacción ha sido completada. El Mercader sólo ve las instrucciones de pago cifradas, y no ve el número de la tarjeta de crédito. Es imposible que tanto el Mercader como el Banco modifiquen la orden de pago, ya que se ha usado una función Hash para calcular DS. El Banco en ningún momento puede ver lo que se está comprando.Los requisitos de integridad, privacidad y seguridad se cumplen en este proceso. En actuales implementaciones de este proceso, se realizan más pasos para proteger la autenticidad.
Ahora veremos una simulación de este proceso con ayuda de las funciones SET_cliente , SET_mercader y SET_banco de la librería " HerramientasRSA ". Primero definiremos todos los datos necesarios para completar el protocolo correctamente:
GSO, definiremos como orden de compra:
> | GSO:="Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros."; |
![]() ![]() ![]() ![]() |
(5.1.4.2.1) |
PI, en este caso tomaremos como instrucción de pago lo siguiente:
> | PI:="Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. El número de tarjeta es: 25874196347854214555. Cantidad : 200 Euros"; |
![]() ![]() ![]() |
(5.1.4.2.2) |
Claves privadas y públicas de cliente, mercader y banco:
> | publica_cliente:= Genera_clave(3,privada_cliente); |
![]() |
(5.1.4.2.3) |
> | privada_cliente; |
![]() |
(5.1.4.2.4) |
> | publica_mercader:= Genera_clave(3,privada_mercader); |
![]() |
(5.1.4.2.5) |
> | privada_mercader; |
![]() |
(5.1.4.2.6) |
> | publica_banco:= Genera_clave(3,privada_banco); |
![]() |
(5.1.4.2.7) |
> | privada_banco; |
![]() |
(5.1.4.2.8) |
> | alfabeto:=Castellano; |
![]() ![]() ![]() ![]() |
(5.1.4.2.9) |
Una vez definidos todos los datos necesarios, vamos a proceder a ejecutar los diferentes pasos del protocolo:
Ahora usaremos la función y veremos cuál es su salida:
> | datos:=SET_cliente(PI,GSO,alfabeto,publica_mercader,publica_banco,privada_cliente); |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
![]() |
|
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
![]() |
|
![]() |
|
![]() ![]() |
|
![]() |
|
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
(5.1.4.2.10) |
Los datos que el cliente envía al mercader para continuar la operación son:
Em(GSO) : Orden de compra cifrada con la clave pública del mercader, sólo el mercader puede descifrar lo que el cliente compra.
> | datos[1]; |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
(5.1.4.2.11) |
DS: Concatenación de los resúmenes de la orden de compra y las instrucciones de pago, firmadas con la clave privada del cliente.
> | datos[2]; |
![]() ![]() |
(5.1.4.2.12) |
Eb(PI): Datos bancarios cifrados con la clave pública del banco, sólo el banco podrá descifrar los datos bancarios del cliente.
> | datos[4]; |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
(5.1.4.2.13) |
PIMD: Es el resumen del Eb(PI).
> | datos[3]; |
![]() |
(5.1.4.2.14) |
Con estos datos continuaremos el proceso observando el resultado de la función SET_mercader :
> | datos_mercader:=SET_mercader(datos,alfabeto,publica_cliente,privada_mercader); |
![]() |
|
![]() ![]() ![]() |
|
![]() |
|
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
(5.1.4.2.15) |
El mercader verifica la firma del cliente, y obtiene la orden de compra. Este por último envía los siguientes datos al banco:
GSOMD: Es el resumen de Em(GSO)
> | datos_mercader[1]; |
![]() |
(5.1.4.2.16) |
Eb(PI): Instrucciones de pago cifradas con la clave pública del banco.
> | datos_mercader[2]; |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
(5.1.4.2.17) |
DS: EL cual permite verificar la firma del cliente.
> | datos_mercader[3]; |
![]() ![]() |
(5.1.4.2.18) |
Una vez descritos los parámetros, ejecutaremos la función:
> | SET_banco(datos_mercader,alfabeto,publica_cliente,privada_banco); |
![]() |
|
![]() ![]() |
(5.1.4.2.19) |
El banco a través de este proceso verifica la firma del cliente, y obtiene los datos bancarios de éste contenidos en las instrucciones de pago o PI.
Una vez finalizado el proceso se envían confirmaciones de cada una de las acciones, para verificar que cada uno de los pasos se ha ejecutado con éxito.
> | restart;
libname := ".", libname: with(HerramientasRSA): |
> |
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License