begin process at 2010 02 10 12:50:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité

 > RSA DATA SECURITY, INC.: AN MD5 RECOVERY TOOL BASED ON BRUTE FORCE METHOD AND DICTIONNARIES

RSA DATA SECURITY, INC.: AN MD5 RECOVERY TOOL BASED ON BRUTE FORCE METHOD AND DICTIONNARIES


 Information sur la source

Note :
9,86 / 10 - par 7 personnes
9,86 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Sécurité Classé sous :rsa, md5, bruteforce, dictionnaire, hashage Niveau :Expert Date de création :09/04/2005 Date de mise à jour :17/12/2005 16:05:00 Vu / téléchargé :16 898 / 1 952

Auteur : grandvizir

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

 Description

Cliquez pour voir la capture en taille normale
Décryptage des empreintes MD5 à 565 000 passes par seconde. Exercice d'algorithmie pure pour protéger ses informations personnelles dans le cadre privé, car c'est la seule utilisation utile de ce code source.

This software uses the «RSA Data Security, Inc. MD5 Message-Digest Algorithm»

==============================
1? Pourquoi ce programme ?

Initialement, je recherchais comment implémenter le hashage MD5 sous Delphi. Je suis d'abord tombé sur le RFC 1321 en C++. Ensuite, chez PhpCs.com, en commentant un code de hashage exotique, un membre a cité un code JavaScript du JdNet. Mais étant donné que la fonction est mondialement célèbre (elle en est à sa version 5 quand même et que c'est des gros balourds du cerveau qui assurent son incassabilité), elle doit bien exister déjà sous Delphi. Bien, DelphiPage donne 2 liens. Le premier DcpCrypt propose pleins de composants pour faire du hashage (MD4, MD5, RIPE, SHA, TIGER), mais vient ensuite le lien ultime de Fichtner. C'est celui-ci qu'on va utiliser... Et puis après j'ai cherché sur CS des trucs, mais sans plus.

"Offrir" simplement le MD5 n'est pas très original. J'ai donc eu l'idée de faire un Personal Recovery Tool, mais son utilisation est mathématiquement très limitée.

==============================
2? Et c'est quoi les liens ?

Dans l'ordre:

http://www.faqs.org/rfcs/rfc1321.html
http://developpeur.journaldunet.com/tutoriel/sec/ 010828sec_cryptohachage.shtml
http://delphipage.f ree.fr/cryptage.html
http://www.cityinthesky.co.u k/delphi.html
http://www.fichtner.net/delphi/md5. delphi.phtml
http://www.phpcs.com/code.aspx?id=19 322
http://www.cppfrance.com/code.aspx?ID=25243
htt p://www.phpcs.com/code.aspx?ID=19405
http://pajho me.org.uk/site/legal.html
...et puis y'en a d'autres sur CS.

==============================
3? C'est quoi le MD5 ?

Acronyme de "Message Digest #5". L'algorithme (breveté puis rendu public) a été créé en 1991 par Ron Rivest et deux de ses camarades (Rivest-S-A) et permet de créer des signatures. Le hashage est une technique qui permet de perdre de l'information pour en représenter son contenu: d'où le mot "empreinte". De ce fait, le hashage est irréversible sauf par méthode brutale dans la limite du raisonnable.

Voici les différentes contraintes de l'algorithme MD5 qui ont justifié ses différentes versions.
         - créer une empreinte numérique de taille fixe (16 octets, 128 bits)
         - idéalement impossible d'inverser la fonction de hashage
         - annuler idéalement la probabilité d'obtenir la même empreinte à partir de deux messages différents
         - favoriser une très grande dispersion: un petit écart entre deux messages donnera un écart important entre leurs deux empreintes

MD5 tend à être remplacé par d'autres systèmes mieux sécurisés, style SHA (plus haut niveau de chiffrement).

==============================
4 ? Ca sert à quoi ?

MD5 est irréversible. Donc, c'est très utile...

Faisons une analogie: les empreintes digitales humaines esseulées ne permettent pas d'identifier la personne, mais leur comparaison oui. Avec le MD5, c'est pareil.

MD5 est beaucoup utilisé en PHP pour gérer des comptes sans que les informations soient exploitables, même par l'administrateur du site (certes il peut toujours remplacer les données, mais ne peut pas connaître le contenu original), qui n'a donc aucune préconnaissance de la chaîne originale. De ce fait, aucun commerce n'est possible, et le système MD5 est suffisamment solide pour résister aux attaques.

