begin process at 2012 02 05 01:37:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > ALGORITHME DE HASH LEA

ALGORITHME DE HASH LEA


 Information sur la source

Note :
8 / 10 - par 3 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Classé sous :algorithme, hash, LEA, cryptographie, sécurité Niveau :Initié Date de création :24/05/2009 Date de mise à jour :06/08/2009 23:21:54 Vu / téléchargé :5 216 / 408

Auteur : Bacterius

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

 Description

Cliquez pour voir la capture en taille normale
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'));

(Rem arque : 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.


 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 ^^)

 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

24 mai 2009 13:12:57 :
// Oublié de parler des exemples
24 mai 2009 20:46:27 :
// Oubli de la fonction StringToHash dans la description.
25 mai 2009 21:14:36 :
// Ajout de l'exemple Password Example 2
25 mai 2009 21:22:01 :
// Amélioration de la fonction HashStr.
27 mai 2009 14:14:07 :
// Détection d'une collision (vmmreg32.dll et twunk_16.exe)
27 mai 2009 14:30:27 :
// Correction de Cantador : le hashage est de 16 octets et non pas 32.
27 mai 2009 14:30:31 :
// Correction de Cantador : le hashage est de 16 octets et non pas 32.
27 mai 2009 14:30:45 :
// Correction de Cantador : le hashage est de 16 octets et non pas 32.
27 mai 2009 22:15:35 :
// Nouvelle capture, plus stylée.
27 mai 2009 22:56:22 :
// Tri des hashs dans File Example.
27 mai 2009 22:58:31 :
// Modification description.
28 mai 2009 21:18:38 :
// Nouvel exemple.
03 juin 2009 20:50:55 :
// Modification des exemples (fusion des 2 exemples Password Example et Global Example en un "Example" plus complet et plus sympa ^^
04 juin 2009 17:45:15 :
// Mauvais codage de la récursivité du brute-force, corrigé.
05 juin 2009 17:02:01 :
// Mise à jour pour la compatilibité Unicode, merci à Cirec !
06 juin 2009 16:42:41 :
// Ajout du test de collisions.
06 juin 2009 17:47:40 :
// Petite étourderie de libération de mémoire.
07 juin 2009 11:28:09 :
// Gestion des Int64 dans le test de collisions, et possibilité de voir le nombre de collisions trouvées jusqu'à maintenant lorsqu'on arrête le test (plutôt que d'attendre une fin improbable lol)
16 juin 2009 16:46:37 :
// Ajout d'une documentation et ajout fonction pour comparer deux espaces mémoire.
17 juin 2009 10:47:41 :
// Ajout de la documentation française
17 juin 2009 12:10:51 :
// Meilleur algorithme "Test de collisions"
12 juillet 2009 18:02:02 :
// Changement de l'algorithme : traitement par blocs de 512 bits.
13 juillet 2009 10:19:32 :
// Mini-modification de l'algorithme pour le rendre plus résistant aux collisions.
13 juillet 2009 10:44:19 :
// Mise à jour documentation.
16 juillet 2009 20:27:23 :
// Modification de l'algorithme (+ de sécurité) et de la documentation. Ajout d'un callback et application de cet ajout dans l'exemple global.
16 juillet 2009 20:30:39 :
// Pas mis à jour la description.
19 juillet 2009 03:16:51 :
Grosse mise à jour de LEA.
20 juillet 2009 20:00:29 :
// Quelques modifications mineures ...
24 juillet 2009 14:30:52 :
// Voir commentaire ...
24 juillet 2009 22:52:07 :
// Mise à jour de la description.
02 août 2009 21:26:44 :
// Grosse faille de sécurité
05 août 2009 18:01:04 :
// Dernière modification.
05 août 2009 23:53:50 :
// Petit bug
06 août 2009 23:21:55 :
// Amélioration des performances

 Sources du même auteur

Source avec Zip Source avec une capture RAYTRACING EN DELPHI (PROGRESSIVE PATH TRACING)
Source avec Zip Source avec une capture MOTEUR PHYSIQUE 2D CHIPMUNK.. EN DELPHI!
Source avec Zip Source avec une capture DOWNSAMPLING OU COMMENT BIEN OPTIMISER LE CODE
Source avec Zip Source avec une capture FACTORISATION ET TEST DE PRIMALITÉ 32 BITS ULTRA OPTIMISÉ
Source avec Zip LECTEUR DE FICHIER MULTIMÉDIA RIFF

 Sources de la même categorie

