0% encontró este documento útil (0 votos)
143 vistas30 páginas

Proyecto Hash

El documento resume los conceptos clave de certificados digitales, firma digital, tokens digitales y funciones hash. Explica que un certificado digital certifica la clave pública de una entidad y los elementos de certificados X.509. Describe el proceso de firma digital utilizando funciones hash y la clave privada. Finalmente, presenta ejemplos de los algoritmos hash MD5, SHA-1, SHA-2 y el algoritmo RSA.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
143 vistas30 páginas

Proyecto Hash

El documento resume los conceptos clave de certificados digitales, firma digital, tokens digitales y funciones hash. Explica que un certificado digital certifica la clave pública de una entidad y los elementos de certificados X.509. Describe el proceso de firma digital utilizando funciones hash y la clave privada. Finalmente, presenta ejemplos de los algoritmos hash MD5, SHA-1, SHA-2 y el algoritmo RSA.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

1

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS


(Universidad del Perú, DECANA DE AMÉRICA)

FACULTAD DE INGENIERÍA DE SISTEMAS E INFORMÁTICA


Escuela Profesional de Ingeniería de Sistemas

“Año de la universalización de la salud”

CURSO:
Matemática Discreta

DOCENTE:
Moquillaza Henriquez, Santiago Domingo

INTEGRANTES:
Antonio Cunto James Gabriel
Guevara Ames Jhonatan Sebastian Ysrael
Huarcaya Gonzales Fiorela
Pantoja Pimentel Kevin Renzo
Ramos Chiclla Arnold Jesús
Quispe Ñaupa Wiliam Luis

2020
2

Tabla de Contenido

Introducción 3

Certificado Digital 4
Elementos de Certificados Digitales 4
Certificados X.509 4

Firma Digital 7
Función Hash 8
Proceso de firmado 9
Usos de la firma digital 9

Token digital 10
Principales tokens utilizados 10
Tarjetas inteligentes 10
Token usb o token criptográfico 11
Uso del token en el proceso de firma digital 11
Algoritmo RSA 12

Ejemplos de Funciones HASH 13


MD5 (Message Digest Algorithm 5) 13
Concepto del algoritmo MD5 13
Descripción del Algoritmo MD5: 13
SHA-1 16
Concepto del algoritmo SHA-1 16
Descripción del Algoritmo SHA-1 16
SHA-2 18
Concepto del algoritmo SHA-2 18
Descripción del Algoritmo SHA-512 19
Simulación 21
Código C++ 22
Resultados 25

Conclusiones 26

Referencias 27
3

Introducción

Dada la inseguridad y la demora que conlleva los métodos tradicionales en el proceso de

firma de documentos, u otras operaciones, el ser humano vio la posibilidad de agilizar los

procesos utilizando los medios digitales, gracias al avance exponencial que tiene en el siglo XXI,

y utilizar la criptografía, con el fin de aminorar la vulnerabilidad que conllevan estos medio.

Teniendo en cuenta la sustancial necesidad de conocer y entender el tema mencionado, se detalla

de manera precisa y concreta el concepto, la utilidad e importancia del contrato y la firma digital

como medios seguros en diversos procesos, así también como el uso de tokens como dispositivos

de almacenamiento seguro. Además, el presente trabajo contiene conceptos y descripciones

detalladas de los algoritmos de las funciones hash, que han sido utilizadas desde los finales del

siglo anterior hasta la actualidad, como MD5, SHA – 1 y SHA – 2. También, de forma breve, se

explica el algoritmo de criptografía asimétrica RSA.


4

Certificado Digital

Un certificado digital o certificado electrónico según Díaz et al. (2014) es “un documento

que certifica que una entidad determinada, como puede ser un usuario, una máquina, un

dispositivo de red o un proceso, tiene una clave pública determinada” (p.31).

Elementos de Certificados Digitales

Para Cardador (2014) los pasos para incorporar los elementos de los certificados digitales
son los siguientes:

1. Recibir el mensaje.

2. Recuperar del mensaje la firma digital con el valor hash de cifrado.

3. Recuperar el mensaje.

4. Cálculo del hash del mensaje.

5. Recuperación de la clave pública del remitente que viene en el certificado digital.

6. Descifrar con la clave pública del remitente el valor hash.

7. Comparar el valor de hash descifrado con el valor obtenido en la recepción del


mensaje.

8. Si los valores coinciden, el mensaje es válido.

Certificados X.509

Los certificados X.509 presentan 3 versiones, siendo la última versión X.509v3. Esta

nueva versión extendía las anteriores con un conjunto de campos adicionales que debían estar
5

definidos en estándares o registrados por alguna comunidad u organización. (Gonzáles et al.

2014, p.38).

El principal contenido de los certificados X.509v3 según Gonzáles et al. (2014) es la

siguiente:

● Versión: número de la versión del certificado.

● Número de serie: número entero único asignado por la AC emisora.

● Identificador del algoritmo de firma: identificador de firma del certificado.

● Nombre del emisor: nombre de la AC que emite el certificado.

● Validez: fecha de inicio de validez del certificado y fecha de fin.

● Nombre del sujeto: nombre del usuario al que se le otorga el certificado.

● Información de la clave pública del sujeto: clave pública del sujeto, parámetros

asociados a la clave e identificador del algoritmo con el que ha de utilizarse la

clave.

● Firma digital del emisor: firma de la AC emisora.

● Extensiones (opcional): información adicional.

A continuación, se muestra un ejemplo de certificado digital X.509v3 de una CA:

Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc,
OU=Certification Services Division,
CN=Thawte Server CA/Email=server-certs@[Link]
Validity
6

Not Before: Aug 1 [Link] 2010 GMT


Not After : Dec 31 [Link] 2020 GMT
Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc,
OU=Certification Services Division,
CN=Thawte Server CA/Email=server-certs@[Link]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
Signature Algorithm: md5WithRSAEncryption
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
70:47

Oppliger (2014) nos explica que Thawte es una de las autoridades certificantes raíz

reconocida por Microsoft y Netscape. Este certificado ya viene con el navegador web

