72 votes

En C++, comment obtenir le hachage MD5 d'un fichier ?

J'ai le chemin du fichier. Comment puis-je obtenir le hash MD5 de celui-ci ?

Merci

44voto

D'Nabre Points 861

Voici une mise en œuvre directe de la fonction md5sum commande qui calcule et affiche le MD5 du fichier spécifié sur la ligne de commande. Elle doit être liée à la bibliothèque OpenSSL ( gcc md5.c -o md5 -lssl ) pour fonctionner. C'est du pur C, mais vous devriez pouvoir l'adapter à votre application C++ assez facilement.

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <openssl/md5.h>

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 <MD5_DIGEST_LENGTH; i++) {
            printf("%02x",md[i]);
    }
}

// Get the size of the file by its file descriptor
unsigned long get_size_by_fd(int fd) {
    struct stat statbuf;
    if(fstat(fd, &statbuf) < 0) exit(-1);
    return statbuf.st_size;
}

int main(int argc, char *argv[]) {
    int file_descript;
    unsigned long file_size;
    char* file_buffer;

    if(argc != 2) { 
            printf("Must specify the file\n");
            exit(-1);
    }
    printf("using file:\t%s\n", argv[1]);

    file_descript = open(argv[1], O_RDONLY);
    if(file_descript < 0) exit(-1);

    file_size = get_size_by_fd(file_descript);
    printf("file size:\t%lu\n", file_size);

    file_buffer = mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0);
    MD5((unsigned char*) file_buffer, file_size, result);

    print_md5_sum(result);
    printf("  %s\n", argv[1]);

    return 0;
}

21voto

OneOfOne Points 15558

Vous pouvez implémenter l'algorithme MD5 vous-même (les exemples sont partout sur le web), ou vous pouvez créer un lien avec les librairies OpenSSL et utiliser les fonctions digest d'OpenSSL. Voici un exemple pour obtenir le MD5 d'un tableau d'octets :

#include <openssl/md5.h>
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);
}

9voto

iyiy Points 99
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

}

6voto

bobobobo Points 17477

Il existe une collection d'implémentations en C, C++ et de nombreux autres langages. aquí .

J'ai mis en place une implémentation aquí .

4voto

Ulterior Points 817

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X