Está en la página 1de 13

Universidad de Cuenca

FACULTAD DE I NGENIER ÍA

RSA P UBLIC -K EY E NCRYPTION AND S IGNATURE


L AB

Seguridad en Redes

Autores:

Edwin Anı́bal Lima Huayllas


Kevin Ismael Mogrovejo Nieves
Paola Alexandra Mora Pedroza

Noviembre 2022
I. M ARCO T E ÓRICO
I.1. RSA en criptografia
Existen dos tipos de encriptación que se conocen como cifrado de clave privada y cifrado de clave
pública. El primero se refiere a todos aquellos sistemas criptográficos que requieren de solo una clave
para encriptar y desencriptar los datos. El segundo se trata de utilizar una clave diferente para cifrar y
descifrar la información.

El RSA es un sistema criptográfico que permite enviar mensajes cifrados sin tener que intercambiar
una clave privada. El algoritmo de RSA se entiende de mejor manera con el ejemplo de cofres, el cual
nos dice que:

Alice le quiere enviar a Bob un mensaje secreto, pero para lograrlo, Bob le envı́a un cofre con un
candado abierto (clave pública) del cual solo él tiene la llave (clave privada). Alice pone el mensaje
adentro del cofre, cierra el candado, por lo que ya nadie tiene acceso a la información secreta. Excepto
Bob, quien tiene la llave desbloquear el cofre.
I.2. Encriptacion de mensajes
Cifrar una información significa ocultar el contenido de un mensaje a simple vista, de manera que
haga falta una interacción concreta para poder desvelar ese contenido.
Es importante recordar que el primer método criptográfico fue conocido como Escı́tala, y se utilizo
por primera vez hace mas de 2.500 años. Por tanto, a partir de ese descubrimiento casi todas las grandes
civilizaciones han utilizado algún método para encriptar sus mensajes, desde los romanos hasta los que
vinieron después, y una de las razones por las que los Aliados ganaron la Segunda Guerra Mundial fue
debido a que Alan Turing consiguió romper el cifrado de la máquina Enigma usada por los Nazis.
I.3. Descifrar un mensaje Encriptación asimétrica
Como se sabe el método de criptografı́a asimétrica emplea dos llaves diferentes en cada uno de los
extremos de la comunicaciones, de tal manera que una de ellas sirva para cifra y el otro par para
descifrar. Las operaciones matemáticas que se llevan a cabo en el algoritmo RSA corresponde a realizar
la siguiente exponencial modular empleando d y n que corresponde a la clave privada y la multiplicación
de la clave privada y publica respectivamente [1]. Para el siguiente ejemplo C corresponderá al texto que
se desencriptara.

M = C d modn (1)
En el caso de que la relaciona anterior no nos permita regresar al mensaje original, no habrá problema
se deberá realizar otra prueba, de la siguiente manera:

M ed modn = M (2)
Mediante la relación edmodϕ(n) = 1que cumple el exponente e y de correspondiente a la clave publica
y privada. Se puede omitir el uso del modulo y reescribir la igualdad como la siguiente expresión:

ed = kϕ(n) + 1 (3)
Finalmente para comprobar que se puede recuperar el mensaje original en funcion de las relaciones en-
contradas previamente se desarrolló nuevamente el proceso de desencriptacion, los resultados se presentan
a continuación:

M ed modn = M kϕ(n)+1 modn


= M kϕ(n) ∗ M modn
= (M ϕ(n) modn)k ∗ M modn
= 1k ∗ M modn
=M
I.4. Firma - encriptación asimétrica
La firma digital permite al receptor de un mensaje que el origen es auténtico, también podremos
comprobar si el mensaje ha sido modificado. Falsificar una firma digital es casi imposible a no ser que
conozcan la clave privada del que firma (y ya hemos dicho anteriormente que la clave privada debe estar
guardada, y que no la debe saber nadie). Aquı́ están las dos fases para la realización de la firma digital:

Figura I.1. Proceso de Firmado.

Proceso de firma: el emisor cifra los datos con la clave privada y lo manda al receptor.

Verificar la firma: el receptor descifra los datos usando la clave pública del emisor y comprueba que
la información coincide con los datos originales (si coincide es que no se ha modificado).

En las firmas digitales se hace uso de las funciones hash como SHA2-256 y SHA2-512 ya que, como
hemos explicado anteriormente, el cifrado asimétrico es lento. El emisor de la comunicación aplicará la
función HASH al mensaje original para obtener con ello la huella digital. Con el uso de la firma en un
mensaje se cumplen con lo siguiente [2]:
Autenticidad, el emisor es quien dice ser. La firma en origen y destino es la misma.
Integridad, el mensaje no ha sido modificado. Lo obtenido y lo recibido es igual.
No repudio, el emisor no puede negar haber enviado el mensaje al receptor. La firma digital no
varı́a.
I.5. ¿Qué es un certificado X.509?
X.509 es un formato estándar para certificados de clave pública, documentos digitales que asocian de
forma segura pares de claves criptográficas con identidades como sitios web, individuos u organizaciones.
Introducido por primera vez en 1988 junto con los estándares X.500 para servicios de directorio
electrónico, X.509 ha sido adaptado para uso de Internet por la Infraestructura de clave pública de IETF
(X.509) (PKIX) grupo de trabajo. RFC 5280 perfila el certificado X.509 v3, la lista de revocación de
certificados X.509 v2 (CRL) y describe un algoritmo para la validación de la ruta del certificado X.509.
Las aplicaciones comunes de los certificados X.509 incluyen:
SSL /TLS y HTTPS para navegación web autenticada y encriptada
Correo electrónico firmado y cifrado a través de S/MIME protocolo
Firma de código
Firma de documentos
Autenticación del cliente
Identificación electrónica emitida por el gobierno
I.6. ¿Qué es una Autoridad de certificación (CA)?
La autoridad de certificación (CA), también a veces referido como autoridad de certificación, es
una empresa u organización que actúa para validar las identidades de las entidades (como sitios web,
direcciones de correo electrónico, empresas o personas individuales) y vincularlas a claves criptográficas
mediante la emisión de documentos electrónicos conocidos como Certificados digitales.

2
Un certificado digital proporciona: Autenticación, al servir como credencial para validar la identidad
de la entidad a la que se expide. Cifrado, para una comunicación segura a través de redes inseguras como
Internet. Integridad de documentos firmado con el certificado para que no puedan ser alterados por un
tercero en transito.
II. D ISE ÑO E IMPLEMENTACI ÓN
II.1. Derivación de la Clave Privada
En esta sección se nos solicito calcular la clave privada (d) donde (e, n) se interpretan como claves
públicas. Es importante mencionar que p,q y e son números primos que poseen los valores hexadecimales
de la Figura II.1.

Figura II.1. Valores hexadecimales de p, q y e

Por tanto, se elaboro un código en lenguaje C que nos ayudara a calcular la clave privada, el cual se
encuentra expuesto a continuación.
1 #include <stdio.h>
2 #include <openssl/bn.h>
3 #define NBITS 128
4 void printBN(char *msg, BIGNUM *a)
5 {
6 char *number_str = BN_bn2hex(a);
7 printf("%s %s\n", msg, number_str);
8 OPENSSL_free(number_str);
9 }
10 int main()
11 {
12 BN_CTX *ctx = BN_CTX_new();
13 BIGNUM *p = BN_new();
14 BIGNUM *q = BN_new();
15 BIGNUM *fai_n = BN_new();
16 BIGNUM *n = BN_new();
17 BIGNUM *e = BN_new();
18 BIGNUM *d = BN_new();
19 BIGNUM *p_1 = BN_new();
20 BIGNUM *q_1 = BN_new();
21
22 BN_hex2bn(&p, "F7E75FDC469067FFDC4E847C51F452DF");
23 BN_hex2bn(&q, "E85CED54AF57E53E092113E62F436F4F");
24 BN_hex2bn(&e, "0D88C3");
25
26 BN_sub(p_1, p, BN_value_one());
27 BN_sub(q_1, q, BN_value_one());
28 BN_mul(n, p, q, ctx);
29 BN_mul(fai_n, p_1, q_1, ctx);
30
31 BN_mod_inverse(d, e, fai_n, ctx);
32
33 printBN("Clave Publica e=\t", e);
34 printBN("Clave Publica n=\t", n);
35 printBN("Clave Privada d=\t", d);
36 return 0;
37 }

Una vez con el código implementado, se procedió a ejecutarlo en la terminal de Ubunto y se obtuvo
la clave privada que claramente se aprecia en la Figura II.2.

Figura II.2. Calculo de la Clave Privada