(probablemente pueda encontrarse listado como "Thawte Server CA" en las opciones de

seguridad) y es confiable por defecto. Como certificado confiado globalmente de larga vida

(nótese la fecha de vencimiento) que puede firmar prácticamente cualquier cosa (nótese la falta
7

de limitaciones), su clave privada correspondiente debe ser una de las más ocultas del mundo.

(p.88)

Firma Digital

La firma digital para Soriano (2014) es “una firma electrónica que se puede utilizar para

autenticar la identidad del remitente de un mensaje o el firmante de un documento. Asimismo,

también garantiza la integridad del mensaje” (p. 56). Esto permite y asegura que el documento

que el remitente envía pueda ser auténtico y que la firma dispuesta no pueda ser generada por

ninguna otra persona ajena al usuario original.

La firma digital entre sus muchas características permite el no repudio, esto se refiere al

hecho de que, si un documento es enviado con la firma de un remitente, dicho remitente no podrá

negar haber firmado el documento en mención. A su vez, las firmas digitales han de cumplir con

las mismas características de las firmas manuscritas, deben de ser auténticas, infalsificables,

inalterables y no reutilizables. (García, 2018, p. 97)

Una de las grandes ventajas de la firma digital frente a la manuscrita lo menciona Reyes

(2006) “permiten asociar la identidad del firmante con el documento avalado y detectar

modificaciones del mismo (Integridad)” (p. 55). Algo que normalmente sucede con las firmas

manuscritas es que los documentos firmados pueden ser alterados y la firma seguirá

referenciándose al usuario y este debe de hacerse responsable de dicho documento adulterado.

Una firma digital implica un proceso de encriptación asimétrica ya que su metodología

ofrece mayor robustez. Este proceso de encriptación asimétrica utiliza dos claves distintas que
8

tienen una relación matemática. La primera clave (pública) se encarga de la codificación y la

segunda clave (privada) permite el descifrado. (García, 2018, p. 97)

Para poder construir una firma digital que tenga como base una infraestructura de clave

pública se requiere una función hash (SHA-2, SHA-3), que según García (2018) “transforma un

texto de longitud variable en un bloque de longitud fija en forma de resumen que es irreversible

(no se puede recuperar un texto a partir de su resumen)” (p. 100). También es necesario un

algoritmo asimétrico (RSA, DSS, ECDSA) que genera las dos claves, siendo la clave privada la

que permite firmar y la clave pública autenticar la firma.

Función Hash

Dentro del uso de la firma digital las funciones hash tienen un papel muy importante.

Podemos definir a una función hash en palabras de García Rojas (2008) como:

Método para generar claves o llaves que identifican de manera casi unívoca a un

documento, archivo, registro, etc. Como resultado de la aplicación de esta función o

algoritmo a un documento, archivo o registro dado se obtiene, lo que se denomina, un

hash (llamado también “resumen”). (p.13)

Entonces, podemos entender a una función hash como un proceso de transformación de

una cadena binaria o un mensaje de una determinada longitud en otra cadena binaria de longitud

constante y menor a la inicial (mayormente). Esta nueva cadena binaria se conoce como valor

hash y es empleado para la emisión de certificados, firmas digitales, generación de claves, etc.

(Escalona, 2012, p. 1)
9

Proceso de firmado

El proceso de firmado de un documento inicia con la creación de este por parte del

remitente, luego le aplica una función hash y en seguida lo cifra con su clave privada. Es

importante mencionar que cada documento firmado debe de ser revisado por una Autoridad de

Certificación, que validará su origen y contenido, y luego, si todo es correcto, será enviado al

receptor en conjunto con el Certificado Digital. Paso seguido el receptor recibe el documento

conformado tanto por el mensaje como por la firma que procederá a descifrar con la clave

pública del remitente y comparar el hash obtenido con el hash resumen del mensaje. Si ambos

son iguales el mensaje es auténtico. (García, 2018, p. 100)

Es importante mencionar que el proceso de generar y verificar una firma digital basada en

PKI (Infraestructura de clave pública) según Cuno (2015) “se cimienta en dos entes: i. Autoridad

de Certificación […] ii. Lista de Revocación de Certificados, la cual debe estar

permanentemente actualizada por la autoridad de certificación correspondiente” (como se citó en

García, 2018, p. 101). El papel de la Autoridad de Certificación es importante, ya que es la que

genera la confianza en el receptor de que el remitente tiene todo el respaldo legal al enviar el

mensaje.

Usos de la firma digital

En su mayoría las firmas digitales son usadas para la autenticación e identificación de

entidades, pero también tiene un uso en el comercio electrónico, en la identificación de la

autenticidad de un sitio web, para prevenir la manipulación de un software, etc. Hoy en día
10

tienen una relevancia bastante significativa debido al gran auge de las transacciones o las

comunicaciones de forma digital ya que se exigen que estas sean de forma legal y no fraudulenta.

Token digital

Este dispositivo nos brinda seguridad en base a la criptografía es el token, “sirve para

usarse en la generación y almacenamiento seguro de contraseñas, certificados digitales,

autenticación fuerte segura, firmas digitales y encriptación. (De la Motta y Vela, 2008, p. 50).

Además, algunos tokens, por cuestiones de mayor seguridad, “emplean mecanismos o sistemas

adicionales, como tamper proof (ante cualquier intento malintencionado, el token dejará

evidencia) o tamper resistant (ante cualquier uso malintencionado, el chip se dañará y quedará

inservible)” (Aguilar, 2016, p.45).

Principales tokens utilizados

“Cada usuario tiene un par de claves asimétricas únicas (claves públicas y privadas) para

firmar digitalmente un documento. Normalmente, (...) debe tener un dispositivo de seguridad (...)

que almacena la clave privada y puede acceder a ella ingresando su PIN ”(Rezaeighaleh et al. ,

2018, p. 182).

Tarjetas inteligentes

Parecida a una tarjeta de crédito convencional, en dimensiones, esta tarjeta contiene un

procesador criptográfico y circuitos integrados que permiten almacenar una lógica programada

(Aguilar, 2016, p. 44). Para poder leer la información del chip de este tipo de tarjetas se conectan
11