Source avec Zip Source avec une capture RESOLUTION EQUATIONS DEGRE "N" + CALCULETTE SCIENTIFIQUE par pseudo3
Source avec Zip DEUX BIBLIOTHÈQUES POUR CALCULER AVEC DES ENTIERS TRÈS GRAND... par Rekin85
Source avec Zip Source avec une capture MOTEUR PHYSIQUE 2D CHIPMUNK.. EN DELPHI! par Bacterius
Source avec Zip Source avec une capture TABLEAU DE KARNAUGH par ADMR
Source avec Zip Source avec une capture FILTRAGE NUMÉRIQUE IIR par Pouillerot

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PAQUES 1.0.0 par Christophe67
Source avec Zip OBTENIR LE PROPRIÉTAIRE D'UN FICHIER (WIN32;NTFS) par ILP
Source avec Zip Source avec une capture LEA EN MODE CHIFFREMENT (SEA) par Bacterius
Source avec Zip Source avec une capture GÉNÉRATEUR DE NOMBRES PSEUDO-ALÉATOIRES par Bacterius
Source avec Zip ALGORITHME BRUTEFORCE: ÉNUMÈRE TOUTE LES POSSIBILITÉS D'UN E... par retaks666

Commentaires et avis

Commentaire de djmmix le 24/05/2009 16:53:44

hello  Bactérius,

ta source m'a l'air très intéressante :)

je vais regardé sa de plus près merci ^^

Commentaire de Bacterius le 24/05/2009 20:09:01

Je t'en prie Djmmix ! Si tu as des remarques, même négatives, n'hésite pas !

Cordialement, Bacterius !

Commentaire de Bacterius le 24/05/2009 21:25:02

La prochaine étape sera peut-être d'ajouter une variable "Bits" qui contiendra le nombre de bits du hash (128, 256, 512, 1024 ...). Rien de très compliqué, il faudra juste agrandir un peu la table HashTable, et remplacer les A, B, C, D du THash par un array [0..(Bits - 1) div 32] of Longword;
Je ne mets pas à jour encore à cause des exemples qu'il faudrait refaire ... on verra mercredi prochain.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/05/2009 21:16:26

Non en fait c'est une mauvaise idée de faire le changement cité plus haut, je ferai des unités séparées pour le 256 et le 512 (si ils viennent).
J'ai sinon ajouté un nouvel exemple, voyez la description.

Cordialement, Bacterius !

Commentaire de Bacterius le 25/05/2009 21:23:28

J'ai également corrigé la fonction HashStr : plutôt que de mettre inutilement en buffer (perte de temps gigantesque, et aussi de mémoire), je passe directement un pointeur sur la chaîne, ça va plus vite et c'est plus élégant.

Cordialement, Bacterius !

Commentaire de cantador le 27/05/2009 14:13:26 administrateur CS

cet algorithme va réduire........
...........(de taille fixe : 32 octets).

Hachage    <---- de 128 bits, c'est la réunion de W, X, Y et Z (32 bits chacun)

?

Commentaire de Bacterius le 27/05/2009 14:16:04

@Cantador : Ben oui : 32 octets <=> 128 bits ? Je me suis peut-être trompé, je vais voir.

J'ai fait une MAJ, j'ai détecté une collision graçe à mon flair : vmmreg32.dll et twunk_16.exe dans le dossier Windows. Pas la même taille, ni la même info, mais hash identique. J'ai légérement modifié l'algorithme, la collision a été écartée, mais j'en redoute d'autres ...

Cordialement, Bacterius !

Commentaire de Bacterius le 27/05/2009 14:22:12

Oh la la oui je me suis trompé ... il y a un grave problème de logique, mais je ne vois pas où ...

Cordialement, Bacterius !

Commentaire de Bacterius le 27/05/2009 14:23:29

Effectivement, c'est un hachage de 16 octets, merci Cantador :) je mets à jour.

Cordialement, Bacterius !

Commentaire de cantador le 27/05/2009 14:25:34 administrateur CS

Je suppose que dans la maj tu as fait varier le polynome $3E8A42F7 ?

Commentaire de Bacterius le 27/05/2009 14:32:10

Euh non je n'ai pas fait varier le polynome, ni la table, j'ai juste changé le "and" en "or" dans les mixages. Mais ça pourrait être une bonne idée de faire varier le polynome. Je remets la main sur le code qui me calcule ça et je le garde précieusement.

Cordialement, Bacterius !