3
II.2. Cifrado de un mensaje
En esta sección se desea cifrar el siguiente mensaje:
!Un alto secreto!
Es decir, lo que se requiere es convertir esta cadena ASCII a una cadena hexadecimal, y luego convertir
la cadena hexadecimal a BIGNUM usando API de hexadecimal a bn BNhex2bn().
Por tanto, se elaboro un código en lenguaje C que nos ayudara a cifrar la frase mencionada anterior-
mente.
1 #include <stdio.h>
2 #include <openssl/bn.h>
3 #define NBITS 128
4 void printBN(char *msg, BIGNUM *a)
5 {
6 char *number_str = BN_bn2hex(a);
7 printf("%s %s\n", msg, number_str);
8 OPENSSL_free(number_str);
9 }
10 int main()
11 {
12 BN_CTX *ctx = BN_CTX_new();
13
14 BIGNUM *n = BN_new();
15 BIGNUM *e = BN_new();
16 BIGNUM *d = BN_new();
17 BIGNUM *m = BN_new(); //mensaje
18 BIGNUM *c = BN_new(); // almacena el mensaje encriptado
19
20 BN_hex2bn(&n, "DCBFFE3E51F62E09CE7032E2677A78946A849DC4CDDE3A4D0CB81629242FB1A5");
21 BN_hex2bn(&e, "010001");
22 BN_hex2bn(&d, "74D806F9F3A62BAE331FFE3F0A68AFE35B3D2E4794148AACBC26AA381CD7D30D");
23 BN_hex2bn(&m, "4120746f702073656372657421");
24
25 BN_mod_exp(c, m, e, n, ctx); //encrita el sms
26 printBN("Mensaje Encriptado:", c);
27 return 0;
28 }

Una vez con el código implementado, se procedió a ejecutarlo en la terminal de Ubunto y se obtuvo
el mensaje cifrado que claramente se aprecia en la Figura II.3.

Figura II.3. Mensaje Encriptado

II.3. Descifrar un mensaje


En esta sección se trabajo con la desencriptación de un mensaje encriptado mediante clave publica y
privada, por lo tanto es necesario conocer esos dos valores para realizar dicho proceso. En la tarea anterior
ya se habı́a realizado el proceso de encriptacion por lo cual fue necesario la generación de las claves
correspondientes, estas claves serán nuevamente usadas para trabajar en este apartado, a continuación se
en listan nuevamente los parámetros a emplear:

n = DCBF F E3E51F 62E09CE7032E2677A78946A849DC4CDDE3A4D0CB81629242F B1A5


d = 74D806F 9F 3A62BAE331F F E3F 0A68AF E35B3D2E4794148AACBC26AA381CD7D30D
C = 8C0F 971DF 2F 3672B28811407E2DABBE1DA0F EBBBDF C7DCB67396567EA1E2493F
De los parámetros descritos d corresponde a la clave privada que permitirá visualizar el mensaje
encriptado con la clave publica, por otra parte se debe tener un mensaje para desencriptar, en este caso el
mensaje a revelar es C. En el apartado teórico se habı́a definido los procesos matemáticos que se deben
realizar para revelar el mensaje, por lo tanto empleando la librerı́a de grandes disponible en el lenguaje

4
Figura II.4. Código en python para desencriptar un mensaje.

de programación python, se construyo un programa para realizar el proceso mencionado. En la figura


II.4 se muestra la implementación del código en python.
En el código se definieron las variables a utilizar en el proceso, proseguido de ello se inicializaron los
valores de dichas variables con sus valores correspondientes. Finalmente el programa realizar la operación
correspondiente al desencriptado.
Con el bloque de código implementado se prosiguió a ejecutar el programa en la terminal de linux
con el fin de revelar el mensaje enviado por el emisor.

Figura II.5. Desencriptación del mensaje.

En la figura II.5 se ilustra el proceso de creación del código en python para posteriormente ejecutarlo,
redirigiéndolo hacia una salida que nuevamente sera un ejecutable que nos brinde la información en

5
hexadecimal del mensaje desencriptado. Finalmente para observar la información del mensaje se empleo
una transformación de hexadecimal a formato utf8 de tal forma que el mensaje era legible, de esta manera
se determino que el mensaje oculto era una contraseña.
II.4. Firmar un mensaje
En la siguiente sección se trabajara con la firma de mensajes, para ello se emplearon dos ejemplos
de tal manera de que se pueda analizar cuales son las consecuencias de firmas diferentes mensajes con
la misma clave privada. En esta sección nuevamente se emplearon los parámetros de la tarea 2 tanto la
clave privada como la publico, nuevamente se en listan los valores de cada uno de ellos para clarificar
que datos se estarán utilizando:

n = DCBF F E3E51F 62E09CE7032E2677A78946A849DC4CDDE3A4D0CB81629242F B1A5


d = 74D806F 9F 3A62BAE331F F E3F 0A68AF E35B3D2E4794148AACBC26AA381CD7D30D