a un lector de forma directa o por medios que no necesitan contacto, como radio frecuencias.

Sin embargo, para poder utilizarse es necesaria la digitación de un PIN que servirá como clave de

acceso.

Su mecanismo es el siguiente: una vez el usuario verificó y aprobó el contenido de algún

documento, el terminal de la tarjeta realizará una función hash, luego se envía el hash del

documento a la tarjeta inteligente para que, mediante la clave privada, genere la firma digital.

(Rezaeighaleh et al., 2018, p.182)

“La tecnología de tarjetas inteligentes sigue estándares internacionales como el ISO/IEC

7816 y ISO/IEC 14443”(De la Motta & Vela, 2008, p. 49)

Token usb o token criptográfico

Este dispositivo “proporciona seguridad a los datos con base en la tecnología Smartcard y

sin requerir lectores especiales” (De la Motta y Vela, 2008, p. 50). Esto brinda una mayor

versatilidad e independencia al momento de hacer operaciones dado que cubre “todas las

necesidades de autenticación (acceso vía web, acceso vía VPN y acceso a la red) y proporciona

seguridad de archivos y de laptops” (De la Motta y Vela, 2008, p. 50). “Estos tokens deben

estar certificados con: FIPS 140-2 y/o CC EAL 4+” (Aguilar, 2016, p. 45).

Uso del token en el proceso de firma digital

La firma digital varía en cada documento, esto debido a que depende de tanto del

contenido del documento y de la clave privada (Álvarez et al., 2005, p. 36). La que otorga la

variabilidad de la firma es el contenido del documento, dado que la clave privada es fija. La
12

clave privada, como el mismo nombre lo indica, es únicamente de propiedad del usuario, esta

clave será almacenada en el token y se requerirá en cada proceso, al momento de encriptar el

documento que previamente ha pasado por una función hash, de firma de un documento.

Algoritmo RSA

Mohit y Biswas (2017) nos mencionan que “El RSA fue desarrollado por Ron Rivest,

Adi Shamir y Len Adleman en el año 1976 (…) y es el algoritmo de clave pública más utilizado

en criptografía” (p. 67). Es un tipo de algoritmo de criptografía asimétrica utilizado en la

encriptación de la función hash del documento en el proceso de firma digital.

El proceso que se debe seguir, según Mohit y Biswas (2017), es el siguiente:

1.- Elija dos números primos grandes distintos p y q

2.- Calcule n = p × q y la función de Euler Ф(n) = (p-1) × (q-1), luego elimine p y q

3.- Seleccione un número e tal que 1 < e < Ф(n) y además sea primo relativo a Ф(n)

4.- Calcule el inverso multiplicativo d tal que e × d ≡ 1 mod Ф(n)

Una vez calculado estos valores podremos encriptar y desencriptar:

Encriptar:

1.- Elija cualquier texto sin formato de k bits m tal que k ≤ log2(n), donde n es el módulo

público.

2.- Calcular texto cifrado c = me (mod n)

Descifrado:

Calcular texto sin formato m = cd (mod n)


13

Ejemplos de Funciones HASH

MD5 (Message Digest Algorithm 5)

Concepto del algoritmo MD5

Badillo, et al. (2011) nos explican que MD5 (Message Digest Algorithm 5, Algoritmo de

Ordenación de Mensajes 5) es un algoritmo seguro desarrollado por RSA Data Security Inc.

MD5 es una función resumen de 128 bits, que toma como entrada un mensaje de tamaño

arbitrario y produce como salida un resumen del mensaje, una cadena de 32 caracteres. Este es

un tipo de encriptación unidireccional, es decir, se puede encriptar, pero no se puede

desencriptar. El MD5 no sirve para cifrar un mensaje ya que lo destruye completamente, la

información no es recuperable de ninguna manera ya que hay pérdida de información (párr. 8).

Descripción del Algoritmo MD5:

Supongamos que tenemos un mensaje de 'b' bits como entrada, y queremos encontrar su

digest (valor hash o resumen). Leopoldo (s.f) menciona 5 pasos para definir nuestro algoritmo:

Paso 1: Adición de Bits. Se agrega un bit en “1” y tantos bits en “0” como sea necesario

para que el mensaje sea congruente con 448, módulo 512.

Paso 2: Longitud del mensaje. El siguiente paso es agregar una representación de 64

bits. En este momento, este mensaje tiene una longitud que es múltiplo exacto de 16. Sea

M[0...N-1] las palabras de 32 bits del mensaje resultante, donde N es múltiplo de 16.
14

Paso 3: Inicializar el Buffer MD (Message Digest). Se inicializan cuatro variables de

encadenamiento.

𝑅𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝐴: 01 23 45 67 ; 𝑅𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝐵: 89 𝑎𝑏 𝑐𝑑 𝑒𝑓
𝑅𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝐶: 𝑓𝑒 𝑑𝑐 𝑏𝑎 98 ; 𝑅𝑒𝑔𝑖𝑠𝑡𝑟𝑜 𝐷: 76 54 32 10

Paso 4: Procesado del Mensaje en bloques de 16 palabras. El ciclo del algoritmo

comienza y continúa cuando hay bloques de 512 bits en el mensaje. El principal bucle tiene

cuatro rondas similares. El resultado de hacer frente a cuatro rondas en diferentes variables de

encadenamiento es ilustrado de la siguiente manera: a obtiene A, b obtiene B, c obtiene C, d

obtiene D. Cada operación realiza una operación no lineal, funcionan en tres de a, b, c y d. Luego

agrega el resultado a la derecha un número variable de bits y suma el resultado a uno de a, b, c y

d. Finalmente, el resultado reemplaza uno de a, b, c y d

𝐹(𝑋, 𝑌, 𝑍) = (𝑋∧𝑌)∨((∼ 𝑋)∧𝑍) ; 𝐺(𝑋, 𝑌, 𝑍) = (𝑋∧𝑌)∨(𝑌∧(∼ 𝑍))

𝐻(𝑋, 𝑌, 𝑍) = 𝑋⨁𝑌⨁𝑍 ; 𝐼(𝑋, 𝑌, 𝑍) = 𝑌⨁(𝑋∨(∼ 𝑍))

Pseudocódigo.

Desde i = 0 hasta N/16-1 hacer //Procesar cada bloque de 16 palabras

Desde j = 0 hasta 15 hacer //Copiar el bloque i en X

Poner en X[j] el valor M[i*16+j].

fin

𝐴𝐴 = 𝐴 ; 𝐵𝐵 = 𝐵 ; 𝐶𝐶 = 𝐶 ; 𝐷𝐷 = 𝐷 //Grabamos los valores A,B,C y D

/* Primera Vuelta: Utilizamos [abcd k s i] para denotar la operación */

𝑎 = 𝑏 + ((𝑎 + 𝐹(𝑏, 𝑐, 𝑑) + 𝑋[𝑘] + 𝑇[𝑖]) ⋘ 𝑠)


15

/* Hacer las siguientes 16 operaciones. */

[𝐴𝐵𝐶𝐷 0 7 1] [𝐷𝐴𝐵𝐶 1 12 2] [𝐶𝐷𝐴𝐵 2 17 3] [𝐵𝐶𝐷𝐴 3 22 4]


[𝐴𝐵𝐶𝐷 4 7 5] [𝐷𝐴𝐵𝐶 5 12 6] [𝐶𝐷𝐴𝐵 6 17 7] [𝐵𝐶𝐷𝐴 7 22 8]
[𝐴𝐵𝐶𝐷 8 7 9] [𝐷𝐴𝐵𝐶 9 12 10] [𝐶𝐷𝐴𝐵 10 17 11] [𝐵𝐶𝐷𝐴 11 22 12]
[𝐴𝐵𝐶𝐷 12 7 13] [𝐷𝐴𝐵𝐶 13 12 14] [𝐶𝐷𝐴𝐵 14 17 15] [𝐵𝐶𝐷𝐴 15 22 16]

/* Segunda Vuelta: Utilizamos [abcd k s i] para denotar la operación */

𝑎 = 𝑏 + ((𝑎 + 𝐺(𝑏, 𝑐, 𝑑) + 𝑋[𝑘] + 𝑇[𝑖]) ⋘ 𝑠)

[𝐴𝐵𝐶𝐷 1 5 17] [𝐷𝐴𝐵𝐶 6 9 18] [𝐶𝐷𝐴𝐵 11 14 19] [𝐵𝐶𝐷𝐴 0 20 20]


[𝐴𝐵𝐶𝐷 5 5 21] [𝐷𝐴𝐵𝐶 10 9 22] [𝐶𝐷𝐴𝐵 15 14 23] [𝐵𝐶𝐷𝐴 4 20 24]
[𝐴𝐵𝐶𝐷 9 5 25] [𝐷𝐴𝐵𝐶 14 9 26] [𝐶𝐷𝐴𝐵 3 14 27] [𝐵𝐶𝐷𝐴 8 20 28]
[𝐴𝐵𝐶𝐷 13 5 29] [𝐷𝐴𝐵𝐶 2 9 30] [𝐶𝐷𝐴𝐵 7 14 31] [𝐵𝐶𝐷𝐴 12 20 32]

/* Tercera Vuelta: Utilizamos [abcd k s t] para denotar la operación */

𝑎 = 𝑏 + ((𝑎 + 𝐻(𝑏, 𝑐, 𝑑) + 𝑋[𝑘] + 𝑇[𝑖]) ⋘ 𝑠)


[𝐴𝐵𝐶𝐷 5 4 33] [𝐷𝐴𝐵𝐶 8 11 34] [𝐶𝐷𝐴𝐵 11 16 35] [𝐵𝐶𝐷𝐴 14 23 36]
[𝐴𝐵𝐶𝐷 1 4 37] [𝐷𝐴𝐵𝐶 4 11 38] [𝐶𝐷𝐴𝐵 7 16 39] [𝐵𝐶𝐷𝐴 10 23 40]
[𝐴𝐵𝐶𝐷 13 4 41] [𝐷𝐴𝐵𝐶 0 11 42] [𝐶𝐷𝐴𝐵 3 16 43] [𝐵𝐶𝐷𝐴 6 23 44]
[𝐴𝐵𝐶𝐷 9 4 45] [𝐷𝐴𝐵𝐶 12 11 46] [𝐶𝐷𝐴𝐵 15 16 47] [𝐵𝐶𝐷𝐴 2 23 48]
/* Cuarta Vuelta: Utilizamos [abcd k s t] para denotar la operación */

𝑎 = 𝑏 + ((𝑎 + 𝐼(𝑏, 𝑐, 𝑑) + 𝑋[𝑘] + 𝑇[𝑖]) ⋘ 𝑠)

[𝐴𝐵𝐶𝐷 0 6 49] [𝐷𝐴𝐵𝐶 7 10 50] [𝐶𝐷𝐴𝐵 14 15 51] [𝐵𝐶𝐷𝐴 5 21 52]


[𝐴𝐵𝐶𝐷 12 6 53] [𝐷𝐴𝐵𝐶 3 10 54] [𝐶𝐷𝐴𝐵 10 15 55] [𝐵𝐶𝐷𝐴 1 21 56]
[𝐴𝐵𝐶𝐷 8 6 57] [𝐷𝐴𝐵𝐶 15 10 58] [𝐶𝐷𝐴𝐵 6 15 59] [𝐵𝐶𝐷𝐴 13 21 60]
[𝐴𝐵𝐶𝐷 4 6 61] [𝐷𝐴𝐵𝐶 11 10 62] [𝐶𝐷𝐴𝐵 2 15 63] [𝐵𝐶𝐷𝐴 9 21 64]

/* Luego, realizar las siguientes sumas. */

𝐴 = 𝐴 + 𝐴𝐴 ; 𝐵 = 𝐵 + 𝐵𝐵 ; 𝐶 = 𝐶 + 𝐶𝐶 ; 𝐷 = 𝐷 + 𝐷𝐷
16

Paso 5: Salida. Los resúmenes de mensajes generados como salida son A, B, C, D. La

