begin process at 2010 02 09 17:56:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > MD5 API, LE CELEBRE ALGORITHME DE HACHAGE SOUS DELPHI.

MD5 API, LE CELEBRE ALGORITHME DE HACHAGE SOUS DELPHI.


 Information sur la source

Note :
10 / 10 - par 4 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :md5, hash, checksum, algo, condensat Niveau :Initié Date de création :29/10/2006 Date de mise à jour :30/10/2006 11:54:43 Vu / téléchargé :11 269 / 1 550

Auteur : f0xi

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Salut,

cette fois on passe au choses serieuses.

je vous propose donc l'API MD5, qui permet donc d'avoir accés facilement a cet algorythme
de cryptage.

L'api se decoupe en Deux fichier :

MD5Api, qui est l'unité a declarer pour utiliser les fonctions.
MD5Core, qui contient l'agorythme (a ne pas modifier sinon ... ça marche plus).

Au depart j'avais recupéré une petite unité d'un auteur dont je n'arrive plus a me souvenir,
bref, aprés quelques fortes modifications et optimisations, j'ai ensuite ajouter plusieurs
choses utiles.

L'Api contient donc :

des fonctions qui genere des clef MD5 (string) a partir de chaines de caracteres, donnée non typée,
et fichiers.
d'autre fonctions permettent de faire des convertions, comparaisons ect...

voila, et que je ne vous vois plus mettre des identifiants d'accés en clair dans des fichiers INI,
registre et bases de données, la vous n'avez plus d'excuses.