En este caso no se tiene un valor para C como en el caso anterior, esto se justifica porque la firma de
un mensaje se basa en la encriptacion de un mensaje con el factor especial de que el proceso se llevara
acabo con la clave privada, en los casos anteriores se habı́a estado encriptando los mensajes con la clave
publica.
Entonces en esta sección se busca determinar las salidas correspondiente a la encriptacion mediante
la clave privada, para ello nuevamente se construyo un código en python que nos permitió realizar las
operaciones con los grandes números. Se realizo un paso intermedio a la implementación que consistı́a
en encontrar los valores en hexadecimal de los mensajes que se encriptaron, para ello empleamos una
transformación disponible en python, en la siguiente figura se ilustra este proceso:

Figura II.6. Valores en hexadecimal de los mensajes a codificar.

Los valores hexadecimal de cada uno de los mensajes serán los valores iniciales de los dos mensajes que
se encriptaran, puesto que se tenia todos los datos necesarios se realizo la implementación del programa
en python.
En la figura II.7 se desarrollo la implementación en python correspondiente a la firma de mensajes
mediante la encriptación con la clave privada del usuario.Gran parte del código se parece al programa
implementado previamente, la única variación es que se asignaran 2 salidas correspondientes a cada una
de las firmas, además como se menciono previamente esta encriptación se realizara con la clave privada
de modo que cualquier persona con la clave publica podrá comprobar que efectivamente el mensaje fue
firmado por un usuario especifico.
Luego concluir con la implementación en python, se ejecuto el programa en la terminal y se obtuvieron
los siguientes resultados:
Finalmente, se puede visualizar en la figura II.8 que la salida de cada una de las firmas es totalmente
distinta. La salida puede ser justificada por el concepto de encriptación que emplea RSA dado que para
cada mensaje se deberı́a tener una encriptación diferente, independientemente de que la clave privada sea

6
Figura II.7. Programa en python para firmar mensajes .

Figura II.8. Salida de firmas.

la misma. Por lo tanto se comprueba de que se puede realizar la firma de varios archivos obteniendo a
la salida un valor diferente para cada uno de los procesos esto se logra empleando la clave privada para
realizar el proceso de encriptación.
II.5. Verificación de una Firma
En esta sección se supone que se recibe un mensaje M = ”Launchamissile.” desde Alice, el mensaje
habı́a sido firmado por Alice con la firma S. Por lo tanto los parámetros que se tienen para este ejercicio
se en listan a continuación:
M = Launchamissile.
S = 643D6F 34902D9C7EC90CB0B2BCA36C47F A37165C0005CAB026C0542CBDB6802F
e = 010001(thishexvalueequalstodecimal65537)
n = AE1CD4DC432798D933779F BD46C6E1247F 0CF 1233595113AA51B450F 18116115
En el caso de validar la firma de Alice con el valor de S no deberı́a existir ningún problema dado que
en efecto S es la firma de Alice. Por otra parte se planteo realizar una modificación a la firma de Alice de
tal manera que no se pueda validar la firma, para ello se realizara el cambio en el antepenúltimo dı́gito
hexadecimal.
Para la implementación en python de la verificación de las firmas se empleo nuevamente algunas lineas
de códigos implementados anteriormente, además se agregaron condicionales que permitan verificar las
firmas.
En el proceso de verificación se realiza una desencriptacion de tal forma que se busca recuperar el
mensaje original, posterior a ello se utiliza una funcion que permite comparar entre el valor decodificado
y el mensaje inicial del mensaje, por lo tanto si la diferencia entre los dos mensajes es 0 quiere decir
que los mensajes son idénticos por lo tanto la firma sera validada.

7
Por otra parte mientras la clave publica que se emploe para desencriptar no este relacionada con la
clave privada que se uso para firmar, el proceso de desencriptacion nos devolverá un mensaje que puede
estar distorsionado de acuerdo al mensaje que se envió en un inicio.
En el caso de no haber recuperado el mensaje original se envı́a un mensaje de que la firma no es valida,
puesto que la clave publica no coincide con la clave privada del emisor. En la figura ?? se muestra el
bloque de código en python que realiza el proceso de validación.

Figura II.9. Validación de firmas python.

