¿Cómo obtener el hash MD5 de un archivo en C ++?

Tengo la ruta del archivo. ¿Cómo puedo obtener el hash MD5?

Aquí hay una implementación directa del comando md5sum que calcula y muestra el MD5 del archivo especificado en la línea de comandos. Debe estar enlazado con la biblioteca OpenSSL ( gcc md5.c -o md5 -lssl ) para que funcione. Es C puro, pero debería ser capaz de adaptarlo a su aplicación C ++ con la suficiente facilidad.

 #include  #include  #include  #include  #include  #include  #include  #include  unsigned char result[MD5_DIGEST_LENGTH]; // Print the MD5 sum as hex-digits. void print_md5_sum(unsigned char* md) { int i; for(i=0; i  

Puede implementar el algoritmo MD5 usted mismo (hay ejemplos en toda la web), o puede vincularlo con las librerías OpenSSL y usar las funciones resumidas de OpenSSL. aquí hay un ejemplo para obtener el MD5 de una matriz de bytes:

 #include  QByteArray AESWrapper::md5 ( const QByteArray& data) { unsigned char * tmp_hash; tmp_hash = MD5((const unsigned char*)data.constData(), data.length(), NULL); return QByteArray((const char*)tmp_hash, MD5_DIGEST_LENGTH); } 
 QFile file("bigimage.jpg"); if (file.open(QIODevice::ReadOnly)) { QByteArray fileData = file.readAll(); QByteArray hashData = QCryptographicHash::hash(fileData,QCryptographicHash::Md5); // or QCryptographicHash::Sha1 qDebug() < < hashData.toHex(); // 0e0c2180dfd784dd84423b00af86e2fc } 

Para cualquier persona que se redirija de ” https://stackoverflow.com/questions/4393017/md5-implementation-in-c ” porque se ha etiquetado incorrectamente como duplicado.

El ejemplo que se encuentra aquí funciona:

http://www.zedwood.com/article/cpp-md5-function

Si está comstackndo en VC ++ 2010, deberá cambiar su main.cpp a este:

 #include  //for std::cout #include  //for std::string #include "MD5.h" using std::cout; using std::endl; int main(int argc, char *argv[]) { std::string Temp = md5("The quick brown fox jumps over the lazy dog"); cout < < Temp.c_str() << endl; return 0; } 

Tendrá que cambiar ligeramente la clase MD5 si va a leer en una matriz char * en lugar de una cadena para responder la pregunta en esta página aquí.

EDITAR:

Aparentemente la modificación de la biblioteca MD5 no está clara, y una solución completa de VC ++ 2010 está aquí para su conveniencia para incluir char * 's:

https://github.com/alm4096/MD5-Hash-Example-VS

Una pequeña explicación está aquí:

 #include  //for std::cout #include  //for std::string #include  #include "MD5.h" using std::cout; using std::endl; int main(int argc, char *argv[]) { //Start opening your file ifstream inBigArrayfile; inBigArrayfile.open ("Data.dat", std::ios::binary | std::ios::in); //Find length of file inBigArrayfile.seekg (0, std::ios::end); long Length = inBigArrayfile.tellg(); inBigArrayfile.seekg (0, std::ios::beg); //read in the data from your file char * InFileData = new char[Length]; inBigArrayfile.read(InFileData,Length); //Calculate MD5 hash std::string Temp = md5(InFileData,Length); cout < < Temp.c_str() << endl; //Clean up delete [] InFileData; return 0; } 

Simplemente agregué lo siguiente en la biblioteca MD5:

MD5.cpp:

 MD5::MD5(char * Input, long length) { init(); update(Input, length); finalize(); } 

MD5.h:

 std::string md5(char * Input, long length); 

Necesitaba hacer esto ahora y necesitaba una solución multiplataforma que fuera adecuada para c ++ 11, boost y openssl. Tomé la solución de D’Nabre como punto de partida y la reduje a lo siguiente:

 #include  #include  #include  #include  const std::string md5_from_file(const std::string& path) { unsigned char result[MD5_DIGEST_LENGTH]; boost::iostreams::mapped_file_source src(path); MD5((unsigned char*)src.data(), src.size(), result); std::ostringstream sout; sout<  

Un ejecutable de prueba rápida demuestra:

 #include  int main(int argc, char *argv[]) { if(argc != 2) { std::cerr< <"Must specify the file\n"; exit(-1); } std::cout< 

Algunas notas de enlace: Linux: -lcrypto -lboost_iostreams Windows: -DBOOST_ALL_DYN_LINK libeay32.lib ssleay32.lib

He usado Botan para realizar esta operación y otras antes. AraK ha señalado Crypto ++. Supongo que ambas bibliotecas son perfectamente válidas. Ahora depende de ti :-).

La implementación de John Walker viene con fonts .

Hay una bonita biblioteca en http://256stuff.com/sources/md5/ , con ejemplos de uso. Esta es la biblioteca más simple para MD5.

Usando Crypto ++, podrías hacer lo siguiente:

 #include  #include  SHA256 sha; while ( !f.eof() ) { char buff[4096]; int numchars = f.read(...); sha.Update(buff, numchars); } char hash[size]; sha.Final(hash); cout < < hash < 

Necesito algo muy similar, porque no puedo leer en archivos de varios gigabytes solo para calcular un hash. En teoría, podría mapearlos en la memoria, pero tengo que admitir plataformas de 32 bits, eso todavía es problemático para archivos grandes.

Una reelaboración de la impedancia de @ D’Nabre para C ++. No te olvides de comstackr con -lcrypto al final: gcc md5.c -o md5 -lcrypto .

 #include  #include  #include  #include  #include  using namespace std; unsigned char result[MD5_DIGEST_LENGTH]; // function to print MD5 correctly void printMD5(unsigned char* md, long size = MD5_DIGEST_LENGTH) { for (int i=0; i
		      	

md5.h también tiene funciones MD5_* muy útiles para archivos grandes

 #include  #include  ....... std::ifstream file(filename, std::ifstream::binary); MD5_CTX md5Context; MD5_Init(&md5Context); char buf[1024 * 16]; while (file.good()) { file.read(buf, sizeof(buf)); MD5_Update(&md5Context, buf, file.gcount()); } unsigned char result[MD5_DIGEST_LENGTH]; MD5_Final(result, &md5Context); 

Muy simple, ¿no? Conversión a cadena también muy simple:

 #include  #include  ....... std::stringstream md5string; md5string < < std::hex << std::uppercase << std::setfill('0'); for (const auto &byte: result) md5string << std::setw(2) << (int)byte; return md5string.str();