Algorithme de hash lea

Description

Bonjour,
voici un algorithme de hash (fait maison - donc c'est moi qui l'ait fait). Si vous ne le savez pas, le hashage est le principe de calculer, à partir de n'importe-quelle donnée, sa représentation numérique sur une taille fixée. Cette représentation doit être unique pour chaque donnée (théoriquement, mais c'est impossible en pratique, cependant on essaye de s'approcher ...).
Cet algorithme semble être plutôt pas mal, cependant, il faut savoir qu'il n'est sans doute pas aussi performant que le MD5 ou le SHA, mais qu'il constitue néanmoins un bon exemple de code sur plusieurs thèmes (pointeurs, buffers non typés, fichiers, etc ...)
Tout le code de l'algorithme est dans l'unité LEA.pas qui contient à la fois la fonction de hash principale (Hash), et d'autres fonctions destinées à vous simplifier la vie.

Les fonctions de l'unité sont donc :
- Hash : renvoie le hash d'un buffer non typé de taille prédéfinie.
- HashStr : renvoie le hash d'une chaîne de caractères : s'occupe de la mise en buffer.
- HashFile : renvoie le hash d'un fichier. Je me suis inspiré des blocs try..except de f0xi pour la gestion des erreurs d'ouverture. (dans sa source "MD5, le célèbre algorithme de hashage sous Delphi")
- HashToString : convertit un hash en chaîne.
- StringToHash : convertit une chaîne en hash.
- SameHash : compare deux hashs.
- Same : compare deux zones mémoire (à l'aide de leur hash).
- HashCrypt : crypte un hash.
- HashUncrypt : décrypte un hash.
- IsHash : vérifie si la chaîne passée en paramètre peut représenter un hash.

L'utilisation est très très simple : vous désirez obtenir le hash de votre nom ?
Chaine = HashToString(HashStr('Mon Nom'));
... d'un fichier ?
Chaine = HashToString(HashFile('C:\MonFichier.exe'));

(Remarque : les fonctions demandent une chaîne Unicode, transtypez en AnsiString ...)

Je me suis un peu inspiré de l'algorithme de hachage MD5 tel que f0xi le proposait, en reprenant certains éléments tels le mixage des valeurs, et l'incrémentation de ces dernières.

Voici des exemples de hash, pour vous montrer (en 128 bits) :
'' : 448AE82151C2390D915975B85E82E55A
'a' : 51DC7528162920BBAF20356D6BD47261
'A' : E4F28E564F7413EE97C97335FEEA8B8F
'b' : CAE7528B15F6489621483551E4DF4FC4
'Hash' : 998B2CF4AD7ACA7CDBCD22A6B3832A2D
'f0xi' : CB8BBF8F80A75618CF803C4FE583BCC8
'Bact' : 79EA35A068C853F7491956E793E232D9
'Delphi' : 51555BAF5AB7B7C8A97A57BB6B4D58E8

Je fournis donc 2 applications exemples :
- File Example : sélectionnez un ou plusieurs fichiers, l'application vous calculera son hash, et vous dira sa taille et le temps mis pour calculer le hash, afin de comparer (l'unité Counters.pas est utilisée pour calculer précisément le temps). On travaille toujours en 128 bits.
- Example : un aperçu global des fonctionnalités de l'algorithme de hash, avec six pages : accueil, mots de passe, brute-force, fichiers, test de collisions et performances. On travaille toujours en 128 bits.

Bref, je vous laisse lire l'unité !

NEW : A présent on peut choisir le nombre de bits sur lequel on travaille (c'est très bête en fait, on fait tout en 512 bits et on prend juste les bits qui nous intéressent). Pour modifier le nombre de bits sur lequel on travaille, il suffit de modifier la variable LEASize (elle est à 128 par défaut). Vous pouvez la modifier n'importe-quand.

Source / Exemple :


// In the zip

Conclusion :


Voilà, tous commentaires, critiques, conseils, remarques ...

Fait sous Delphi 6 Personal Edition.

Cordialement, Bacterius !

PS : j'ai hésité pour la catégorie, j'ai opté pour Math car la section API ne marche pas (il semble qu'il y ait une petite erreur dans les index ^^)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.