1. Introducción al RSA 

 

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 `*`(`^`(n, 2)). 

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: 

 

 

 

2. Descripción del RSA 

 

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. 

 

Image 

 

 

2.1 Protocolo RSA 

 

El protocolo consta de tres partes: 

 

  • Generación de claves
 

  • Cifrado de mensajes
 

  • Descifrado de mensajes
 

 

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:   

 

  • U elige dos números primos grandes p y q (se recomienda que ambos primos tengan entre 116 y 155 dígitos) y calcula su producto (n=p·q). El conjunto de mensajes a utilizar por el usuario U será el grupo multiplicativo . El número de elementos de este grupo es ϕ(n), donde ϕ es el indicador de Euler .  
 

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) 

 

  • A continuación U elige un entero e, con 2 < e < ϕ(n), de modo que
 

mcd(e, ϕ(n)) = 1 

 

  • Ahora el usuario U calcula d, el inverso de e módulo ϕ(n), por lo que se verifica que 1 < d < ϕ(n) y
 

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);
 

[382997, 257] (2.1.1.1)
 

>
 

En este ejemplo n sería el primer número del par anterior, 

> n:=clavePublica[1];
 

382997 (2.1.1.2)
 

y e, el exponente de cifrado, el segundo. 

> e:=clavePublica[2];
 

257 (2.1.1.3)
 

El valor de la clave privada es 

> clavePrivada;
 

[382997, 194561] (2.1.1.4)
 

La forman n, al igual que en la pública, y d, el exponente de descifrado: 

> d:=clavePrivada[2];
 

194561 (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));
 