salida comienza con bytes bajos (de menor peso) de A y termina con bytes altos (de mayor peso)

de D.

SHA-1

Concepto del algoritmo SHA-1

El SHA-1 es un algoritmo hash seguro aprobado por los Estándares Federales de

Procesamiento de Información (FIPS) emitidos por el Instituto Nacional de Estándares y

Tecnología (NIST). De acuerdo con Lin et al. (2019), el SHA-1 trabaja con datos de entrada

menor a 264 para producir un resumen de mensaje de longitud de 160 bits. La longitud del

mensaje de entrada puede ser menor que 512 bits, pero cuando es mayor, el mensaje es dividido

en varios fragmentos de mensajes (p. 493).

Además, de acuerdo con Lin et al. (2019), el resumen del mensaje original y los nuevos

bloques de mensajes son utilizados para producir nuevos resúmenes de mensajes. Como ya se

explicó previamente, este tipo de algoritmos son seguros porque son extremadamente difíciles de

regresar al mensaje original a partir del resumen. La función hash tiene un efecto de avalancha

muy fuerte pues, un pequeño cambio en el mensaje causará cambios drásticos en el resumen del

mensaje (p. 493).

Descripción del Algoritmo SHA-1

El siguiente procedimiento para el desarrollo del algoritmo SHA-1 fue propuesto por

Long (2019):
17

Paso 1: Inicializamos las variables. El autor supone que la longitud del mensaje a ser

resumido es mucho menor que 264.

h0 = 0x67452301 h3 = 0x10325476

h1 = 0xEFCDAB89 h4= 0xC3D2E1F0

h2 = 0x98BADCFE

Paso 2: Pre - procesamiento. Añadimos el bit “1” al mensaje, luego añadimos k bits

“0”, donde k es el mínimo número >= 0, tal como la longitud del mensaje resultante es

congruente con 448 (mod 512). Luego, añadimos la longitud del mensaje, en bits, como un

entero big - endian de 64 bits.

Paso 3: Se procesa el mensaje en fragmentos consecutivos de 512 bits. Se divide el

mensaje en fragmentos de 512 bits para cada fragmento, y el fragmento dividido, en dieciséis

palabras big – endian de 32 bits.

w[i],0≤i≤15

Paso 4: Extender las dieciséis palabras de 32 bits ochenta palabras de 32 bits.

for i from 16 to 79

w[i]=w[i-3]⊕w[i-8]⊕w[i-14]⊕w[i-16] leftrotate 1

Paso 5: Inicializar el valor hash para el fragmento.

a := h0 … e := h4

Paso 6: Bucle Principal.

for i from 0 to 79 If 0<= i <=19 then


18

f = (b ˄ c) v ((¬b) ˄ d) f=b⊕c⊕d
k = 0x5A827999 k = 0xCA62C1D6
else if 20 <= i <= 39 temp = (a leftrotate 5) + f + e + k + w[i]
f=b⊕c⊕d e=d
k = 0x6ED9EBA1 d=c
else if 40 <= i <= 59 c = b leftrotate 30
f = (b ˄ c) v (b ˄ d) v (c ˄ d) b=a
k = 0x8F1BBCDC a = temp

else if 60<= i <= 79


Añadir el hash de este bloque al resultado:

h0 = h0 + a … h4= h4 + e

Producir el valor hash final (big - endian).

Digest = hash = h0 append h1 append h2 append h3 append h4

Las siguientes expresiones alternativas podrían ser capaces de calcular f en el bucle principal.

(0 <= i <= 19) f = d ⊕ (b ^ (c ⊕ d)) (alternative)


(40 <= I <= 59) f = (b ^ c) v (d ^ (b ^ c)) (alternative 1)
(40 <= I <= 59) f= (b ^ c) v (d ^ (b ⊕ c)) (alternative 2)
(40 <= I <= 59) f= (b ^ c) + (d ^ (b ⊕ c)) (alternative 3)

SHA-2

Concepto del algoritmo SHA-2

SHA-2 pertenece a la familia de criptográficos SHA, fue diseñado por la Agencia de

Seguridad Nacional de EE. UU. (NSA). En 2001, NIST introdujo sus dos versiones, SHA-256

(32 bits) y SHA-512 (64 bits) como un Estándar Federal de Procesamiento de Información de los
19

EE. UU. Años posteriores se agregaron otras versiones truncadas, SHA-224, que es una versión

de SHA-256, y SHA 384 que es una versión de SHA-512. En pocas palabras, SHA-2 es el

conjunto de algoritmos hash criptográficos, excluyendo SHA-1 (Ghoshal et al., 2020, p.110).

Martino y Cilardo (2020) mencionan como SHA-2 sigue siendo muy utilizado y es

crucial en muchas aplicaciones, a pesar de que el NIST, en 2015, estandarizó una nueva función

hash, SHA-3, la cual no ha alcanzado a generalizarse(párr. 8).

Descripción del Algoritmo SHA-512

A continuación se muestran los pasos del algoritmo SHA-512. Se usó como base el

trabajo de Long (2019) y algunas contribuciones de otros autores.

Paso 1: inicializar variables y constantes. Como dicen Martino y Cilardo(2020) las

variables utilizadas son los primeros 64 bits de la parte decimal de las raíces cuadradas de los

primeros ocho números primos(prr. 14).

0 0
𝐻0→𝑎 = 0𝑥6𝑎09𝑒667𝑓3𝑏𝑐𝑐908 𝐻4 → 𝑒 = 0𝑥510𝑒527𝑓𝑎𝑑𝑒682𝑑𝑙

0 0
𝐻1 → 𝑏 = 0𝑥𝑏𝑏67𝑎𝑒8584𝑐𝑎𝑎73𝑏 𝐻5 → 𝑓 = 0𝑥9𝑏05688𝑐2𝑏3𝑒6𝑐1𝑓

0 0
𝐻2 → 𝑐 = 0𝑥3𝑐6𝑒𝑓372𝑓𝑒94𝑓82𝑏 𝐻6 → 𝑔 = 0𝑥1𝑓83𝑑9𝑎𝑏𝑓𝑏41𝑏𝑑6𝑏