Commentaire de cantador le 27/05/2009 14:37:35 administrateur CS

bon la note hummhhhh...
voyons voir..

(16*7 - 32*7) / power(7,2) = -2,28

aie !

Commentaire de Bacterius le 27/05/2009 14:48:26

Evidemment si tu mets le numérateur négatif, et que le dénominateur est toujours positif (c'est un carré), ça donnera forcément un nombre négatif ... lol

Cordialement, Bacterius !

Commentaire de cantador le 27/05/2009 14:54:47 administrateur CS 8/10

hem..j'ai du faire une erreur...
8/10 pour cette belle source.

Commentaire de Bacterius le 27/05/2009 15:30:21

lol
Mais dis-moi, j'ai l'impression que Delphi va se compliquer la vie quand il assemble mon algorithme (avec les Inc, xor, and, etc ...). Peut-être serait-il plus rapide de l'écrire directement en assembleur ? Quand je regarde la fenêtre "CPU", Delphi fait un code pas possible pour une addition, un xor et un or ...

Cordialement, Bacterius !

Commentaire de cantador le 27/05/2009 16:03:58 administrateur CS

J'utilise très peu ASM..
Il faudrait poser la question sur le forum en question ou à f0xi.
Il semble néanmoins que certains calculs gagnent en vitesse à être écrits directement en assembleur.
A chaque fois, il faut faire la part entre le gain en vitesse, la complexité et/ou la maintenance du code.

Commentaire de Bacterius le 27/05/2009 17:38:30

Moi aussi j'utilise très peu d'ASM, je ne sais d'ailleurs pas coder en asm, je tâtonne encore, mais ça commence à venir. J'avais fait un test en asm de la 1ere partie de l'algorithme (avant les Inc, le mixage), mais je recevais à chaque fois une violation d'accès dans les Inc suivant l'asm, je pense que je me suis trompé entre la variable et le pointeur (j'ai peut-être incrémenté l'adresse lol).

Cordialement, Bacterius !

Commentaire de Bacterius le 27/05/2009 23:00:33

Bon petite MAJ afin de trier la liste des fichiers hashés, c'est surtout pour mon usage afin de détecter des collisions (je prends des fichiers dans ma machine - il y a de tout dans le cache internet). C'est peut-être un poil moins logique qu'avant, mais bon ça m'aide.

Cordialement, Bacterius !

Commentaire de jeffray03 le 02/06/2009 09:46:15

Salut, une petite Question, pourquoi le code ne fonctionne pas avec Delphi 2009?
est ce un probleme de compatibilité?
Merci

Commentaire de djmmix le 02/06/2009 11:26:15 10/10

j'ai delphi 2009 je peut te dire que le code marche très bien :)

pour le bruteforce j'aurai codé la parti du bruteforçage en asm ( plus rapide ^^ ) même si delphi fait un code un peut près propre ^^ (quand il réalise pas trop de call partout :p )

j'ai tester sous delphi 6 et 2009 aucun soucis rencontré très bonne source :)

Commentaire de djmmix le 02/06/2009 11:31:39

@bactérius:"Delphi va se compliquer la vie quand il assemble mon algorithme (avec les Inc, xor, and, etc ...). "

pas tellement en faite le code asm réaliser genre b:= a xor c fera en asm compiler xor eax,edx (enfin j ai prit les registre entier sa aurai pu etre un byte etc mais sa serai trop technique ^^ ou même d'autre registre ) apres la valeur de eax peut etre mi soit dans une adresse mémoire ou utiliser pour les instruction suivant donc de ce coté delphi s'en sort pas trop mal pour le code compiler ^^

Commentaire de jeffray03 le 02/06/2009 11:36:33

la il ya donc un probleme chez moi, lorsque j´utilise delphi 7, et que je donne le code a hasher '1234', et apres j´appelle le bruteforçage, il me donne les '1234' que j´ai mis auparavant.
mais avec delphi2009 il me donne '1200'.
car j´utilise bien delphi 7 et delphi 2009.

Commentaire de Bacterius le 02/06/2009 18:23:38

@Djmmix : merci pour l'info :p je suis encore newbie en asm ...

@Jeffray : Etrange, indeed ... un algorithme de hash se doit déterministe. Pourrais-tu m'indiquer (en commentaire de la source ou en mp) les hashs des chaînes suivantes précisant si c'est sous Delphi 7 ou Delphi 2009 ? Normalement, il n'y a rien de bien exotique ...
Voici les chaîne à vérifier :

[chaîne nulle : #0]
'1234'
'1200'
A tester sous les 2 compilateurs chacun.

Cordialement, Bacterius !

PS : pour le brute-force, vous ne devrez pas mettre trop de temps pour 4 caractères, mon PC me fait du 1 million de passes par seconde, et il est pas à son max.

Commentaire de jeffray03 le 03/06/2009 01:09:54

c´est sous Delphi 2009 que cela ne marche pas.
avec delphi 7 cela marche tres bien.
je m´excuse de n´etre pas ete plus clair

Commentaire de Bacterius le 03/06/2009 13:07:45

Oui ben j'ai compris, je te demande les hashs sous Delphi 7 ET sous Delphi 2009.
Merci.

Cordialement, Bacterius !

Commentaire de Bacterius le 03/06/2009 20:52:35

Voilà, nouvel exemple, une sorte de mélange entre Password Example et Global Example ... Voir description de la source, j'ai mis à jour.
Sinon, petite nouveauté, j'avais besoin d'une barre de progression à état indéfini (pour le brute-force), j'ai donc créé un composant qui surcharge le composant TProgressBar existant. Rien de très compliqué ...

Cordialement, Bacterius !

Commentaire de jeffray03 le 04/06/2009 12:10:52

pour les hashs, je n´ai que compilé l´exemple que tu as posté. rien de plus et il utilise

Z := #0;
dans les 2 cas.

Commentaire de Bacterius le 04/06/2009 17:01:42

Peu importe l'exemple que tu as compilé, c'est le code de l'unité LEA_Hash qui est important.
Je voudrais que tu fasses les démarches suivantes pour essayer de nous aider à comprendre pourquoi le code généré par D7 et D2009 n'est pas le même, car cela nous intéresse autant que ça t'énerve.
Voici ce que je te demande de faire :

1. Compiler (a partir de Delphi 7) et lancer un exemple qui puisse donner le hash d'une suite de caractères.

2. Copier le hash de la chaîne de caractères '1200' sans les guillements dans le bloc-notes. Indiquer sous quel compilateur le hash a été obtenu.

3. Copier le hash de la chaîne de caractères '1234' sans les guillements dans le bloc-notes. Indiquer sous quel compilateur le hash a été obtenu.

4. Copier le hash de la chaîne de caractères nulle (rien dans la boîte de saisie) dans le bloc-notes. Indiquer sous quel compilateur le hash a été obtenu.

5. Répéter les étapes 1 à 4 en utilisant Delphi 2009 comme compilateur.

6. Copier le contenu du bloc-notes dans un nouveau commentaire à ma source (ou envoie-moi un message privé).

7. C'est fini ! Cela devrait nous aider à voir le problème.

Cordialement, Bacterius !

Commentaire de Bacterius le 04/06/2009 17:46:56

Bon j'ai remarqué un sérieux problème de codage dans la fonction récursive de brute-force "Search". En effet, l'algorithme de récursivité redémarrait à 0 pour chaque nouvelle longueur, d'où une perte importante de temps. Le nouvel algorithme corrige tout ça (mdp de 3 caractères passe de 1m30 à 10 secondes environ). Mais on peut encore mieux faire ...

Cordialement, Bacterius !

Commentaire de djmmix le 04/06/2009 18:53:31

salut bactérius,

je c'est pas si dans delphi 7 l'unicode est implanter mais les string sous delphi 6 son en ascii et sur delphi 2009 il sont en unicode sa a peut-être un impact j'ai développer des application porté de delphi 6 a 2009 il a fallut pour mon code asm faire une amélioration du a sa, je suis pas sur je vais testé sa et je te tien au parfum ^^

pas mal ta mise a jours pour le brute :) de 1m30s a 10 s c'est énorme ^^

Commentaire de Bacterius le 05/06/2009 09:28:22

Effectivement cela peut avoir son importance. Mais il est plus qu'improbable qu'un passage en unicode transforme le hash de '1234' en hash de '1200', unicode ou non ... Les chances sont extrêmement minces ... Mais pourquoi pas ?

Cordialement, Bacterius !

Commentaire de jeffray03 le 05/06/2009 10:40:46

salut suite a ta demande, j´ai effectué quelque test:
voici ce que cela donne :
avec delphi 2009:
1234  ==> 734458EE8614FA84139A58B361741A8E
1200  ==> 734458EE8614FA84139A58B361741A8E
avec delphi 7
1234  ==> 523B512BD263691E444B741A78627A42
1200  ==> CC25D7BB10B9F10377EEB059CB64CCFD
je crois kil ya un problem avec le string declaré, je vais essayer de mettre les string  en AnsiString.
je crois que c´est de la que vient le probleme.
  

Commentaire de cirec le 05/06/2009 14:17:04 administrateur CS

j'ai un code qui fonctionne pour D7 ET D2009
je te l'envoie par mail ... surveilles ta boite ;)

et en effet il faut modifier quelques types:

string > ansistring
PChar > PAnsiChar
Char > AnsiChar

etc. etc. sinon on est en Unicode "WideString"
plus encore quelques conversions explicites pour faire taire les messages du compilateur ^^;

j'ai pas fait dans la finesse ... j'ai modifié tout le code ... mais en prenant un peut de temps et en utilisant les directives de compilations et la nouvelle unité mise à disposition par D2009 "AnsiString.pas" ont peu produire un code plus simple et plus "propre" pour les "toutes" les versions de Delphi

ps: par défaut D2009 est en Unicode.

Commentaire de jeffray03 le 05/06/2009 14:35:36

Merci, j´attend.

Commentaire de Bacterius le 05/06/2009 16:49:28

Je vais mettre tout ça à jour. Puisque Cirec a modifié l'exemple Global Example qui n'existe plus, je vais adapter le code de la même façon pour le nouvel exemple. Je m'y mets ... Merci Cirec je me disais bien que c'était un problème d'unicode.

Cordialement, Bacterius !

Commentaire de Bacterius le 05/06/2009 17:04:01

Bon voilà Jeffray03, essaye maintenant, ça devrait marcher. Avec la version Unicode, j'obtiens 2 hashs différents pour '1200' et '1234'.
Merci Cirec, j'ai reproduit l'exemple que tu m'as donné, dans les sources mises à jour, comme mesure intermédiaire. Mais je suis d'accord, je pense qu'il doit y avoir un moyen d'éviter 2 transtypages à chaque hash ...

Cordialement, Bacterius !

Commentaire de Bacterius le 06/06/2009 16:48:11

Tada ! Nouvelle option dans l'exemple n°2, le test de collisions ! J'ai eu cette idée il y a quelques minutes, j'ai donc décidé de la mettre en oeuvre. Elle a pour but de détecter des collisions de hash.
Il part d'un principe fondamental du hash : que pour chaque donnée x, aucune autre donnée ne peut avoir le même hash que la donnée x (en théorie).
On va donc partir d'une chaîne de base (on part de la chaîne nulle par convention), puis on va hasher la représentation textuelle de ce hash. On va alors obtenir un autre hash, qui est normalement unique (puisque le hash de la chaîne nulle est unique). On va répéter l'opération un certain nombre de fois.
Voilà pour la théorie. En pratique, on va faire ça avec une liste de chaînes, à l'aide d'une boucle. On va interdire l'ajout des doublons dans la liste de chaînes. A la fin, on va comparer le nombre de chaînes dans la liste avec le nombre de fois que l'on devait répéter l'opération. On saura alors s'il y avait eu des doublons ou non (en comparant ces deux nombres).
Voilà, c'est très simple et malgré tout très efficace (du point de vue de la méthode : en performance, il y a beaucoup mieux à faire, j'ai fait ça rapidement, il y aura sans doute une amélioration pour la performance).

Cordialement, Bacterius !

Commentaire de jeffray03 le 07/06/2009 00:18:33

super!!!
ca marche nikel

Commentaire de djmmix le 07/06/2009 18:05:10

ha je savais bien que c'était un problème d'unicode :p

merci pour la mise a jour CIREC et Bactérius :)

have you fun

Commentaire de Bacterius le 07/06/2009 19:27:07

Ouais.
Mais c'est tout de même étrange que les chaînes '1234' et '1200' (en unicode) soient équivalentes (en ascii) ...

Cordialement, Bacterius !

Commentaire de debiars87 le 15/06/2009 15:55:05

Trop d'explication pour rien detout !!
Donc un peu de réalisme Bacterius !!
Debiars87

Commentaire de Bacterius le 15/06/2009 15:58:17

Pardon ? Explique-toi Debiars87 ... qu'entends-tu par "rien du tout" ? J'ai bossé sur ce projet, alors explique-toi merci.

Cordialement, Bacterius !

Commentaire de Bacterius le 15/06/2009 16:01:34

Ah en passant, merci pour la note, ça fait plaisir ;) Tu t'es jamais demandé pourquoi, au bac, les professeurs sont tenus de justifier un 0 ou un 20 ? Justifie la note que tu as attribuée à ma source, mais de façon claire et ordonnée merci. Je suis pas dans ta tête.

Cordialement, Bacterius !

Commentaire de debiars87 le 15/06/2009 16:10:32

Ok cher Bactérius
Trop de code pour une application simple
parceque j'ai trouvé mieux sur internet dans le plus grand site de code source
"Source FORGE "  excuser moi pour la PUB
à bientot
Debiars Junior,

Commentaire de debiars87 le 15/06/2009 16:15:49

Mais je trouve ça un bonne tentative
Ah pardon pour la note!!
je crois que je suis tromper de touche je voulais mettre 6/10
Je sais que tu n'aime pas les mauvaises notes lol
alors aider moi à rectifier la note avec tes connaissances avec Les ADMINS
hhhh
Debiars Junior,

Commentaire de Bacterius le 15/06/2009 16:16:21

Ok cher Debiars87, ici on est pas là pour faire que nos codes soient utilisés partout, on est ici pour apprendre. Alors j'ai mis un maximum d'exemples et de commentaires pour bien détailler ce que j'ai fait, pour que vous compreniez mon raisonnement. Et puis si tu as trouvé mieux, très bien, alors va le télécharger et ne regarde même pas mon code ;) ça n'en vaut pas la peine n'est-ce pas ? Et puis tant qu'à faire, allez, pour l'em...bêter, autant mettre une sale note :D
Ah bravo ...

Cordialement, Bacterius !

Commentaire de Bacterius le 15/06/2009 16:18:45

Hmm ... j'ai écrit mon message avant de voir ton 2eme commentaire. Vivement une actualisation automatique ...
Les mauvaises notes je m'en fiche, mais je préfère (comme tout le monde) en avoir des bonnes, et ce que je préfère avant tout c'est que les gens justifient leur note ...

Cordialement, Bacterius !

PS : je ne fais pas dans le web-designing, je ne suis pas un admin, je ne peux rien faire pour ta note. Mais ça sera peut-être rectifié si un admin passe par là.

Commentaire de debiars87 le 15/06/2009 16:27:35

Meme si tu n'aime le C++ je te conseil vivement de jetter un coup d'oeil la dessus
www.cppfrance.com/codes/ALGORITHME-FORCE-BRUTE-HASH-MD5_44190.aspx
Very simple Bacterius
Tu va vite accepter ma note je veux dire 6/10
franchement du n'importe quoi
DEBIARS JUNIOR

Commentaire de Bacterius le 15/06/2009 16:30:37

Je ne me suis pas penché sur le brute-force, mon cher. L'intérêt principal de la source était ... l'algorithme. Je ne sais pas si tu as remarqué mais on est pas en MD5 là ...

Cordialement, Bacterius !

Commentaire de debiars87 le 15/06/2009 16:37:10

Excuse moi pour le dérangement alors..
Merci pour ton attention
à bientôt
Debiars Junior

Commentaire de Bacterius le 15/06/2009 16:42:46

Non mais développe tes arguments ! Je suis désolé mais pour l'instant je ne comprends pas très bien pourquoi tu viens critiquer ... tu me renvoies sur une source traitant de brute-force. Très bien ... je pense que tu as quelque chose à reprocher à mon brute-force : je te le concède, il n'est pas terrible. Mais sois explicite ! Tu ne développes aucune de tes remarques ... je ne suis pas devin encore une fois !

Cordialement, Bacterius !

Commentaire de cantador le 15/06/2009 16:45:05 administrateur CS

hou là là c'est chaud..
En tous cas, même si le résultat n'est peut-être pas celui attendu par certains on peut féliciter Bacterius pour son opiniatreté sachant aussi resté à l'écoute des autres.

un exemple à suivre..

cantador

Commentaire de debiars87 le 15/06/2009 16:57:11 6/10

6/10

Commentaire de debiars87 le 15/06/2009 16:59:34

Un exemple à suivre et à imiter dans la façon à programmer
Hein CONTADOR !!

DEBIARS JUNIOR,

Commentaire de Bacterius le 15/06/2009 17:00:48

Contador lol
Il sort souvent celui-là ^^

Cordialement, Bacterius !

Commentaire de cirec le 15/06/2009 17:00:56 administrateur CS

@Debiars87:
La critique (constructive) sous-entend un minimum de connaissance et de compréhension du sujet et du code ...
à bon entendeur ...

Commentaire de debiars87 le 15/06/2009 17:02:56

ta raison ADMIN
DeBiars JUNIOR

Commentaire de Bacterius le 16/06/2009 16:48:22

Bon, nouvelle mise à jour : ajout d'une fonction qui compare deux zones mémoire (c'est rapide et efficace, car il effectue le hash des deux zones mémoire et compare ces derniers), cela peut être pratique pour comparer rapidement deux tableaux de données par exemple. Et une documentation complète de l'algorithme, uniquement en anglais pour l'instant (la version française viendra un peu plus tard).

Cordialement, Bacterius !

Commentaire de debiars87 le 17/06/2009 09:00:10

Je veux dire Exellent Amélioration bravo !!
Debiars Junior

Commentaire de Bacterius le 12/07/2009 18:07:43

Attention attention : mise à jour de l'algorithme. Désormais, il travaille sur des blocs de 512 bits. Ainsi l'on introduit une nouvelle notion : le "padding" ou remplissage. De la même façon que la plupart des fonctions de hash, l'on adapte la taille de la donnée en ajoutant à la fin un bit à 1 (donc un octet de valeur 128), puis en ajoutant autant de bits à 0 qu'il faut pour obtenir une taille multiple de 512 bits. J'ai également changé la table de hashage pour la rendre compatible avec le nouvel algorithme qui est totalement différent, donc j'ai aussi changé le polynome. Pas de bugs connus.
Une autre nouveauté : les fonctions de cryptage/décryptage des hashages sont mises à jour : à présent ce n'est plus une clef polynumérique mais une clef binaire (par exemple, si le premier bit est à 1, le premier caractère du hash est incrémenté, sinon il est décrémenté). Le cryptage des hashs permet de les envoyer sur un canal non sécurisé (cependant il faut se mettre d'accord sur la clef sur un canal sécurisé au préalable).

Cordialement, Bacterius !

Commentaire de Bacterius le 16/07/2009 20:33:28

Encore des nouveautés, à présent l'on a un Callback, qui est appelé à chaque bloc du message traité ! (Cependant pensez à ne traiter que quelques callbacks, sinon le traitement prendra un temps fou : j'opte pour ma part pour un traitement de 1 callback sur 32768).
De plus, l'algorithme a été renforcé cryptographiquement parlant : effectivement, la version précédente resistait difficilement à une attaque par préimage, d'après certains tests concluants). Pour finir, les documentations ont totalement été remises à jour, et la table de hashage (contenant les 64 valeurs) n'existe plus, devenant totalement obsolète avec cette nouvelle version.

Cordialement, Bacterius !

Commentaire de Bacterius le 19/07/2009 03:18:05

Enorme mise à jour (voir dernière partie de la description). En revanche, je n'ai pas mis à jour la doc. (trop de boulot, faut tout refaire quoi, puisque le concept change radicalement).

Cordialement, Bacterius !

Commentaire de Bacterius le 24/07/2009 14:32:34

Bon alors encore du nouveau : la table de hashage refait son apparition :D
En effet après une petite analyse, j'ai remarqué que les hashages ne changeaient pas beaucoup dans certaines conditions, donc j'ai réintroduit les tables de hashage (associées à un nouveau concept ...). Je pense qu'il s'agira de la dernière modification de l'algorithme en lui-même ...

Cordialement, Bacterius !

Commentaire de Bacterius le 02/08/2009 21:29:54

Modification importante, changement total de l'algorithme. En effet, j'ai trop négligé l'aspect "bits" en me penchant trop sur l'aspect "octet". Bref, un effet d'avalanche totalement raté, voire des collisions à la demande. C'est normalement corrigé, et j'ai repassé tous les tests. J'espère bien que c'est fini ...

Cordialement, Bacterius !

Commentaire de djmmix le 03/08/2009 12:06:16

salut Bacterius,

je vais étudié sa de près :)

merci pour tout tes éfforts pour cet algo  :)

Commentaire de Bacterius le 03/08/2009 12:22:44

De rien, content que ça te plaise. Je veux être cryptologue plus tard et j'ai fait cet algorithme avec mes compétences de lycéen ( :'/ ) en ayant lu plein de cours sur la cryptologie.

Cordialement, Bacterius !

Commentaire de Bacterius le 05/08/2009 18:20:45