1 (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. 

 

2.1.2 Cifrado de mensajes 

 

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: 

 

  • B consulta la clave pública de A, el par (nA , eA).
 

  • B representa el mensaje m como un elemento de  Z[n] , esto quiere decir que pertenecerá al rango {0,1, ... ,nA - 1 } y además será primo con nA.  Si es necesario dividirá el mensaje m en trozos de menor tamaño para que el equivalente numérico de cada trozo sea menor que nA. Ver enlace
 

  • B calcula el valor del criptograma
 

c = `^`(m, eA) (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: 

 

`≈`(`/`(`*`(`+`(p, q, `-`(2))), `*`(`+`(Typesetting:-delayDotProduct(p, q), `-`(1)))), `+`(`/`(1, `*`(q)), `/`(1, `*`(p)))) 

 

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: 

  • Primer argumento: es el mensaje, en este caso  será el mensaje a cifrar. En el ejemplo cifraremos el mensaje: "Primer mensaje cifrado por RSA."
 

> mensaje:="Primer mensaje cifrado por RSA.";
 

Primer mensaje cifrado por RSA. (2.1.2.1)
 

  • Segundo argumento: el alfabeto, que será el alfabeto con el que cifraremos el mensaje. En el ejemplo usaremos el alfabeto Castellano que hemos definido como:
 

> alfabeto:=Castellano;
 

 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
(2.1.2.2)
 

 

> clavePublica;
 

[382997, 257] (2.1.2.3)
 

 

Ahora procedemos a cifrar el mensaje: 

> mensajeCifrado:=RSA(mensaje,alfabeto,clavePublica);
 

[215652, 319521, 363132, 246057, 333459, 171372, 153163, 10601, 206310, 303913, 344253, 226998, 246368, 214194, 9838, 239833]
[215652, 319521, 363132, 246057, 333459, 171372, 153163, 10601, 206310, 303913, 344253, 226998, 246368, 214194, 9838, 239833]
(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: `mod`(`^`(c, dA), n[A]). 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 n[A]) 

                                                                                (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;
 

[215652, 319521, 363132, 246057, 333459, 171372, 153163, 10601, 206310, 303913, 344253, 226998, 246368, 214194, 9838, 239833]
[215652, 319521, 363132, 246057, 333459, 171372, 153163, 10601, 206310, 303913, 344253, 226998, 246368, 214194, 9838, 239833]
(2.1.3.1)
 

  • Segundo argumento: el alfabeto, el mismo con el que se ha cifrado:
 

> alfabeto;
 

 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
(2.1.3.2)
 

  • Tercer argumento: la clave privada, en este caso para descifrar usaremos la clave privada correspondiente a la clave pública utilizada para generar el criptograma, que es la obtenida en el punto 2.1.1 Generación de claves.
 

> clavePrivada;
 

[382997, 194561] (2.1.3.3)
 

 

Ahora procedemos a descifrar el mensaje: 

> mensajeDescifrado:=RSA(mensajeCifrado,alfabeto,clavePrivada);
 

Primer mensaje cifrado por RSA. (2.1.3.4)
 

 

Podemos ver que recuperamos el mensaje original "Primer mensaje cifrado por RSA.". 

 

 

3. Firma digital 

 

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. 

 

 

Image 

 

 

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: 

  • El proceso de firma (ejecutado por el emisor)
 

  • El proceso de verificación de la firma (ejecutado por el receptor)
 

 

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: 

 

f[kA](m) = c 

 

siendo f la función de cifrado que se utilice. 

 

A continuación, B calculará su firma de la siguiente forma: 

 

  • B cifrará el mensaje con su clave privada como realizamos en el apartado 2.1.2.  para determinar su rúbrica.
 

 

r =  

 

  • B cifrará la rúbrica anterior con clave pública de A.
 

 

s = f[kA](r) 

 

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. 

 

  • Primero, A determinará la rúbrica de B a través de s y su clave privada.
 

 

r = =   

 

  • Seguidamente, deberá comprobar que la rúbrica es la correspondiente al mensaje enviado por B.
 

 

s = f[kB](r)= m 

 

El protocolo que hemos descrito genera una firma digital con las siguientes características: 

 

  • Es explícita: ya que acompaña al mensaje y no está formando parte de él.
 

  • Es pública: cualquiera podría verificarla.
 

  • Es irrevocable: dado que solo la podría generar la persona que conoce esa clave privada.
 

 

 

3.2 Firma digital del RSA  

 

Sean las claves de los usuarios A y B las siguientes: 

 

  • Claves de A: (nA, eA) y dA, claves pública y privada, respectivamente.
 

  • Claves de B: (nB, eB) y dB, claves pública y privada, respectivamente.
 

 

3.2.1 Firma RSA 

 

Si B quiere enviar un mensaje m cifrado y firmado a A, deberá realizar lo siguiente: 

 

  • B  calcula su rúbrica r con la operación:
 

r ≡ `^`(m, dB)(mod nB) 

  • B cifra la rúbrica con la clave pública de A, eA y nA de la siguiente manera:
 

 

s ≡ `^`(r, eA)(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: 

  • Si nB<nA entonces  s = `*`(d, `*`(B(`*`(e, `*`(A(m))))))
 

  • Si nA<nB entonces  s = `*`(d, `*`(B(c)))
 

 

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, que será con el cual cifraremos el mensaje. En este caso usaremos:
 

> alfabeto:= Castellano;
 

 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
(3.2.1.1)
 

  • mensaje, que cifraremos y firmaremos. En este primer ejemplo utilizaremos el siguiente: "Ejemplo de mensaje cifrado y firmado por el usuario A."
 

> mensaje:="Ejemplo de mensaje cifrado y firmado por el usuario B.";
 

Ejemplo de mensaje cifrado y firmado por el usuario B. (3.2.1.2)
 

  • clave privada del usuario B, que será el que cifre el mensaje. En este ejemplo es la siguiente: 

    > publica_B:=Genera_clave(3,privada_B);
     

    [313457, 4097] (3.2.1.3)
     

    > privada_B;
     

    [313457, 93113] (3.2.1.4)
     

     

    • clave pública de A, que generamos a continuación:
     

    > publica_A:=Genera_clave(3,privada_A);
     

    [133891, 33] (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);
     

    [[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
    [[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
    [[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
    [[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
    [[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
    [[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
    (3.2.1.6)
     

     

    Este es el mensaje cifrado y firmado por el usuario B, siendo el criptograma: 

    > criptograma:= mensajeFirmado[1];
     

    [112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568]
    [112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568]
    [112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568]
    (3.2.1.7)
     

     

    y la firma:  

    > firma:= mensajeFirmado[2];
     

    [124953, 186035, 103941, 232362, 281261, 241538, 273813, 220475, 251944, 24610, 261612, 88596, 151422, 202338, 32389, 175090, 42216, 151422, 783, 2448, 257609, 92595, 83278, 139106, 78729, 232362, 240...
    [124953, 186035, 103941, 232362, 281261, 241538, 273813, 220475, 251944, 24610, 261612, 88596, 151422, 202338, 32389, 175090, 42216, 151422, 783, 2448, 257609, 92595, 83278, 139106, 78729, 232362, 240...
    [124953, 186035, 103941, 232362, 281261, 241538, 273813, 220475, 251944, 24610, 261612, 88596, 151422, 202338, 32389, 175090, 42216, 151422, 783, 2448, 257609, 92595, 83278, 139106, 78729, 232362, 240...
    (3.2.1.8)
     

     

3.2.2 Verificación RSA 

 

Para verificar la firma de B, el usuario A deberá: 

 

  • Recuperar la rúbrica de B haciendo:
 

`^`(s, dA)(mod nA) ≡ r 

  • Verificar que coincide con el mensaje enviado.
 

`^`(r, eB)(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, que será con el cual cifraremos el mensaje. Utilizamos el del ejemplo anterior.
 

> alfabeto:=Castellano;
 

 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
(3.2.2.1)
 

  • mensaje cifrado y firmado, que comprobaremos su veracidad y además descifraremos. Utilizaremos el criptograma obtenido en el punto 3.2.1 Firma RSA.
 

> mensajeFirmado;
 

[[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
[[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
[[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
[[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
[[112788, 97225, 23924, 96652, 50895, 37297, 31879, 33091, 106422, 34611, 28855, 8224, 106173, 9222, 27946, 62438, 18948, 106173, 81032, 77255, 73569, 36299, 132265, 110114, 59391, 96652, 80568], [124...
(3.2.2.2)
 

  • clave privada de A. Como este procedimiento lo realizará el usuario A, él conoce ambas claves.
 

> privada_A;
 

[133891, 92697] (3.2.2.3)
 

  • clave pública del usuario B, ya que el usuario A no tiene acceso a su clave privada.
 

> publica_B;
 

[313457, 4097] (3.2.2.4)
 

 

Ahora A procederá a verificar la firma y a descifrar el criptograma. 

 

> Comprueba_firma(alfabeto,mensajeFirmado,privada_A,publica_B);
 

La firma es correcta (se ha verificado la procedencia del mensaje) y el mensaje es :  Ejemplo de mensaje cifrado y firmado por el usuario B.
La firma es correcta (se ha verificado la procedencia del mensaje) y el mensaje es :  Ejemplo de mensaje cifrado y firmado por el usuario 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: 

 

  • Resistencia a la preimagen: dado el resumen de un mensaje, debe ser computacionalmente inabordable determinar el mensaje del que proviene.
 

  • Resistencia a la segunda preimagen: debe ser computacionalmente difícil obtener un segundo mensaje m2 con el mismo resumen que un mensaje m1 dado.
 

  • Resistencia a colisiones: debe ser baja la probabilidad de colisiones (dos mensajes diferentes tienen el mismo resumen). Aunque obviamente la función no es inyectiva, la probabilidad de que dos mensajes diferentes tengan el mismo resumen debe ser muy pequeña.
 

 

Image 

 

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.  

 

3.3.1 Función resumen 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, usaremos el siguiente: "Firma realizada con función resumen MD5".
 

> mensaje:= "Firma realizada con función resumen MD5";
 

Firma realizada con función resumen MD5 (3.3.1.1)
 

  • alfabeto, como siempre usaremos el castellano
 

> alfabeto:=Castellano;
 

 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
(3.3.1.2)
 

  • clave pública del destinatario y privada del autor que será el que firme el mensaje:
 

> publica_A;
 

[133891, 33] (3.3.1.3)
 

> privada_B;
 

[313457, 93113] (3.3.1.4)
 

Ahora firmamos el mensaje y obtenemos: 

> resultado:=Mensaje_firmado(mensaje,alfabeto,publica_A,privada_B);
 

[[1201, 63581, 66526, 105631, 24780, 10025, 12787, 66526, 43302, 32659, 45809, 67201, 1432, 32659, 105631, 72039, 62313, 32659, 130462, 41790], [77684, 118979, 237832, 34839, 70582, 49919, 38556, 4253...
[[1201, 63581, 66526, 105631, 24780, 10025, 12787, 66526, 43302, 32659, 45809, 67201, 1432, 32659, 105631, 72039, 62313, 32659, 130462, 41790], [77684, 118979, 237832, 34839, 70582, 49919, 38556, 4253...
[[1201, 63581, 66526, 105631, 24780, 10025, 12787, 66526, 43302, 32659, 45809, 67201, 1432, 32659, 105631, 72039, 62313, 32659, 130462, 41790], [77684, 118979, 237832, 34839, 70582, 49919, 38556, 4253...
(3.3.1.5)
 

Como resultado obtenemos el par criptograma y firma: 

> criptograma:=resultado[1];
 

[1201, 63581, 66526, 105631, 24780, 10025, 12787, 66526, 43302, 32659, 45809, 67201, 1432, 32659, 105631, 72039, 62313, 32659, 130462, 41790]
[1201, 63581, 66526, 105631, 24780, 10025, 12787, 66526, 43302, 32659, 45809, 67201, 1432, 32659, 105631, 72039, 62313, 32659, 130462, 41790]
(3.3.1.6)
 

> firma:=resultado[2];
 

[77684, 118979, 237832, 34839, 70582, 49919, 38556, 42537] (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.";
 

Ahora vamos a realizar una prueba de firma de mensaje con la función resumen MD5, la cual fue propuesta por Rivest.
Ahora vamos a realizar una prueba de firma de mensaje con la función resumen MD5, la cual fue propuesta por Rivest.
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);
 

[[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 4330...
[[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 4330...
[[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 4330...
[[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 4330...
[[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 4330...
[[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 4330...
(3.3.1.9)
 

Obtenemos como resultado: 

> criptograma:=resultado[1];
 

[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 43302...
[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 43302...
[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 43302...
[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 43302...
[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 43302...
[107228, 77255, 66526, 84543, 101055, 53351, 66526, 105631, 24780, 10025, 111884, 78909, 121645, 81032, 65473, 55240, 66526, 50895, 27946, 62438, 18948, 82304, 90660, 62313, 68476, 28237, 90660, 43302...
(3.3.1.10)
 

> firma:=resultado[2];
 

[21622, 56863, 59968, 12040, 133835, 70402, 126134, 113644] (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. 

 

 

Image 

 

 

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: 

 

  • Ataques pasivos: el atacante sólo busca atentar contra la confidencialidad de los datos transmitidos, por lo que sólo observa el canal por el que se transmiten dichos datos sin interferir en la emisión.
 

 

  • Ataques activos: el atacante busca atentar contra la integridad, autenticidad y confidencialidad de los datos, por lo que intentará borrar, modificar o alterar la transmisión.
 

 

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: 

 

  • Ataque al texto cifrado: el atacante trata de obtener las claves y el texto en claro a partir del criptograma o texto cifrado. El criptosistema se considerará muy inseguro si es vulnerable a este tipo de ataque.
 

 

  • Ataque al texto claro conocido: el atacante posee una cierta cantidad de textos en claro con sus correspondientes criptogramas.
 

 

  • Ataque al texto en claro conocido: el atacante elige un texto en claro y logra obtener su criptograma correspondiente. Con la información obtenida en este proceso tratará de descifrar un nuevo criptograma o conseguir las claves.
 

 

  • Ataque al texto cifrado elegido: el atacante obtiene el texto en claro a partir de su criptograma correspondiente. Esto ha podido suceder al tener acceso al equipo de descifrado y no a las claves. Una vez realizado esto el atacante intentará descifrar otro criptograma, esta vez sin tener el acceso al equipo de descifrado.
 

 

  • Ataque adaptable al texto en claro elegido: es un ataque al texto en claro elegido en el que el criptoanalista no solo elige el texto en claro que es cifrado, sino que también puede modificar su elección en función de los resultados del cifrado previo.
 

 

  • Ataque adaptable al texto cifrado elegido: es una variante del ataque al texto cifrado elegido en el cual el criptoanalista elige el texto cifrado dependiendo del texto claro recibido a partir de una solicitud previa.
 

 

 

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 `ϕ`(n) 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 .   

 

 

Image 

 

 

 

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 (d = `mod`(`/`(1, `*`(e)), `ϕ`(n)))  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  `*`(`+`(q, `-`(p)), `/`(1, 2)) sería pequeño y se tendría: 

 

`≈`(`*`(`+`(p, q), `/`(1, 2)), sqrt(n)) 

 

de modo que la diferencia: 

 

`+`(`*`(`^`(`*`(`+`(p, q), `/`(1, 2)), 2)), `-`(n)) = `*`(`^`(`*`(`+`(p, `-`(q)), `/`(1, 2)), 2)) 

 

también sería pequeña. Como  el segundo miembro es un cuadrado perfecto, con pocos tanteos se puede encontrar un entero x > sqrt(n) , tal que `+`(`*`(`^`(x, 2)), `-`(n)) = `*`(`^`(y, 2)) 

 

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)=(`+`(p, `-`(1)))(`+`(q, `-`(1))), ya que: 

 

u = mcm(p-1,q-1) = `/`(`*`(`ϕ`(n)), `*`(mcd(`+`(p, `-`(1)), `+`(q, `-`(1))))) 

 

Ahora, cualquier inverso de e módulo u, por ejemplo k, sirve como exponente de descifrado y verifica: 

 

`^`(m, `*`(e, `*`(k)))≡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: 

 

  • Elegir un valor para u y calcular k, el inverso de e módulo u.
 

  • Cifrar varios mensajes sucesivos con el criptosistema y tratar de descifrarlos usando el exponente k.
 

  • Si en alguno de los casos del punto anterior se tiene éxito, el sistema queda roto. En caso contrario se repite el caso 1.
 

 

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: 

 

  • p - 1 tiene un factor primo grande r
 

 

  • p + 1 tiene un factor primo grande s
 

 

  • r - 1 tiene un factor primo grande t
 

 

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: 

 

  •  Un par de primos p y q, en esta ocasión elegiremos los primos 7 y 11:
 

 

> primos:=[7,11];
 

[7, 11] (4.2.1)
 

 

Ahora ejecutaremos la función para estudiar cómo de eficiente es esta pareja: 

 

> Primos_buenos(primos);
 

Cumple el criterio de el máximo común divisor de p-1 y q-1 pequeño. (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];
 

[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531, 713849626358739769961181436255446254437420...
[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531, 713849626358739769961181436255446254437420...
[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531, 713849626358739769961181436255446254437420...
[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531, 713849626358739769961181436255446254437420...
[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531, 713849626358739769961181436255446254437420...
[10461846429537416375608267652243075357790398465683820812897725829585323673275273647658751281971605656454298677788030788325108812826061692229137628851688531, 713849626358739769961181436255446254437420...
(4.2.3)
 

> Primos_buenos(Primos_seguros);
 

 

 

Cumple el criterio de longitud similar.
Cumple el criterio de longitud grande.
Cumple el criterio de el máximo común divisor de p-1 y q-1 pequeño. (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: 

 

  • Tanto e=3 como e= 65537 son números primos.
 

 

  • Si convertimos a binario ambos números, el dígito binario obtenido es elemental lo que facilitará la tarea de calcular
 

 

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.  

 

 

 

 

 

 

 

5. Protocolos y Aplicaciones 

 

 

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? 

 

Image 

 

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`*`(`^`(y, 2)) (mod n), esto es, a es un cuadrado módulo n. Entonces la ecuación `*`(`^`(x, 2))a (mod n), tiene exactamente cuatro soluciones distintas: 

 

Dichas soluciones se obtienen resolviendo primero las ecuaciones: 

 

`*`(`^`(x, 2))a (mod p) 

`*`(`^`(x, 2))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 = `^`(a, `*`(`+`(p, 1), `/`(1, 4))) (mod p) 

v = `^`(a, `*`(`+`(q, 1), `/`(1, 4))) (mod q) 

 

y las cuatro raíces cuadradas de a módulo n son: 

 

r = ± u · q · (`/`(1, `*`(q)) mod p) ± v · p . (`/`(1, `*`(p)) mod q)   

 

 

Veamos ahora el procedimiento para "lanzar una moneda por teléfono". 

 

 

 

 

 

 

 

± a, ± b  (`*`(`^`(a, 2))`*`(`^`(b, 2))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 `*`(`^`(x, 2)) ≡ a (mod n), `*`(`^`(y, 2)) ≡ a (mod n) ⇒ (`*`(`^`(x, 2)) - `*`(`^`(y, 2))) = (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 : 

 

  • ±x (el que él tenía), que es ±b.
 

  • ±a (la que le envía A).
 

 

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: 

 

  • longitud, será el entero que indique el tamaño de la pareja de primos.
 

 

Ahora veremos cómo actúa: 

 

> parejaPrimos:=Genera_primos(3);
 

 

Un par de primos válidos son: 191 y 919
[191, 919] (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];
 

 

191
919 (5.1.3.2)
 

> p mod 4;
q mod 4;
 

 

3
3 (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: 

 

  •  Se pedirá al lector introducir dos números primos, se recomienda utilizar la función Genera_primos . En este ejemplo usaremos los primos 7 y 11.
 

 

  •  La función mostrará los primos elegidos y también las cuatro raíces obtenidas, dos son correctas y dos no lo son, y se pedirá al usuario que introduzca una de las 4.
 

 

  •  El lector introducirá la raíz que desee.
 

 

  •  Por último la función escribirá si el lector ha acertado o no con su decisión.
 

 

Veamos un ejemplo de ejecución: 

 

> Lanza_moneda();
 

 

 

 

 

 

Introduce el primer primo
Introduce el segundo primo
Has introducido los primos: 7 y 11
Introduce la raíz que elijas entre las siguientes:
[19, -19, 47, -47]
¡Lo siento fallaste! (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. 

 

 

Image 

 

 

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.";
 

Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros.
Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros.
Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros.
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";
 

Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. El número de tarjeta es: 25874196347854214555. Cantidad : 200 Euros
Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. El número de tarjeta es: 25874196347854214555. Cantidad : 200 Euros
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: 

 

  • Claves de cliente
 

 

> publica_cliente:= Genera_clave(3,privada_cliente);
 

[382997, 257] (5.1.4.2.3)
 

> privada_cliente;
 

[382997, 194561] (5.1.4.2.4)
 

 

  • Claves de mercader
 

 

> publica_mercader:= Genera_clave(3,privada_mercader);
 

[364999, 2049] (5.1.4.2.5)
 

> privada_mercader;
 

[364999, 130273] (5.1.4.2.6)
 

 

  • Claves de banco
 

 

> publica_banco:= Genera_clave(3,privada_banco);
 

[313457, 4097] (5.1.4.2.7)
 

> privada_banco;
 

[313457, 93113] (5.1.4.2.8)
 

 

  • Alfabeto, usaremos el definido en Castellano:
 

> alfabeto:=Castellano;
 

 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz,.:áéíóúü
(5.1.4.2.9)
 

 

Una vez definidos todos los datos necesarios, vamos a proceder a ejecutar los diferentes pasos del protocolo: 

 

  • Las acciones que realiza el cliente se simulan a través de la función SET_cliente que recibe los siguientes parámetros:
 

 

  • GSO
 

  • Alfabeto
 

  • Clave pública del mercader y el banco
 

  • Clave privada del cliente
 

 

 

Ahora usaremos la función y veremos cuál es su salida: 

> datos:=SET_cliente(PI,GSO,alfabeto,publica_mercader,publica_banco,privada_cliente);
 

 

 

 

 

 

 

 

Em(GSO) :
Em(GSO) :
Em(GSO) :
Em(GSO) :
Em(GSO) :
Em(GSO) :
Em(GSO) :
Em(GSO) :
Em(GSO) :
GSOMD : ae663578be6cff9bfd4b1f2c5073cc19
Eb(PI) :
Eb(PI) :
Eb(PI) :
Eb(PI) :
Eb(PI) :
Eb(PI) :
Eb(PI) :
PIMD : 0764d094bd760048894e2a3243ce233f
POMD : 9b76d1a9b1eae7c7df5a118097ffde47
DS :
DS :
Se envían los siguientes datos al mercader : Em(GSO), DS, PIMD y Eb(PI)
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
[[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856,...
(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];
 

[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
[200408, 345882, 201452, 186147, 247280, 140856, 218809, 71362, 257210, 3887, 255720, 95157, 46645, 19870, 85767, 182143, 168550, 247280, 6242, 117870, 153494, 199353, 297736, 362451, 204859, 140856, ...
(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];
 

[238457, 157572, 355376, 280336, 350689, 336778, 216548, 18256, 196004, 293111, 254862, 322758, 314181, 302242, 56881, 178478]
[238457, 157572, 355376, 280336, 350689, 336778, 216548, 18256, 196004, 293111, 254862, 322758, 314181, 302242, 56881, 178478]
(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];
 

[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
(5.1.4.2.13)
 

 

PIMD: Es el resumen del Eb(PI). 

> datos[3];
 

0764d094bd760048894e2a3243ce233f (5.1.4.2.14)
 

 

 

  • Una vez que el cliente ha realizado su proceso, simularemos al mercader con la función SET_mercader la cual recibirá los siguientes parámetros:
 

 

  • Datos recibidos del cliente, en este caso usaremos la salida de la ejecución de la función SET_cliente ejecutada en el paso anterior.
 

  • Alfabeto, al igual que en anteriores ejemplos usaremos el Castellano.
 

  • Clave pública del cliente y la clave privada del mercader.
 

 

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);
 

 

 

 

Se verifica la firma del cliente
El GSO es: Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros.
El GSO es: Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros.
El GSO es: Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. Artículos: libro Defenderse de los bancos. Vendedor: La tienda de la esquina. Importe: 200 euros.
Se envían los siguientes datos al mercader : GSOMD, Eb(PI) y DS
[
[
[
[
[
[
[
[
[
(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];
 

ae663578be6cff9bfd4b1f2c5073cc19 (5.1.4.2.16)
 

 

Eb(PI): Instrucciones de pago cifradas con la clave pública del banco. 

> datos_mercader[2];
 

[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
[78757, 38126, 192590, 105160, 71244, 34799, 31158, 277946, 37406, 133547, 15644, 64352, 199929, 42961, 264260, 131193, 281122, 71244, 88852, 293409, 253578, 228249, 112338, 152172, 68866, 34799, 1374...
(5.1.4.2.17)
 

 

DS: EL cual permite verificar la firma del cliente. 

> datos_mercader[3];
 

[238457, 157572, 355376, 280336, 350689, 336778, 216548, 18256, 196004, 293111, 254862, 322758, 314181, 302242, 56881, 178478]
[238457, 157572, 355376, 280336, 350689, 336778, 216548, 18256, 196004, 293111, 254862, 322758, 314181, 302242, 56881, 178478]
(5.1.4.2.18)
 

 

 

  • Por último,  una vez terminado el proceso del mercader, simularemos las acciones del banco con la función SET_banco la cual recibirá los siguientes parámetros:
 

 

  • Datos del mercader, obtenidos en la salida de la ejecución del SET_mercader .
 

  • Alfabeto, usaremos el Castellano
 

  • Clave pública del cliente y privada del banco
 

 

Una vez descritos los parámetros, ejecutaremos la función: 

 

> SET_banco(datos_mercader,alfabeto,publica_cliente,privada_banco);
 

 

Se verifica la firma del cliente
El PI es: Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. El número de tarjeta es: 25874196347854214555. Cantidad : 200 Euros
El PI es: Cliente: D. Fulanito Fulanitez con DNI: 222333444Q. El número de tarjeta es: 25874196347854214555. Cantidad : 200 Euros
(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):
 

>
 

 

 

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License