0 0
𝐻3 → 𝑑 = 0𝑥𝑎54𝑓𝑓53𝑎5𝑓1𝑑36𝑓1 𝐻7 → ℎ = 0𝑥5𝑏𝑒0𝑐𝑑19137𝑒2179

Y de igual manera se inicializan las constantes 𝑘𝑖 que serían los primeros 64 bits de la

parte decimal de las raíces cúbicas de los 80 primeros números.

Paso 2: Pre procedimiento. A continuación, como nos indican Martino y Cilardo(2020),

el mensaje se rellena con un solo 1 seguido de tantos 0 bits como sea necesario para alcanzar
20

una longitud congruente con 896 mod 1024 , para dejar los últimos 128 bits para codificar la

longitud original del mensaje. Esto implica que el límite de la longitud del mensaje que se va a

128
codificar se incrementa hasta 2 − 129 bits.

0 1 𝑁
Analizar el mensaje relleno en N bloques de mensajes 𝐵 , 𝐵 , …, 𝐵 donde el tamaño del

bloque es de 1024 bits.

Los pasos 3 y 4 son bucles de 80 iteraciones en cada bloque de 1024 bits.

Paso 3: Preparar la programación del mensaje

𝑖
𝐵 𝑡 , (0 ≤ 𝑡 ≤ 15)
𝑊𝑡 =
( ) (
σ1 𝑊𝑡−2 + 𝑊𝑡−7 + σ0 𝑊𝑡−15 + 𝑊𝑡−16 , ) (16≤ 𝑡 ≤80)

Donde:

19 61 6
σ1(𝑥) = 𝑅𝑂𝑇𝑅 (𝑥)⨁ 𝑅𝑂𝑇𝑅 (𝑥)⨁𝑆𝐻𝑅 (𝑥)

1 8 7
σ0(𝑥) = 𝑅𝑂𝑇𝑅 (𝑥)⨁ 𝑅𝑂𝑇𝑅 (𝑥)⨁𝑆𝐻𝑅 (𝑥)

Paso 4: Bucle principal de compresión. Chaves et al.(2016) proponen el siguiente

fragmento de algoritmo para el bucle de compresión(p. 86).

𝑇1 = ℎ + ∑ (𝑒) + 𝐶ℎ(𝑒, 𝑓, 𝑔) + 𝑘𝑡 + 𝑊𝑡
1

𝑇2 = ∑ (𝑎) + 𝑀𝑎𝑗(𝑎, 𝑏, 𝑐)
0

ℎ = 𝑔 ; 𝑔 = 𝑓 ; 𝑓 = 𝑒;
𝑒 = 𝑑 + 𝑇1;

𝑑 = 𝑐 ; 𝑐 = 𝑏 ; 𝑏 = 𝑎;
21

𝑎 = 𝑇1 + 𝑇2

Donde:
𝐶ℎ(𝑥, 𝑦, 𝑧) = (𝑥∧𝑦)⨁(¬𝑥 ∧𝑧)

𝑀𝑎𝑗(𝑥, 𝑦, 𝑧) = (𝑥∧𝑦)⨁(𝑥 ∧𝑧)⨁(𝑦 ∧𝑧)

28 34 39
∑ (𝑥) = 𝑅𝑂𝑇𝑅 (𝑥)⨁ 𝑅𝑂𝑇𝑅 (𝑥)⨁𝑅𝑂𝑇𝑅 (𝑥)
0

14 18 41
∑ (𝑥) = 𝑅𝑂𝑇𝑅 (𝑥)⨁ 𝑅𝑂𝑇𝑅 (𝑥)⨁𝑅𝑂𝑇𝑅 (𝑥)
1

Paso 5: Inserción del trozo comprimido al valor hash actual. Suponiendo que se

calcula el i-ésimo valor hash intermedio, los valores de 𝐻0 a 𝐻7 son iterados y calculados

por un sumador.

𝑖 𝑖−1 𝑖 𝑖−1
𝐻0 = 𝑎 + 𝐻0 … 𝐻7 = ℎ + 𝐻7

Paso 6: Salida. Después de repetir los pasos anteriores N veces, el resultado de

resumen del mensaje es:

𝑁 𝑁 𝑁 𝑁 𝑁 𝑁 𝑁 𝑁
𝐻0 || 𝐻1 || 𝐻2 || 𝐻3 ||𝐻4 || 𝐻5 ||𝐻6 || 𝐻7

donde el símbolo || denota el operador de concatenación.

Simulación

Long (2019) realizó un estudio donde comparó el tiempo de ejecución; los experimentos

se realizaron en Windows 10 con Intel (R) Core (TM) CPU i5-6300HQ @ 2.30GHz 2.30GHz y

8.00GB RAM y sistema operativo de 64 bits. El funcionamiento del entorno utilizado para

codificar C++ en Visual Studio 2013 (p.5).


22

Simulación del algoritmo HASH MD5

➢ Cadena de caracteres: “abc”

➢ Valor Hash: 900150983cd24fb0d6963f7d28e17f72

➢ Tiempo promedio de funcionamiento: 3.08556 ms NBET = 0.97227 bit/ms

Simulación del algoritmo SHA-1

➢ Cadena de caracteres: “abc”

➢ Valor Hash: a9993e364706816aba3e25717850c26c9cd0d89d

➢ Tiempo de ejecución promedio: 8.87031 ms NBET = 0.33821 bit/ms

Simulación del algoritmo SHA-512

➢ Cadena de caracteres: “abc”

➢ Valor Hash:

ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a8

36ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f

➢ Tiempo promedio de funcionamiento: 10.79296 ms NBET = 0.27796 bit/ms

Ejemplo de Encriptación SHA con C++ (SHA-1)

Código C++

#include <iostream>
#include <string>
#ifndef _TINY_SHA1_HPP_
#define _TINY_SHA1_HPP_
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stdint.h>
namespace sha1{
class SHA1{
public:
typedef uint32_t digest32_t[5];
typedef uint8_t digest8_t[20];
inline static uint32_t LeftRotate(uint32_t value, size_t count) {
23

return (value << count) ^ (value >> (32-count));


}
SHA1(){ reset(); }
virtual ~SHA1() {}
SHA1(const SHA1& s) { *this = s; }
const SHA1& operator = (const SHA1& s) {
memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t));
memcpy(m_block, s.m_block, 64);
m_blockByteIndex = s.m_blockByteIndex;
m_byteCount = s.m_byteCount;
return *this; }
SHA1& reset() {
m_digest[0] = 0x67452301; m_digest[1] = 0xEFCDAB89;
m_digest[2] = 0x98BADCFE; m_digest[3] = 0x10325476;
m_digest[4] = 0xC3D2E1F0; m_blockByteIndex = 0;
m_byteCount = 0;
return *this; }
SHA1& processByte(uint8_t octet) {
this->m_block[this->m_blockByteIndex++] = octet;
++this->m_byteCount;
if(m_blockByteIndex == 64) {
this->m_blockByteIndex = 0;
processBlock(); }
return *this; }
SHA1& processBlock(const void* const start, const void* const end){
const uint8_t* begin = static_cast<const uint8_t*>(start);
const uint8_t* finish = static_cast<const uint8_t*>(end);
while(begin != finish) {
processByte(*begin);
begin++;
} return *this; }
SHA1& processBytes(const void* const data, size_t len) {
const uint8_t* block = static_cast<const uint8_t*>(data);
processBlock(block, block + len);
return *this; }
const uint32_t* getDigest(digest32_t digest) {
size_t bitCount = this->m_byteCount * 8;
processByte(0x80);
if (this->m_blockByteIndex > 56) {
while (m_blockByteIndex != 0)
processByte(0);
while (m_blockByteIndex < 56)
processByte(0);
} else {
while (m_blockByteIndex < 56)
processByte(0);
}
processByte(0); processByte(0); processByte(0);
processByte(0);
processByte( static_cast<unsigned char>((bitCount>>24) & 0xFF));
processByte( static_cast<unsigned char>((bitCount>>16) & 0xFF));
processByte( static_cast<unsigned char>((bitCount>>8 ) & 0xFF));
processByte( static_cast<unsigned char>((bitCount) & 0xFF));
memcpy(digest, m_digest, 5 * sizeof(uint32_t));
24

return digest; }
const uint8_t* getDigestBytes(digest8_t digest) {
digest32_t d32;
getDigest(d32);
size_t di = 0;
digest[di++] = ((d32[0] >> 24) & 0xFF);
digest[di++] = ((d32[0] >> 16) & 0xFF);
digest[di++] = ((d32[0] >> 8) & 0xFF);
digest[di++] = ((d32[0]) & 0xFF);
digest[di++] = ((d32[1] >> 24) & 0xFF);
digest[di++] = ((d32[1] >> 16) & 0xFF);
digest[di++] = ((d32[1] >> 8) & 0xFF);
digest[di++] = ((d32[1]) & 0xFF);
digest[di++] = ((d32[2] >> 24) & 0xFF);
digest[di++] = ((d32[2] >> 16) & 0xFF);
digest[di++] = ((d32[2] >> 8) & 0xFF);
digest[di++] = ((d32[2]) & 0xFF);
digest[di++] = ((d32[3] >> 24) & 0xFF);
digest[di++] = ((d32[3] >> 16) & 0xFF);
digest[di++] = ((d32[3] >> 8) & 0xFF);
digest[di++] = ((d32[3]) & 0xFF);
digest[di++] = ((d32[4] >> 24) & 0xFF);
digest[di++] = ((d32[4] >> 16) & 0xFF);
digest[di++] = ((d32[4] >> 8) & 0xFF);
digest[di++] = ((d32[4]) & 0xFF);
return digest; }
protected:
void processBlock() {
uint32_t w[80];
for (size_t i = 0; i < 16; i++) {
w[i] = (m_block[i*4 + 0] << 24);
w[i] |= (m_block[i*4 + 1] << 16);
w[i] |= (m_block[i*4 + 2] << 8);
w[i] |= (m_block[i*4 + 3]); }
for (size_t i = 16; i < 80; i++) {
w[i] = LeftRotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]),
1); }
uint32_t a = m_digest[0];uint32_t b = m_digest[1];
uint32_t c = m_digest[2];uint32_t d = m_digest[3];
uint32_t e = m_digest[4];
for (std::size_t i=0; i<80; ++i) {
uint32_t f = 0;
uint32_t k = 0;
if (i<20) {
f = (b & c) | (~b & d);
k = 0x5A827999; } else if (i<40) {
f = b ^ c ^ d;
k = 0x6ED9EBA1; } else if (i<60) {
f = (b & c) | (b & d) | (c & d);
k = 0x8F1BBCDC; } else {
f = b ^ c ^ d;
k = 0xCA62C1D6; }
uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i];
e = d; d = c;
25

c = LeftRotate(b, 30); b = a;
a = temp; }

m_digest[0] += a; m_digest[1] += b;
m_digest[2] += c; m_digest[3] += d;
m_digest[4] += e; }
private:
digest32_t m_digest;
uint8_t m_block[64];
size_t m_blockByteIndex;
size_t m_byteCount;
};
}
#endif
void testSHA1(const std::string& val) {
sha1::SHA1 s;
[Link](val.c_str(), [Link]());
uint32_t digest[5];
[Link](digest);
char tmp[48];
snprintf(tmp, 45, "%08x %08x %08x %08x %08x", digest[0], digest[1], digest[2],
digest[3], digest[4]);
std::cout<<"Calculated : (\""<<val<<"\") = "<<tmp<<std::endl;
}
int main(int argc, char **argv) {
testSHA1("cor"); //Cabe recalcar que no se deben incluir las tildes y la 'ñ'
testSHA1("Este es un mensaje predeterminado para poder mostrar una cadena
super hiper mega archi larga :) Muchas Gracias");
testSHA1("Fiorela");
testSHA1("fiorela");
testSHA1("a");
testSHA1(" ");
testSHA1("DNI14./$");return 0
26

Resultados

El primer y segundo resultado nos demuestran que el tamaño del mensaje que se ingresa

a la función Hash no es relevante con respecto al tamaño de salida, este siempre saldrá con una

longitud de 160 bits.

En la tercera y cuarta cadena, podemos ver como un cambio mínimo puede llegar a un

mensaje de salida muy diferente.

Finalmente, podemos ver que dentro de la cadena puede ingresar cualquier caracter, inclusive el

espacio. Cabe resaltar que no se deben incluir tildes ni la letra “ñ”.


27

Conclusiones

El uso de la firma digital conlleva a una nueva forma de trasmisión de mensajes que garantiza la

integridad y la autenticación de los mismos. El proceso es más rápido y más seguro en

comparación con la firma manuscrita y su uso actualmente es cada vez mayor. Para comprobar la

validez de una firma digital, es necesario que esté seguro de que la clave pública que utiliza para

verificarla. Esta verificación recae en el certificado digital firmado por una CA. Por lo tanto, los

certificados digitales y la CA son la pieza clave.

Los tokens, como dispositivos utilizados en el almacenamiento de claves, brindan un medio

seguro que complementa los beneficios de la firma digital, además de cumplir un papel

importante en el proceso de encriptamiento. Para poder generar las claves requeridas por el

usuario existen algoritmos que cumplen dicha función y la velocidad que emplean es un aspecto

importante. En términos de velocidad, el algoritmo MD5 es el más veloz entre los 3 algoritmos

HASH presentados, ya que es mucho más simple. Por otra parte, el algoritmo SHA-2 es el más

seguro de los 3 presentados.

1.
28

Referencias

Aguilar Alcarráz, G. B. (2016). Implementación de un modelo simplificado de firma digital

basado en la tecnología PKI y la invocación por protocolos caso de estudio:

Municipalidad de Miraflores.

Algredo-Badillo, I., Cumplido-Parra, R. A., & Feregrino-Uribe, C. (2004). Desarrollo de un

Módulo MD5 para un Sistema Criptográfico Reconfigurable en un FPGA. In Por

aparecer en International Conference on Reconfigurable Computing and FPGAs,

ReConFig04, México.

Algredo-Badillo, I., Cumplido-Parra, R., & Feregrino-Uribe, C. (s.f.) Rondas Parcialmente

Desenrolladas para Implementaciones a 1 Gbps en FPGA de los Algoritmos SHA-1 y

MD5.

Alvarez Villalva, C. J., Idrobo Borja, D. M., & Mendoza Macias, O. (2005). Creación de una

empresa proveedora de certificados de firma digital para operadores de comercio exterior

en el Ecuador (Bachelor's thesis).

Cardador Cabello, A. L. (2014). Desarrollo de aplicaciones web distribuidas. Málaga: IC

Editorial.

Chaves, R., Sousa, L., Sklavos, N., Fournaris, A. P., Kalogeridou, G., Kitsos, P., & Sheikh, F.

(2016). Secure hashing: SHA-1, SHA-2, and SHA-3. Circuits and Systems for Security

and Privacy; Taylor & Francis Group: Abingdon, UK, 105-132.


29

De la Motta Paez, D. E., & Vela Berrocal, L. H. (2008). Sistema de protección de archivos de

constitución de empresas haciendo uso de la tecnología de firma digital.

Díaz Orueta, G., Alzórriz Armendáriz, I., Sancrsitóbal Ruiz, E., & Castro Gil, M. (2014).

Proceso y herramientas para la seguridad de redes. Universidad Nacional de Educación

a Distancia. Madrid: UNED.

Escalona, S. B., & Inclán, L. V. (2012). Funciones resúmenes o hash. Revista Telemática, 10(1).

García Rojas, W. A. (2008). Implementación de firma digital en una plataforma de comercio

electrónico.

García, F. Y. H. (2018). Análisis de la firma digital con base en la infraestructura de clave

pública. Hamut´ ay, 5(2), 95-105.

Ghoshal, S., Bandyopadhyay, P., Roy, S., & Baneree, M. (2020). A journey from MD5 to SHA-3

doi:10.1007/978-981-15-1624-5_11.

Gómez, L. S. M.(s.f.) MD5 para la Certificación de Copias.

Gonzáles Manzano, L., María De Fuentes, J., & Romero de Tejada, G. (2014). Sistemas seguros

de acceso y transmisión de datos. IFCT0109. Málaga: IC Editorial.

Lin, C. -., Liu, J. -., Chen, J. I. -., & Chu, T. -. (2019). On the performance of cracking hash

function SHA-1 using cloud and GPU computing. Wireless Personal Communications,

109(1), 491-504. doi:10.1007/s11277-019-06575-9.


30

Long, S. (2019). A comparative analysis of the application of hashing encryption algorithms for

MD5, SHA-1, and SHA-512. Paper presented at the Journal of Physics: Conference

Series, , 1314(1) doi:10.1088/1742-6596/1314/1/012210.

Martino, R., & Cilardo, A. (2020). SHA-2 acceleration meeting the needs of emerging

applications: A comparative survey. IEEE Access, 8, 28415-28436.

doi:10.1109/ACCESS.2020.2972265

Mohit, P., & Biswas, G. P. (2017). Modification of traditional RSA into symmetric-RSA

cryptosystems. International Journal of Business Data Communications and Networking,

13(1), 66-73. 10.4018/IJBDCN.2017010106

Oppliger, R. (2014). Secure Messaging on the Internet. Boston: Artech House.

Reyes González, E. J., & Quintero Peña, J. G. (2006). Firma digital basada en redes(Lattice).

Revista Científica, (8), 53 - 64. [Link]

Rezaeighaleh, H., Laurens, R., & Zou, C. C. (2018). Secure smart card signing with time-based

digital signature. Paper presented at the 2018 International Conference on Computing,

Networking and Communications, 182-187. 10.1109/ICCNC.2018.8390321.

Soriano, M. (2014). Seguridad en redes y seguridad de la información. Obtenido de

[Link] cvut. cz/project/download/C2ES/Seguridad_de_Red_e_Informacion. pdf.

También podría gustarte