Par extension, le MD5 permet de gérer des générateurs de clé. Mais comme toute chose, il ne faut pas se baser exclusivement sur le MD5 pour coder les informations. Bien au contraire...

==============================
5? Ca ressemble à quoi le MD5 ?

Pour répondre à cette question, voici des chaînes:

MD5('') = D41D8CD98F00B204E9800998ECF8427E
MD5('a') = 0CC175B9C0F1B6A831C399E269772661
MD5('b') = 92EB5FFEE6AE2FEC3AD71C777531578F
MD5('c') = 4A8A08F09D37B73795649038408B5F33
MD5('bateau') = B40C600C9E8B436FFB554756920C4B77
MD5('gateau') = 3F8593D58BDAB252D9005A80A1E63415
MD5('Delphifr.co m est le meilleur site du monde') = D1A63FBDC03253814B04508CBD4EC868
MD5('Delphifr.co m est le Meilleur site du monde') = 22D9ED0E2FD2F288B2F1E7D519257B26

Comme vous le voyez, la casse est importante.

==============================
6? En définitive, il sert à quoi ton programme ?

C'est pour tenter de retrouver des données personnelles codée en MD5. Y'a deux techniques de base:
         1) utiliser des dictionnaires (5 millions de mots en 48Mo). Voir ftp://gattinger.org/wordlists/ pour télécharger les fichiers. Si vous n'avez pas ces fichiers, la fonction Dico sera désactivée.
         2) utiliser la méthode brutale.

La seule manière de décoder le MD5 est de tester toutes les combinaisons. C'est le principe du hashage, à ne pas confondre avec le cryptage qui lui est réversible. C'est pour cette raison que le MD5 est considéré comme incassable, car il faut bruteforcer. Or, mathématiquement, il y a un problème sympathique.

Pour un mot de 8 lettres constitué a priori de 26 lettres en minuscules, on nécessite une attente maximale de 5 jours à raison de 550 000 passes par seconde. Pour un mot de 5 caractères parmi les 256 de la table ASCII, on a besoin de 23 jours. Avec 10 caractères, il faut 70 milliards d'années. Dans ce dernier cas, à la puissance de 460 TéraFlops des supercalculateurs IBM, il faudrait "seulement" 83 ans.

Décrypter le MD5 ne peut se faire que dans le cadre privé, car les informations codées sont déjà préconnues, ce qui n'est généralement pas le cas lorsqu'on visualise une chaîne MD5 tirée du hasard. Comme déjà expliqué, il est possible de décrypter un numéro de téléphone si seulement on sait si c'en est un. Si on ne sait pas, alors se lancer dans la table ASCII est une partie perdue d'avance. L'univers ne serait pas assez âgé...

==============================
7? Comment la MD5 Lib marche-t-elle ?

Comparer deux STRING prend du temps. On préfère donc des tableaux de BYTE car c'est plus rapide (correspond au type MD5Digest). On évite ainsi de gérer des chaînes et toutes les conversions qui vont avec (voir §9). J'ai dû rajouter 4 fonctions à la librairie d'origine.

La librairie est très bien faite.

==============================
8? Peut-on encore accélérer la vitesse d'analyse ?

Il y a 4 solutions:
         1) ne pas faire s'amuser pendant que le programme travail
         2) fermer toutes les applications
         3) avoir un seul décodeur à la fois
         4) mettre l'application en focus

Les résultats sont très modestes.

==============================
9? Dans la pratique, la vitesse est de 375 000 passes par seconde pour les IP, mais avec des chaînes, on est effectivement à 550 000. Je ne comprend pas !

La puissance maximale du programme est de 550 000 passes par seconde (correspond à la chaîne vide). Pour les IP, il faut à chaque boucle regénérer l'IP sous forme de string. En revanche, pour les chaînes, on ne fait varier qu'un caractère à la fois. On a donc simplement à faire un truc du genre STRING[Index]:=CHAR;. De ce fait, on gagne énormément en vitesse, et on est à 95% de la vitesse maximale. C'est donc une très bonne optimisation difficilement réductible.

Plus les chaînes sont longues et plus ça rame. Mais le ciblage des actions réduit significativement le temps pour recouvrer une chaîne. D'où le gain espéré...

==============================
10? Cryptage ou hashage ?

Le cryptage associe des caractères à d'autres. Trouver les clés de génération permet de décrypter: principe de clés publiques et privées. Ce cryptage là sert dans les archives DOC, RAR, ZIP, XLS, PPT...

Le hashage massacre les données de manière irréversible par des fonctions non bijectives. C'est unisens. Le hashage ne peut pas être utilisé dans des documents de bureautique.

==============================
11 ? Comment se protéger ?

Il faut:
         - mettre des mots de passe très longs
         - ne pas utiliser des mots du dictionnaire
         - jouer sur la casse
         - utiliser un large panel de caractères ASCII

Ca démultiplie les combinaisons.

==============================
1 2? Comment utiliser ce logiciel ?

Par le coté mathématique de la chose, seule une utilisation privée est possible car vous connaissez l'allure de la chaîne d'origine, style «je sais qu'il y a que des 0 et des 1», «là, y'a une majuscule»... etc, etc. Un cambrioleur (ou même un ami) ne connait rien et est démuni.

Il y a eu un challenge un jour. Je cite: «Challenge RC5 / 64 bits: Ce challenge a été emporté par Distributed.net, en septembre 2002, après 1700 jours de calcul et un réseau qui a compté plus de 300 000 ordinateurs de type "PC"»

Ca fait réfléchir. Et si vous tombez par hasard sur deux chaînes différentes ayant le même MD5, alors vous pourrez être chanceux de vous.

==============================
13? Conclusion ?

Le hashage est plus sécurisé que le cryptage. Le déhashage est une éternelle procédure à cause de la protection unisens. La sécurité est un métier, et MD5 a prouvé qu'il était utile pour vos besoins personnels.


 Conclusion

Vous pouvez toujours aller visiter http://altert.family.free.fr/

 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

09 avril 2005 15:28:13 :
- ni69> mise en place du dispositif d'accroissement de la priorité du thread principal.
10 avril 2005 13:40:11 :
- Ajout d'un bouton SLEEP pour suspendre le prog sans l'interrompre, car il pompe tellement de flux (haut threading oblige) que sans ce bouton, il serait très difficile de faire certaines manipulations - Description refaite
15 avril 2005 18:05:12 :
- Les résidus de réflexion laissent place à une belle image et à une très très légère amélioration de la gestion de l'interface.
04 juin 2005 15:30:47 :
- Bug fixé: boucle discontinue des IPs - Bug fixé: si le filtre est vide - Bug fixé: débordement BYTE dans le mode "All ASCII characters" - Bug fixé: veille sur les exceptions - Bug fixé: si "bg.bmp" n'existe pas - Peut se comporter comme une DLL - Interruption possible du cycle brutal par fichier INI - Vue ANSI et OEM des clés - Affichage de la longueur de la chaîne traitée - Calcul de statistiques (nb de combinaisons, temps estimé) - Vérification de l'existence de "Dictionnaries\" - Vérification à la fermeture - Copier la clé dans le presse-papier - Plus de filtres - Bouton "Send" - Un remplaceur '*' de caractères rares pour mieux voir la progression du brute force en ASCII complet - Partie de l'image légèrement refaite - Fonction "New" pour reparamétrer le logiciel - D'autres trucs parci-parlà Du coté des performances, voir commentaires...
17 décembre 2005 16:05:00 :
- Mise à jour des mots clé

 Sources du même auteur

RÉCUPÉRER LE KBID DES PATCHS CORRECTIFS INSTALLÉS SUR UNE MA...
Source avec Zip INFORMATIONS POUSSÉES SUR UNE PAGE D'UN TWEBBROWSER
Source avec Zip CORRECTEUR ORTHOGRAPHIQUE EN DIRECT
CODE DE HAMMING (4,8) : TRANSMISSION DE DONNÉES SANS ERREUR ...
MODIFIER L'HORLOGE DU SYSTÈME D'EXPLOITATION

 Sources de la même categorie

Source avec Zip Source avec une capture GOLDEN PASSWORDS - STOCKEZ VOS MOTS DE PASSE ! par Bacterius
Source avec Zip Source avec une capture LEA EN MODE CHIFFREMENT (SEA) par Bacterius
Source avec Zip Source avec une capture DELPHI : SHA-1 EN MODE CHIFFREMENT (SHACAL) par FENETRES
Source avec Zip SECUSB ; LOGICIEL D'EFFACEMENT SÉCURISÉ POUR CLEF USB par ludodelphi
Source avec Zip PROTECTION COPIE CD, OU PROGRAMME SUR DONGLE USB par Huugooo

 Sources en rapport avec celle ci

Source avec Zip DICTIONNAIRE DE RIMES par L_art_ment
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 MD5 API, LE CELEBRE ALGORITHME DE HACHAGE SOUS DELPHI. par f0xi
Source avec Zip ALGORITHME BRUTEFORCE: ÉNUMÈRE TOUTE LES POSSIBILITÉS D'UN E... par retaks666

Commentaires et avis

Commentaire de grandvizir le 09/04/2005 12:36:09

Je suis tombé sur cela:
http://www.microsoft.com/france/msdn/technologies/outils/vbasic/info/info.asp?mar=/france/msdn/technologies/technos/securite/info/20040105-cryptosimplified.html

«Chacun des algorithmes de hachage présentés exécute le même type d'opération. Les différences de l'un à l'autre viennent simplement de la taille de la clé employée pour produire le hachage. Plus la clé utilisée est grande, plus le cryptage est robuste. Par exemple, l'algorithme SH1 utilise une clé de cryptage de 160 bits, alors que MD5 utilise une clé de 128 bits ; par conséquent, SHA1 est plus sûr que MD5 et le hachage est plus difficile à violer.»

Je ne comprend pas alors pourquoi on continue d'utiliser le MD5... en PHP surtout.

Je voulais aussi préciser que la personne qui trouvera 2 chaînes différentes ayant même MD5 sera une personne TRES chanceuse (riche? je sais pas ;). Alors, faut se manifester. Croyons donc au hasard !!

Commentaire de ni69 le 09/04/2005 14:48:05

Salut !
C'est vraiment du bon boulot tout ça ! Bravo !
Je n'ai pas eu le temps de regarder tout le code, mais voici au moins comment gérer les priorités d'exécution... ;)

procedure TfrMD5.mnPrioLowestClick(Sender: TObject);
const Priority : array[0..3] of integer = (IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS);
begin
//CHANGE THE PRIORITY
  SetPriorityClass(GetCurrentProcess, Priority[(Sender as TMenuItem).Tag]);
   (Sender as TMenuItem).Checked:=true; // Cette ligne peut être évitée grâce à la propriété AutoCheck := true des items dans l'inspecteur d'objets...
  Logging('Thread''s priority changed to level '+IntToStr((Sender as TMenuItem).Tag));
end;

Voilà !
@+ Nico ;)

Commentaire de grandvizir le 09/04/2005 15:37:11

Merci Nico... C'est tout pile le fragment de code qui me manquait. Spy++ a réagit à ton code conformément à mes attentes. Mais je n'ai pas vu de différences flagrantes niveau performances (ça ne m'étonne pas).

Attention: si vous vous mettez en mode TIMECRITICAL, ça va pomper un max sur le CPU. Ceci dit, l'application sera plus régulière.

=> Code source terminé.

Commentaire de CCJ le 10/04/2005 14:10:38

Moi je dis respect
1) c asser complexe
2)ta fallu combien de temps pour ecrire tt ca ??!!
^^
10/10

Commentaire de entity666 le 11/04/2005 02:09:48

franchement même chose : respect !
je crois que c'est une des meilleures sources que j'ai eu l'occasion de voir ici depuis plusieurs années ...
chapeau guy !

Commentaire de grandvizir le 15/04/2005 18:08:52

C'est vrai que mon code est bien fait, mais il faut au passage préciser qu'il n'a rien de bien exceptionnel et c'est très facile à faire. Voici quand même un résumé succint des principes:

- Conversion:
Simple application de la formule du MD5

- IP:
Utilisation de 4 boucles imbriquées
Reconstitution de la chaîne
Test de concordance
Affichage d'information

- Dictionnaire:
Simple boucle
Défilement de tous les mots du dico jusqu'au bon

- Brute Force:
Utilisation d'un tableau de 32 cases (mathématique raisonnable)
Initialisation des variables
Spécification de l'intervalle des longueurs
Si présence d'une chaîne initiale
    > Vérification de la validité de la chaîne
    > Initialisation du tableau buffer
    > Modification des variables déjà initialisées
Amorçage d'une boucle très longue considérée comme infinie
    > Test du mot
    > Passage au mot suivant
    > Affichage de la progression
Finalisation: affichage et reset


Dans le programme, le truc le plus délicat concerne le tableau-mémoire. Dans le Brute Force, vous choisissez un masque prédéfini (SPMASK) et sa longueur est donnée par (BUFLEN). Le buffer mémoire est de longueur fixe (MXBUFF=32). Cette longueur est ignorée dans le reste du processus [elle peut seulement servir à la vérification des étendues]. La variable principale de boucle est indirectement (LEN) et arrête la boucle dès lors que LEN dépasse LNMAX (valeur supérieure de l'intervalle des longueurs). Dès lors, tous les mots ont été testés.

Il ne faut pas confondre le numéro de case avec son contenu. Pour passer au mot suivant, on incrémente de 1 la case N°1. Le maximum d'incrémentation est donné par LNMAX (=longueur du masque). Si ça dépasse, on passe à 1 la case N°1, et on incrémente en cascade les cases suivantes en les repassant aussi à 1 si nécessaire. Dans ces incrémentations, on en profite pour regénérer !!PARTIELLEMENT!! la chaîne qui sera traitée en MD5 au tour suivant. Si la dernière case (de position LEN, avec LEN<=LNMAX<=MXBUFF) vaut LNMAX, alors toutes les cases passent à 1, et la case LEN+1 est activée à 1, celles qui suivent restant bien sûr à 0.

Chaque case N°i du tableau-mémoire détermine le caractère LEN-i+1 dans la chaîne traitée en MD5, et le contenu des cases désigne le nnième caractère du masque. La chaîne à analyser est donc logiquement une combinaison des caractères du masque. Prenons un exemple.
    MASQUE:  abcd
    CHAÎNE:  bdaac
    BUFFER:  [3,1,1,4,2,0,...,0]
Si on convertit dans l'ordre naturel du tableau le buffer, on a la chaîne "caadb", qui est l'inverse de la chaîne réelle. Pourquoi ce choix inversé ? C'est plus naturel de gérer un tableau comme cela.

Bien que le buffer ait une correspondance par l'envers, la chaîne est créée en direct dans le bon ordre [principe du LEN-i+1]. Cela est nécessaire afin que l'affichage soit cohérent du point de vue de l'utilisateur. Dans le cas contraire, il verait que "avion" passe à "bvion" en se disant «Waouh, il va super vite ce prog» et pourtant, le logiciel n'a analysé que une seule chaîne.

Donc voilà... En moins d'une demi-journée, c'est proprement bouclé. Ce code a juste hiberné quelques mois dans mon coffre à codes sources ;)

Commentaire de grandvizir le 15/04/2005 18:21:01

Dernière chose vis-à-vis du mode TIMECRITICAL. Surtout, ne perdez pas le focus de l'application au profit d'une autre !!!! Il y a peu (pas forcément pas) de chance pour que Windows la réactive. C'est un comportement tout à fait normal sous Windows et justifié dans l'aide incontournable WIN32.HLP. Boostez à la critique que si vous n'avez rien à faire d'autre.

J'améliorerai bien plus tard la méthode du dictionnaire afin de démultiplier leur capacité. En ignorant la casse, un mot de 3 lettres donne 9 combinaisons, 4 lettres fournissent 16 mots...

Les dictionnaires offrent 4'350'531 mots en minuscules pour près de 40'910'694 octets de données. Cela fait une moyenne de 9 caractères par mot. Offrant chacun 81 combinaisons en moyenne, on obtient finalement 81 fois plus de mots dans la totalité du dictionnaire, soit 352 millions de mots. Et encore, on n'a pas géré les accents.

On génère ainsi virtuellement 3,08 GigaOctets de données, correspondant à une analyse de 20 minutes à raison de 300 000 passes par seconde.

Encore une fois, j'espère ne pas avoir fait des fautes de calcul.

Commentaire de grandvizir le 04/06/2005 15:36:31

Ben non: les 9 lettres donnent 2^9 combinaisons si on considère uniquement les minuscules et majuscules. La capacité du dico est donc multipliée par 512 et non par 81 (les exposants n'étaient pas calculés dans le bon sens). Mais avec tous les caractères spéciaux dérivés, ça devient... pouf... un monument indestructible ! Jugez en avec les tableaux du dico que j'ai déjà établis.

Sinon j'ai fait une mise à jour digne de ce nom: l'historique résume tout. Mais j'aimerai revenir sur 2 points très très particuliers :
1) Dans les options du projet, si on coche la case "Construire avec les paquets", on gagne 15 000 pps.
2) Si on insère dans le projet un TTimer alors que l'option précédente n'est pas cochée, on perd 130 000 pps seulement pour la recherche des IP. Si la case est cochée, c'est comme si il n'y avait rien eu.