Source

  • { Renvois la representation du MD5 d'une chaine de caracteres }
  • function MD5(const S : string) : string; overload;
  • { Renvois la representation du MD5 d'un buffer quelquonque }
  • function MD5(const Buffer; const Len: integer): string; overload;
  • { REnvois la representation du MD5 d'un fichier }
  • function MD5FromFile(const FileName : string) : string;
  • { Renvois une donnée MD5 d'une chaine de caracteres }
  • function MD5DataFromString(const S : string) : TMD5Data;
  • { Renvois une donnée MD5 d'un buffer quelquonque }
  • function MD5DataFromBuffer(const Buffer; const Len: integer) : TMD5Data;
  • { Renvois une donnée MD5 d'un fichier }
  • function MD5DataFromFile(const FileName: string): TMD5Data;
  • { Convertis une donnée MD5 vers une chaine de caracteres }
  • function MD5DataToStr(const Data : TMD5Data) : string;
  • { Convertis une chaine de caracteres representant un MD5 vers une donnée MD5 }
  • function MD5StrToMD5Data(const S : String) : TMD5Data;
  • { Verifie la validitée d'une chaine representant un MD5 }
  • function MD5StrCheck(const S : string) : boolean;
  • { Compare deux données MD5 }
  • function MD5Equal(const A, B: TMD5Data) : Boolean;
  • { Compare deux données MD5 grace a CompareMem }
  • function MD5MemEqual(const A, B : TMD5Data) : boolean;
  • { Inverse le sens des données d'une donnée MD5 }
  • function MD5Reverse(const Data : TMD5Data) : TMD5Data;
  • { Inverse l'ordre des octets Pair et Impair d'une donnée MD5 }
  • function MD5OddSwap(const Data : TMD5Data) : TMD5Data;
{ Renvois la representation du MD5 d'une chaine de caracteres }
function MD5(const S : string) : string; overload;
{ Renvois la representation du MD5 d'un buffer quelquonque }
function MD5(const Buffer; const Len: integer): string; overload;
{ REnvois la representation du MD5 d'un fichier }
function MD5FromFile(const FileName : string) : string;

{ Renvois une donnée MD5 d'une chaine de caracteres }
function MD5DataFromString(const S : string) : TMD5Data;
{ Renvois une donnée MD5 d'un buffer quelquonque }
function MD5DataFromBuffer(const Buffer; const Len: integer) : TMD5Data;
{ Renvois une donnée MD5 d'un fichier }
function MD5DataFromFile(const FileName: string): TMD5Data;

{ Convertis une donnée MD5 vers une chaine de caracteres }
function MD5DataToStr(const Data : TMD5Data) : string;
{ Convertis une chaine de caracteres representant un MD5 vers une donnée MD5 } 
function MD5StrToMD5Data(const S : String) : TMD5Data;

{ Verifie la validitée d'une chaine representant un MD5 }
function MD5StrCheck(const S : string) : boolean;
{ Compare deux données MD5 }
function MD5Equal(const A, B: TMD5Data) : Boolean;
{ Compare deux données MD5 grace a CompareMem }
function MD5MemEqual(const A, B : TMD5Data) : boolean;

{ Inverse le sens des données d'une donnée MD5 }
function MD5Reverse(const Data : TMD5Data) : TMD5Data;
{ Inverse l'ordre des octets Pair et Impair d'une donnée MD5 }
function MD5OddSwap(const Data : TMD5Data) : TMD5Data;

 Conclusion

Aucuns tests de performances n'a été effectué pour le moment, mais les routines sont assé
rapide.


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

30 octobre 2006 11:54:43 :
Mise a jours de MD5StrCheck qui n'incluait pas la verification de la longeur de la chaine. Remplacement du niveau Debutant par Initié.

 Sources du même auteur

Source avec Zip DYNAMIC LIBRARY LOADER CLASS: GAGNEZ DU TEMPS POUR CHARGER L...
Source avec Zip BASE64/BASE64URL ENCODE/DECODE
Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE...
Source avec Zip SIMPLES SOMME DE DONNÉES 8, 16, 32, 64 BITS
Source avec Zip CHAINLISTS, LISTE CHAINÉE

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GÉNÉRATEUR DE NOMBRES PSEUDO-ALÉATOIRES par Bacterius
Source avec Zip Source avec une capture ALGORITHME DE HASH LEA par Bacterius
Source avec Zip HROT, COMPRESSION CODÉE DE FICHIER PAR CLEF 128BITS par f0xi
Source avec Zip Source avec une capture TINYHASH - MD5, MD4 ET SHA1 par f0xi
Source avec Zip CRC32 API, ALGORITHME DE SOMME DE CONTROL par f0xi

Commentaires et avis

Commentaire de cirec le 30/10/2006 10:38:24 administrateur CS

Super comme toujours ...
si ça continue on va croire que tu me graisses la patte lol
j'ajouterai donc ceci :
Tu n'as pas nommé tes composants ... c'est pas bien ... lol

Je pense que le niveau débutant est un peut léger ... non ?
Les fonctions de Reverse et de Swap ajoute encore plus de sécurité

Sinon un petit plus serait de pouvoir séparer le résultat en mots de 8 octets
9b968d6e 69b30340 24897946 0693b2c4
et de pouvoir le passer en majuscule ce qui facilite la comparaison manuelle
9B968D6E 69B30340 24897946 0693B2C4

rien de bien terrible :)

Et pour comprendre pourquoi il faut choisir un mot de passe de plus de 6 caractères avec majuscules/minuscules et chiffres

il y a la source de GrandVizir:
http://www.delphifr.com/codes/RSA-DATA-SECURITY-INC-AN-MD5-RECOVERY-TOOL_30641.aspx

10/10

Commentaire de f0xi le 30/10/2006 12:07:50 administrateur CS

salut cirec :)

j'avais zappé le niveau... car l'utilisation reste trés trés simple. meme si seul les initiés savent pourquoi il faut utiliser un tel algorythme et ses fonctions.

les methodes de Swap et Reverse ne sont pas officielle. Leurs utilisation est donc reservée au choix de l'utilisateur.

Par defaut un MD5 est toujours en minuscule, jamais en majuscules.
mais un simple UpperCase ou LowerCase suffiront.

Certain me diront que MD5 est declaré non sur depuis 2004 car on aurait decouvert des collisions complete. Seulement ces collisions sont faites dans des conditions telle qu'on peu douter de la credibilitée d'une telle affirmation.
Certe les collisions existe, mais elles reste trés trés rare et sont generalement provoquée volontairement, difficile a realisée et obtenir de surcroit.

Le MD5 peut etre cassé uniquement en brute force. Mais necessite un dictionnaire de plusieurs GigaOctets et peu prendre plusieurs heures.
il reste neanmoins un trés bon algorythme de hash, assé securisant et qui rebuteras les petits crackers/lamers inexperimentés.

et en effet, on devrait toujours mettre des mots de passe alphanumerique d'au moins 5-6 caracteres, cela offre une securitée suplementaire et resistante au brute force.

Commentaire de f0xi le 30/10/2006 12:13:53 administrateur CS

ah aussi, pour l'instant rien est prevus encore, mais j'ai dans l'idée de fournir d'autres algorythmes notement SHA, RSA et WhirlPool.
mais le problemes des hash superieur a 256bits est le stockage.

d'ailleur je conseil pour le stockage des clefs MD5 d'utiliser le format TMD5Data plutot que String. mieux vaut stocker 16 octets que 32.

la demo fournie avec la source peut etre utilisée pour verifier la somme MD5 des fichiers telechargés sur le net.

Commentaire de JulioDelphi le 30/10/2006 13:07:30 administrateur CS

foxi, quand on dit "une somme d'un fichier" c'est la somme de quoi ? j'ai jamais compris ça >< *sight*

Commentaire de f0xi le 30/10/2006 14:11:58 administrateur CS



un checksum c'est la somme des bits d'un fichier.
par exemple, on peut faire un
CRC16 > renvois la somme dans un entier 16bits non signé
CRC32 > renvois la somme dans un entier 32bits non signé
CRC64 > renvois la somme dans un entier 64bits non signé
MD5 > renvois le hash dans un entier 256bits non signé

MD5 fait un hash, mais on peu appeler cela une somme.
cela permet de verifier l'intégritée des bits d'un fichier, plus ou moins surement.

mais cette somme n'est pas une simple addition de bits. c'est plutot le resultat du hashage des bits selon un algorythme donné (crc, md4, md5, sha, rsa, whirlpool).

cette somme genererat donc une signature unique ou presque, comme une empreinte digitale du fichier.
selon l'algorythme que l'on utiliserat, cette empreinte serat plus ou moins fiable, si on fait une analogie sur les humains cela irait de la couleur des cheveux ou des yeux a l'ADN.

un hash md5 founis par exemple 2^128 clefs possibles.
plus la clef serat longue, plus la signature serat unique. cela permet egalement de limiter le nombre de collisions.
une clef 512bits est logiquement inviolable car le moindre petit bit modifié genererer une clef totalement differente, on peu donc verifier d'une maniere fiable l'integrité d'un fichier (contaminé par un virus par exemple).

ici le md5 coupe le fichier en plusieurs morceaux de 64bits, puis il crée nouvelle clef a partir du dernier morceau lut.

[clef 1 = morceau 1] > [clef 2 = clef 1 + morceau 2] > [clef 3 = clef 2 + morceau 3] et ainsi de suite.
si un bit a été modifié quelque part, la clef finale serat totalement differente car MD5 est prevus pour faire de grand ecart pour des valeur proche.

exemple :

A  = $41   = 7fc56270e7a70fa81a5935b72eacbe29
B  = $42   = 9d5ed678fe57bcca610140957afab571
AB = $4142 = b86fc6b051f63d73de262d4c34e3a0a9

exemple concret : protéger des sauvegarde de jeux avec un tel systeme, pour eviter les cheats.

Commentaire de JulioDelphi le 30/10/2006 14:23:41 administrateur CS

je saisi pas encore tou, passons au concert :
1) je te donne un fichier "bonjour.exe" de 150ko, comment faire sa "somme" ?
2) si on veux verifier un fichier "contaminé par un virus par exemple", il faut auparavant avoir le MD5 du fichier non contaminé n'est ce pas ?

Commentaire de f0xi le 30/10/2006 14:39:25 administrateur CS

oui, par exemple tu scan tout tes fichiers et tu crée un base de donnée avec les clefs MD5 de chacuns.

il suffirat ensuite de comparer la clef sauvée et la nouvelle clef pour voir si le fichier a été modifié.

pour faire la somme du fichier bonjour.exe de 150Ko on utilise une routine qui permet de couper ces 150000 octets en plusieurs morceaux de 64 octets.
ensuite, on fait la somme MD5 de tout ces morceaux pour generé une clef finale, propre a ce fichier.

l'algorythme MD5 se passe en 3 temps : Initialisation, Mise a jours, Finalisation.

pour un fichier ou tout autre donnée longue ou courte, on commenceras pas initialisé la clef, puis on appeleras une ou plusieurs fois la mise a jours avec chaque bloc de 64 octets et enfin on appel la finalisation qui nous renvois la clef md5.

en pseudo code cela donne :

>>>
initialise( clef )
tant que LongeurBloc est superieur a 64
  prendre prochain bloc de 64 octet
  MetAJour( clef, Bloc[N] )
  decremente( LongeurBloc - 64 )
enfin
renvoyer resultat de finalise( clef )
<<<

sinon regarde le code du MD5Core et tu pourrat peut etre comprendre comment cela fonctionne.
mais c'est assé enorme. meme moi a mon niveau je ne pourrais pas expliquer tout le mecanisme d'un tel algorythme meme si j'en comprend le fonctionnement.

Commentaire de cirec le 25/11/2006 00:15:52 administrateur CS

Pour ceux que ça interesse voici un petit "plugin" qui se greffe au menu contextuel de l'explorer dans les propriétés il ajoute un onglet CheckSums et il est paramétrable :

http://www.earthmagic.org/?software

Rien à voir avec la programmation Delphi je vous l'accorde
c'est juste un utilitaire bien pratique pour contrôler rapidement un CRC16, CRC32, MD5, SHA1

les sources sont fournis avec mais c'est du C++  :(

voilà c'est tout
@+

Commentaire de altefcat le 23/11/2007 00:12:40

Bonsoir, j'ai un petit problème avec ton api pour générer le md5 d'un fichier.

En fait, le problème viens à mon avis d'un problème de mémoire ou de type trop petit pour contenir le nombre de bloc du fichier.

Si je fait un test avec un fichier de 0 à 800Mo, pas de problème, l'api me donne bien la string md5 du fichier. Par contre, quand j'éssaye de passer à un fichier de 3 ou 4 gb, j'ai une erreur. Le seul problème, c'est que mon IDE m'affiche le code assembleur et je n'y comprend rien.
Merci d'avance pour votre aide

Commentaire de maxjp le 10/04/2008 17:50:04

Bonjour,
J'ai bien chargé le code du MD5. Le cryptage d'un mot de passe semble marcher, mais comment à partir du code MD5, reconvertir vers le string d'origine (Delphi) pour être utilisé ?
En vous remerciant pour votre réponse.
Max

Commentaire de JulioDelphi le 10/04/2008 17:59:51 administrateur CS

MD5 n'est pas un cryptage, c'est un hachage, on reviens pas en arrière.

Commentaire de cirec le 10/04/2008 22:33:29 administrateur CS

et pour l'utilisation c'est simple :
tu sauvegardes le hachMD5 et quand l'utilisateur entre son mot de passe tu refais un hach et tu le compares avec celui que tu as sauvegardé

voilà c'est pas plus compliqué que ça :)

Commentaire de max_j le 11/04/2008 07:58:27

Merci beaucoup pour vos deux réponses.
A+
Max

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

algo du voyageur de commerce, tsp [ par skunz0311 ] salut,je cherche des informations sur l'algorithme du voyageur (dans une version simplifiée si possible. ou (encore mieux) le code source de ce dernie Crackme [ par neowa ] luvoila , je veut realiser un crackme , qui me permettra de develloper mes capacitée en delphi 6.je voudrait : un algo , qui prendrai la date sous cet Cryptage MD2 MD4 MD5 [ par MAsterC ] Bonjour à tous! J'ai Delphi 7 et Borland C++ Builder 6 puis dans le logiciel C++ de Borland dans l'onglet "Indy - Divers" il y a Les composant de Cryptage MD5 [ par Kruger ] Bonjour tous le monde, je suis en train de develloper une petite application sous delphi 6 entreprise dont une partie est "protégée" par un mots de p Algorithme Copier/Coller [ par ToTo 44 ] Bonjours à tous les développeursJe recherche un algo pour faire du copier/coller.Je travail avec une AdvStringGrid et je veux selectionner plusieurs c à l'aide, recherche d'algo de traitement d'images [ par czone29 ] Bonjour,je suis &#224; la recherche d'algorithmes de traitement d'images comme le plus proche voisin, l'interpolation bilin&#233;aire et la convolutio comprendre un algo delphi pour pouvoir le traduire dans un autre langage [ par trabice ] Messieurs dames bonjour !!je me permet de venir poster sur le forum delphi car je dispose d'un programme que je dois traduire dans un autre langage.(V 1344 Checksums !! [ par Balblas ] Salut,Voil&#224; mon probl&#232;me: j'ai un fichier bin qui contient 1344 packets dont chacun est de taille 1024 Ko et prot&#233;g&#233; par checksum Extraire un block qui contien des chaines de caractere [ par Napster ] salut  ,mon souçi dans cette example et d'extraire des block qui se separent par 88AA et pour calculer leur checksum le checksum  se calcule comme sui Calculateur de Block dans une Chaine de caractere [ par Napster ] salut , j'ai un petit souci a ce calculateur de CRC32 voila un extrait de ma source binaire : 55 AA 01 01 00 17 17 6C 01 73 29 34 21 15 5A 5A00 00 7F


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales