Obtener el hash MD5 de un archivo en C++

Zeeshan Afridi 15 febrero 2024
  1. ¿Qué es la función hash?
  2. ¿Qué es MD5?
  3. Conclusión
Obtener el hash MD5 de un archivo en C++

MD5 es un protocolo criptográfico que anteriormente se usaba para el cifrado, pero ahora se usa comúnmente para la autenticación. Se basa en el proceso de hash en la función hash que genera un valor hash cifrado contra un texto sin formato.

¿Qué es la función hash?

Comprender la función hash es importante antes de explorar el MD5 (algoritmo de resumen de mensajes). Hashing es el proceso de función hash que se utiliza para convertir texto sin formato en algún texto cifrado con el valor hash.

Se basa en una función matemática que ayuda a convertir texto sin formato en texto cifrado y, en general, en un valor hash comprimido.

función hash

Este diagrama demuestra el funcionamiento de la función hash; proporcionamos un mensaje básico de que el mensaje es una entrada a la función hash. Realiza algunos procesos y nos da la salida como un valor aleatorio cifrado conocido como texto cifrado.

Características de la función hash

  1. La salida es siempre de la misma longitud, 128 bits, sin depender del tamaño del texto plano.
  2. Comprime el mensaje original aunque sea de más de 128 bits.
  3. Digiere los datos (Mensaje), representando los datos en una representación de valor hash más pequeña.
  4. Los valores hash deben ser únicos para cada mensaje diferente.
  5. El valor hash siempre debe ser el mismo para el mismo mensaje.

¿Qué es MD5?

El MD5 (algoritmo de resumen de mensajes) es un protocolo criptográfico utilizado para autenticar un mensaje, verificación de contenido y firmas digitales; Ronald Rivest lo diseñó en [1991](https://en.wikipedia.org/wiki/MD5#:~:text=Ronald Rivest in-,1991 to,-replace an earlier) como una versión avanzada de MD4. Se basa en la función hash para verificar los archivos enviados y recibidos.

MD5 ahora se usa para la autenticación de datos, pero inicialmente se usó para el cifrado de datos. La autenticación es una de las propiedades centrales del cifrado que nos ayuda en la autenticación y el logro de la integridad de los datos.

MD5 es un algoritmo eficiente para la autenticidad de las contraseñas o la verificación de la originalidad de un archivo porque verifica los valores hash de los archivos o contraseñas poco a poco.

Hay 4 pasos destacados del algoritmo MD5:

  1. Puntas de relleno
  2. Añadir longitud
  3. Inicializar el búfer de MB
  4. Procesa cada bloque

Puntas de relleno

Nuestro mensaje inicial puede ser de cualquier tamaño, 4000 bits, 1231 bits o cualquier otro número de bits; luego, le agregamos algunos bits de relleno. Por último, debe asegurarse de que el tamaño de 64 bits sea múltiplo de 512.

Agregamos 1 al principio y el resto 0 en el relleno.

Añadir longitud

En este paso, para que su mensaje final sea un múltiplo de 512, debe agregarle algunos caracteres más. Para ello, tome la longitud del mensaje original y expréselo en forma de 64 bits.

Y esta combinación nos da el mensaje final cuya lectura debe ser procesada.

Inicializar búfer de MB

Es hora de inicializar los buffers A, B, C y D; cada búfer se utiliza para calcular los valores del resumen del mensaje. Cada búfer tiene 32 bits y se inicializa de la siguiente manera:

A = 01 23 45 67
B = 89 ab cd ef
C = fe dc ba 98
D = 76 54 32 10

Procesar cada bloque

Cada bloque de 512 bits se divide en pequeños fragmentos adicionales de 16 bloques; el tamaño de cada subbloque es de 32 bits. En general, cuatro rondas procesan cada bloque y realizan algunas operaciones específicas.

Cada ronda utiliza los 16 bloques y los búferes son valores de matriz constantes.

La matriz constante se denota como T[1] -> T[64], y todos los subbloques se denotan como M[0] -> m[15].

funcionamiento de MD5

De acuerdo con este diagrama, puede ver que los valores se ejecutan para cada búfer.

void print_MD5(unsigned char* md, long size = MD5_DIGEST_LENGTH) {
  for (int i = 0; i < size; i++) {
    cout << hex << setw(2) << setfill('0') << (int)md[i];
  }
}

Esta función se utiliza para imprimir MD correctamente.

#include <iostream>

#include "md5.h"  // This is an external library that you need to import for MD5 algorithm

using namespace std;  // for cout

int main() {
  cout << "md5 of 'grape' : " << md5("grape") << endl;
  return 0;
}

Producción :

md5 of 'grape' : b781cbb29054db12f88f08c6e161c199

Este código incluye una biblioteca externa, md5.h, que le permite utilizar el algoritmo MD5 y generar valores hash de texto sin formato. Pasamos una cadena grape como argumento a la función md5 que devuelve el valor hash del archivo.

fileSize = file.tellg();
cout << "File size \t" << fileSize << endl;
memBlock = new char[fileSize];
file.seekg(0, ios::beg);
file.read(memBlock, fileSize);
file.close();

Obtenga el tamaño del archivo y cópielo en la memoria.

Conclusión

El algoritmo hash MD5 se basa en una fórmula matemática compleja para el valor hash cifrado del texto sin formato. Como hemos visto en el funcionamiento del algoritmo MD5, convierte el texto plano en un bloque de tamaños específicos y realiza distintas operaciones sobre él.

Y al final, obtenemos un valor de compresión de 128 bits contra el texto. El valor hash del algoritmo MD5 para el alfabeto a parece 0cc175b9c0f1b6a831c399e269772661.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn