# C et C++ > C > Contribuez >  [Article] La fonction MD5 [Sources]

## Melem

Il s'agit en fait d'une source avec une petite introduction pour le calcul du MD5 en C. Le ZIP contient tous les fichiers sources et excutables (.exe), etc. prsents dans cette page.

MD5 (Message-Digest version 5) est une fonction de hashage prenant en entre un "message" de longueur quelconque et produisant en sortie une "signature numrique" (le message-digest) de 128 bits. Deux messages gaux ont le mme MD5. La probabilit de trouver deux messages diffrents possdant le mme MD5 en utilisant la technologie actuelle est extrmement faible. Ainsi, ses principales applications sont le contrle d'intgrit des donnes et le stockage de mot de passe dans les systmes d'authentification. Il est dcrit dans la RFC 1321. Nous-nous proposons d'crire une fonction C permettant de calculer le MD5 d'un message. Il est vident que pour comprendre le code, il faut avoir lu la description de l'algorithme, sinon se contenter de l'utiliser  :;): 

*Contraintes*
- MD5 utilise des entiers de taille fixe (32 bits, 64 bits, etc.), qui n'existent pas en C standard. Il faut donc en gnral passer par une srie de #if et de typedef pour obtenir un type entier de taille connue d'avance pour n'importe quelle plateforme.
- MD5 suppose que les donnes sont stockes en mmoire dans le format little-endian (les octets sont stockes en commenant par celui dont le poids est le plus faible). Il faut donc en gnral dvelopper des macros permettant de mettre les octets dans le bon ordre.
- Notre but tant de donner un exemple simple d'implmentation de MD5, nous avons volontairement choisi d'crire du code spcifique  une plateforme de notre choix en utilisant un compilateur de notre choix :
* Pour la plateforme cible, n'importe que systme supportant nativement des entiers de 32 et 64 bits, utilisant 8 bits pour le type char et rangeant les donnes en mmoire selon le format little-endian. Nous choisissons le PC comme matriel et Windows, 32 ou 64 bits, comme logiciel.
* Pour le compilateur : Microsoft Visual C++. L'implmentation du C de Microsoft supporte nativement les types __int32 (entier 32 bits) et __int64 (entier 64 bits). Ces types sont galement supports par Borland C++ et MinGW, pour ne citer qu'eux.
* La fonction : elle permettra de calculer le MD5 d'un message dont la longueur est spcifie en octets (mme si MD5 accepte un message de n'importe quelle longueur, c'est--dire dont la longueur est spcifie en bits).

*Prliminaires*
MD5 utilise un tableau de 64 entiers de 32 bits. Nous allons donc dans un premier temps crer un fichier que nous allons nommer t.data contenant ces 64 entiers. Tous les moyens sont bons, le plus simple tant de crer un programme qui va nous crer ce fichier.

Fichier md5_tgen.c :


```

```

*Codage*
Les fonctions que nous devons crire :
- md5_init() : charge le fichier t.data
- md5() : calcule le MD5 d'un message fourni en argument
- md5_format() : formate un MD5 afin qu'il soit lisible par un humain
- d'autres qui nous viendront  l'esprit.

Fichier md5.h :


```

```

Fichier md5.c :


```

```

Exemple d'utilisation :


```

```

----------


## Heezalive

Ce programme fonctionne parfaitement bien c'est exactement ce que je cherchais, le seul regret que je pourrais avoir c'est de ne pas tres tomb dessus plus tt.

Merci

----------


## ram-0000

Pour info, la RFC 1321 fournit un code directement compilable en C et fournit en plus un jeu minimal de tests permettant de tester l'implmentation.

----------


## pfeuh

Salut,

Nickel! A mon sens il faudrait tendre un petit peu  d'autres langages pour lesquels le MD5 et le stockage se justifient et font l'objet de librairies: Un snippet pour le python, un autre pour le PHP.  :8-): 

A+

Pfeuh

----------


## CGi

Juste pour info, sous windows on peut le faire avec wincrypt
un petit exemple :


```

```

----------


## fanfouer

Bonsoir,

Merci pour ce code.

Est-il possible de se passer du fichier t.data?
Pourquoi ne pas stocker les 64 entiers de 32 bits directement en mmoire vive?

----------


## Ayoub Esslimani

Cela peut tre utilis pour calculer le md5 d'un fichier ? comment l'utiliser dans ce sens

----------