Finalmente para concluir con las pruebas de validación se ejecuto el código obteniendo los siguientes
resultados:
Se puede comprobar que en el caso de intentar recuperar el mensaje con la clave publica de otra
persona que no haya sido el emisor, el mensaje no se recuperara de manera correcta, por lo tanto la
validación de firma no se cumplirá. En la figura la verificación de la firma 2 concuerda con los resultados
esperados puesto que para ese caso de realizo una modificación que se podrı́a interpretar como la firma
de otra persona ajena a Alice.
II.6. Verificación de un certificado X.509
Primero, mostramos los certificados de la organización que deseamos, en este caso, se ha escogido la
página de la Universidad de Cuenca, en la Figura II.11 se muestra el código.

8
Figura II.10. Validación de firmas.

Figura II.11. Obtención del certificado

El modulo del certificado va a ser muy importante al momento de realizar la verificación de veracidad,
por lo que se ha obtenido como se muestra en la figura II.12

Figura II.12. Modulo del certificado

Adicionalmente, usando el código de la figura II.13, podemos extraer la Clave publica del issuer’s
certificate.

Figura II.13. Public Key

Luego de ello, obtenemos la firma del certificado del servidor mostrado en la figura II.14.

La firma obtenida no puede ser manejada de esa forma, por lo que debemos eliminar todos los espacios
y dos puntos, con el comando mostrado en la figura II.15 se realiza dicho proceso.Eliminamos los espacios
y puntos, y almacenamos el valor de la firma en un archivo aparte, aunque lo único importante es el
valor en si, no el archivo.

9
Figura II.14. Obtención de la firma del certificado

Figura II.15. Obtención de la firma del certificado sin puntos ni espacios

Figura II.16. Cuerpo para el hash

Ahora, en la figura II.16 se muestra el cuerpo usado para generar el hash


en el certificado se puede destacar el bloque de la firma mostrado en la figura II.17

Posteriormente, obtenemos el cuerpo del certificado excluyendo el bloque de la firma, con el código

10
Figura II.17. Bloque de la firma

de la figura II.18.

Figura II.18. certificado sin el bloque de la firma

Para finalizar, obtenemos el hash del cuerpo del certificado, el resultado se muestra en la figura
Como ultimo punto, se obtiene el ı́ndice del exponente, este valor se encuentra únicamente navegando
por el certificado, y corresponde al mostrado en la figura II.19

Figura II.19. Índice del exponente

con todos los valores obtenidos, podemos usar el código mostrado en la figura II.20 para verificar la
firma, aquı́, se designa a n el valor encontrado como modulo, a s el valor de la firma, y a e el valor del
exponente encontrado

Figura II.20. Código para la verificación

En donde como resultado se obtiene que el resultado obtenido es igual al hash del certificado, dando
pie a la validez del mismo.
En teorı́a, al correr el código en linea de comandos obtendrı́amos el mismo hash, pero dado un problema
con la librerı́a, desarrollamos el resultado en linea de comandos. La figura II.21 muestra el resultado de
True al obtener el mismo hash.
Según el proceso de verificación de firma del certificado X.509, solo es necesario comparar los últimos
64 números hexadecimales del resultado anterior con el valor hash obtenido.

11
Figura II.21. Resultado de la verificación

III. R ESULTADOS
IV. C ONCLUSIONES
La criptografı́a asimétrica es una herramienta que permite una comunicación con mayor seguridad que
en el caso simétrico. El uso de una clave para encriptar y otra diferente para desencriptar brinda una
mayor confianza en el momento de transmitir información de punto a punto. En esta practica se aprovecho
de las propiedades de este tipo de encriptacion, el manejo de una clave privada permitió realizar la firma
en un documento,archivo,programa o los distintos datos con los cuáles se trabajaron. De esta manera se
comprobó que este tipo encriptacion nos permite establecer los 3 principales parámetros de la seguridad
en una red, como son la confidencialidad, la integridad y la disponibilidad. Por otra parte En el ultimo
paso, revisamos como es el formato de un certificado X.509, la información que incluye en su interior
y como validar dicho certificado usando los datos que nos proporciona, esto es, mediante la operacion
de modulo revisada, y usando el valor de la firma publica, el indice y el modulo, obtener un resultado
que coincide con el hash del cuerpo del archivo, este hash se encuentra en los ultimos 64 numeros del
resultado obtenido.
R EFERENCIAS
[1] Criptografı́a de clave pública - Documentación de IBM. [Online]. Available: https://www.ibm.com/docs/es/integration-bus/10.
0?topic=overview-public-key-cryptography
[2] Criptografı́a: Algoritmos de clave simétrico y asimétrico explicados. [Online]. Available: https://www.redeszone.net/tutoriales/
seguridad/criptografia-algoritmos-clave-simetrica-asimetrica/

12

También podría gustarte