Attention : la dernière modification (j'espère). Voici ce qu'elle apporte :

- un nouveau logo (lol)
- une modification des fonctions HashCrypt et HashUncrypt : elles travaillent à présent directement sur l'objet THash et non pas sur sa représentation en chaîne. C'est plus rapide et plus efficace (la clef peut être n'importe-quoi, car on calcule son hash, puis on additionne les deux hashs pour crypter et on soustrait pour décrypter). Au fait, dans la dernière version de ces fonctions, un bug s'est glissé ...
- petite erreur au niveau de l'algorithme (l'avant-avant-dernier double-mot du hash (Hash[$D]) était constant dû à une petite erreur d'inattention.

Pour ceux que ça intéresse, les caractéristiques cryptographiques de l'algorithme (certaines) :

- blocs de 512 bits
- 16 rondes par bloc
- une fonction F, qui est appellée 256 fois par bloc, qui prend en paramètre quatre entiers, ainsi qu'une valeur entre 1 et 4, et qui retourne un seul entier. Elle effectue quatre types d'opérations différentes (selon la valeur du dernier paramètre), en utilisant les quatres premiers paramètres).
- une "expansion" de chaque entier du bloc : en effet, pour chaque ronde - donc pour chaque entier 32 bits du bloc en cours, on sépare les quatre octets de cet entier, puis on associe à chaque octet une valeur sur 32 bits (voir tableau HashTable). Cela permet de créer un effet d'avalanche intéressant du point de vue mathématique.
- une recalculation des tableaux en constante (HashInit et HashTable), à partir de nombres premiers. En effet :
* le tableau HashInit est basé sur le calcul suivant : prenons un grand nombre premier ($96438AF7 pour ce tableau). Imaginons un tableau Prime, de 16 éléments (0..15), contenant les 16 premiers nombres premiers (en partant de 2 inclus). Alors on a le calcul suivant :
  HashInit[0] = $96438AF7 * Primes[0];
  pour I = 1 à 15 faire HashInit[I] = ($96438AF7 * Primes[I]) + ($96438AF7 mod Primes[I]);

* pour le tableau HashTable, c'est la même chose, sauf qu'on se base sur le nombre premier $1C8CFBFF, et que les tableaux HashTable et Prime contiennent 256 éléments.

- lors des 16 rondes de chaque bloc, les seize entiers du hash sont mélangés dans tous les sens, je ne saurais vous décrire ce qu'ils doivent endurer à chaque ronde :'( .... lol
______________________

Et voilà, je pense que c'est fini, sauf si l'on trouve des bugs ;-)
Bonne chance pour étudier ça, Djmmix, le coup de l'expansion du bloc est plus que pénible à cryptanalyser ... ;-)

Cordialement, Bacterius !

Commentaire de Bacterius le 06/08/2009 23:23:53

Vite fait, une amélioration des performances. Du côté mathématique ça ne change absolument rien, mais plutôt que de concentrer la fonction F cryptographique en une seule fonction, on la sépare en quatre fonctions E, F, G et H. Ca permet d'éviter 256 "case..of" par bloc ...

Cordialement, Bacterius !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

cryptographie [ par tarik ] je voudrais avoir le composant qui permet de hacher( SHA ) avec un exemple si c'est possiblemerci algorithme genetique code source [ par nana ] je cherche le code source et le programme d'un algorithme génétique pour le problème de TSP ( de préférence en pascal, delphi, fortran sinon autres la Clef pour sécurité de l'écran de veille ??? [ par damanix ] Hello tout le monde Je cherche à détecter si l'écran de veille est sécurisé ou pas, et pour ça je regarde la clef dans la base, mais alors que pour mo algorithme du temp [ par intello2001 ] je voudrai savoir coment trouver la date a lakel leure passe a lhiver et inversemerci recherche algorithme pour calcul de clé logicielle [ par tao ] Je suis en train de créer un permettant la création d'édition. Ce logicielle intégre la notion de droit utilisateur. Je souhaite créer un menu permett Sécurité [ par ssad ] je veux connaitre les ports ouverts sur ma machineet comment je peux fermer des connexions des serveurs listning ou estabeshed sur ma machine 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 Algorithme Mot Caché [ par nuns ] Salut tout le monde, Je suis vraiment desolé mais j ai fait une fausse manipe,Et je suis vraiment desoler pour reposer la meme question alors je la re Erreur de sécurité .net [ par grumli ] Bonjour, le lancement de mon appli g&#233;n&#233;re deux erreurs, la premi&#232;re "Echec de la demande pour une autorisation de type System.Securit


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

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 : 1,108 sec (4)

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