En reprenant et corrigeant l'expression de quelqu'un: «J'me demande quand même défois ...si [Windows] n'existait pas faudrait l'inventer pour pas s'ennuyer lol»

Maintenant, on peut donc dire qu'on décode à 565 000 passes par seconde.

Avant de conclure, jettez un coup d'oeil à la fonction "ReadableOutput" dans le code. En tentant des trucs, on finit par les adopter. L'astuce tient dans le secret des types énumérés.

Et puis, l'application peut se comporter comme une DLL. Qui sait, ça peut servir...

Et compiler le code avec C++Builder n'accélère pas le processus. Peut-être faut-il utiliser l'interface Pascal avec un générateur de MD5 en C++ ? Mais j'y crois pas trop... même c'est techniquement possible.

;)

Commentaire de GodOfWaves le 19/11/2007 15:04:02

salut ta source a l'air d'être super mais peux tu peux dire s'y on a besoin d'un certain programme pour compiler ta source ? Merci

Commentaire de entity666 le 22/11/2007 23:53:00

Bah comme tu es sur codes-sources il te faudra forcément le language pour compiler et en l'occurence tu es sur delphifr donc forcément te faut delphi ...( Je dirai même plus minimum delphi6 voire 7 c'est mieux lol )
xD

Commentaire de ni69 le 04/05/2008 00:48:04

Bonjour Grandvizir,

Je voulais te signaler un petit bug que j'ai découvert récemment dans le code de cette source qui rend absolument inopérante la méthode de Brute Force lorsque l'on choisit le filtrage défini par 'All ASCII characters'.

Par exemple, si l'on tente de retrouver la chaîne '!!' à partir de son empreinte (EF9FCDB53E4E10B12BFCD5E9E78135DC), le programme s'exécute... Mais n'a aucune chance de retrouver le résultat, qui est pourtant trivial (255^2 possibilités c'est rien quand on en teste plus de 600000 par seconde !)

En fait, dans la boucle de test, ce qui se passe concrètement est qu'une fois arrivée à 255, la valeur du premier élément de 'ArrTbl' repasse à 0. Hé oui c'est un array of byte !!! Or le masque ASCII est constitué de 256 caractères (en comptant #0) donc comme la boucle ne passe à l'étude du mot comportant un caractère de plus que si cette limite est atteinte, on tourne en rond en testant toujours les mêmes chaînes constituées d'un seul et unique caractère, et la boucle est ainsi infinie !

Il suffit de modifier la déclaration de ArrTbl en :
ArrTbl : array[1..MxBuff] of word
Avec un tableau de nombres codés sur 2 octets on est tout de suite un peu plus tranquille... et ça marche mieux !

A bientôt,
Nico

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Dictionnaire mot spécial [ par Xtazy ] Voila en fait c'est pa vraiment une question c'est pour savoir si quelq'un a deja fais un programme ( je n'en ai pa trouvé en le cherchant ) capable d 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 DICTIONNAIRE DE MOTS [ par synthe_2000 ] Je cherche des fichiers au format texte ou ascii qui contiennent des listes de mots en français.Ou alors des dictionnaire français -anglais ou françai basculer d'un pg vers son dictionnaire de donnée et son mcd et mld [ par sila ] bonjour j'ai un programme install&#233; sous windows fait sous windev , et on me&nbsp;demande de faire quelque modification sur se programme, comment Delphi- chargement dictionnaire [ par mathlemath ] Bonjour &#224; tous, j'ai besoin d'utiliser pour un projet scolaire le chargement d'un dictionnaire &#224; partir d'un fichier texte en utilisant un a Delphi- chargement dictionnaire [ par mathlemath ] Bonjour &#224; tous, j'ai besoin d'utiliser pour un projet scolaire le chargement d'un dictionnaire &#224; partir d'un fichier texte en utilisant un a [a supprimer] double RSA [ par eleve123 ] Bonjour tout le monde,j'ai plusieur problèmes avec une série d'exercice, tout seul ca va pas . quelqu'un peut m'apporter de l'aide svp.voila mon 1er e format d'un dictionnaire francais [ par DevMln ] bonjour j'ai en cours de developper une application de chat avec le PC et j'ai un pb comment analysé une phrase 'Nom+verbe+adj' par exemple le pb j'ai


Nos sponsors


Sondage...

Comparez les prix

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 : 1,264 sec (3)

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