Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BRUTEFORCING D'UN CHECKSUM MD5


Information sur la source

Attention: ce code a été marqué comme suspect par un admin, il peut donc être dangereux.
Ce code a été laissé sur le site dans un but pédagogique, ne l'exécutez pas si vous ne comprenez pas son contenu!
Catégorie :Sécurité & Cryptage Classé sous : bruteforcing, checksum, md5 Niveau : Débutant Date de création : 07/08/2004 Date de mise à jour : 08/08/2004 18:46:28 Vu / téléchargé: 10 517 / 932

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (29)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Bon alor l'histoire commence ici : http://www.phpcs.com/code.aspx?ID=19322
J'ai pas testé le script, mais l'idée m'intéressait de savoir qu'elle est le puissance nécéssaire pour trouver un mot de passe valide sur mon site, et en combien de temps.
J'ai donc codé ça en C (LccWin32, m'enfin ça devrait tourner sur n'importe quel autre compilo sans trop de problèmes) en vitesse, le code est vraiment cochon (j'ai même repris 3 fonctions venant de BCX, et j'ai une tonne d'includes qui servent a rien, je sais, mais j'ai commenté comme j'ai pu pour le rendre compréhenssible), j'ai pas vraiment optimisé et ça me donne quand même dans les 10000 'mot de passes' testé par seconde, avec mon simple athlon 1.3 Ghz (sans compter toutes les taches de fond qui me pompe le CPU) !
J'ai donc essayer de 'décrypter' l'exemple de mavounet (aa36dc6e81e2ac7ad03e12fedcb6a2c0=mdp), et comme vous le voyez sur la capture il met que 6s !!! Bon d'acord après ça se complique si on passe au dessus de 3 caractères, et c'est considérablement ralenti, et ça devient quasi-impossible.
Conclusion: N'utilisez QUE des mots de passes complexes contenants un bon nombre de caractères, et le mieux seraient encore d'éviter de rendre public la liste des md5 !
 

Source

  • #include <windows.h>
  • #include <stdio.h>
  • #include "md5.h" //Le fichier magique qui permet d'encoder en md5
  • // *************************************************
  • // System Variables
  • // *************************************************
  • COORD cursor;
  • HANDLE hConsole;
  • int color_fg = 7;
  • int color_bg = 0;
  • // *************************************************
  • // Standard Prototypes
  • // *************************************************
  • void cls(void);
  • void color (int,int);
  • void locate (int,int,int=1,int=12);
  • // *************************************************
  • // Main Program
  • // *************************************************
  • DWORD BrutesMade=0;
  • DWORD NumberFounds=0;
  • BOOL Tourne=TRUE;
  • md5_byte_t buffer[1024];
  • DWORD nForceChars=0;
  • md5_byte_t searched[16];
  • /* ChangeLog
  • -les déclarations des variables pour calculer le md5 sont déclarés AVANT la boucle et plus pendant
  • -j'ai changé le char par un WORD (le int était pas une mauvaise idée, mais j'ai l'impression que c'est un peu plus lent chez moi)
  • -suprimé la conversion du md5 format brut vers le format héxa, et je compare le digest lui même (sans oublier de convertir avant le md5 que l'on recherche en format brut), mainteant sur mon pc ça tourne a 600000/s au lieu de 10000, 60x plus rapide !!!
  • -supression de la récusivité qui se fesait quand même bien sentir, merci à ccarniel
  • -adaptation a VC++ : plus grand rapidité que avec Lcc, mais mauvaise portabilité (il se trouv que le même exe, compilé sur une machine tourne moins bien sur une autre machine plus puissante !!!)
  • -et amélioration de la fonction de monitoring qui est maintenant plus précise (encore merci a ccarniel)
  • */
  • void brute_force(DWORD max, md5_byte_t searched[16]) {
  • char md5buf[33];
  • DWORD maxm1=max-1;
  • unsigned char ChiffreDebut = ' ', ChiffreFin = 254;
  • int Curseur;
  • bool Termine = false;
  • md5_state_t state;
  • md5_byte_t digest[16];
  • // Combinaison = new unsigned char[max+1];
  • memset(buffer, ChiffreDebut, (sizeof(char))*max);
  • while (!Termine) {
  • BrutesMade++; //On ajoute 1 au compteur de 'pass' testés
  • //On fait un checksum md5 sur le buffer
  • md5_init(&state);
  • md5_append(&state, (const md5_byte_t*)buffer, max);
  • md5_finish(&state, digest);
  • if (!memcmp(digest, searched, 16)) { //memcmp est bcp plus rapide que strcmp, mais ne fait pas de comparaisons entre les minusucules et les majusucules, attention a ça quand vous mettez votre md5 a 'décrypter' !
  • locate(++NumberFounds, 29); //Si trouvé, on place le curseur a droite dans la console
  • for (int di = 0; di < 16; ++di) sprintf(md5buf + di * 2, "%02x", digest[di]); //Ok c'est pas le plus puissant mais on s'en fout, on le fait qu'une seule fois
  • printf(": md5('%s')='%s'\n", buffer, md5buf); //On affiche le md5 et le pass qui correspond (c'est vrai il y a des chances de pas trouver le vrai mot de passe, mais on s'en fout, si on entre ça l'ordi va le comprendre comme le vrai mot de passe !!!)
  • Tourne=FALSE; //On arrête le thread de monitoring
  • ExitProcess(0); //Et on quite
  • }
  • Curseur = 0;
  • if (buffer[Curseur]>ChiffreFin) {
  • do {
  • buffer[++Curseur]++;
  • if (Curseur == max) return ; // On a pas trouvé la combinaison
  • } while (buffer[Curseur]>ChiffreFin);
  • memset(buffer, ChiffreDebut, Curseur);
  • }
  • }
  • }
  • //Un ptit thread pour savoir où en est le prog parce que sinon on se fait un peu chier lol
  • void ThreadMonitor(void) {
  • DWORD LastBrutes=0, Secs=0;
  • #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  • __int64 Freq,StartTime,CurTime;
  • #else
  • unsigned long StartTime,CurTime;
  • #endif // defined (_MSC_VER) && (_MSC_VER >= 1020)
  • #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  • QueryPerformanceFrequency((LARGE_INTEGER*)&Freq);
  • QueryPerformanceCounter((LARGE_INTEGER*)&StartTime);
  • #else
  • StartTime = GetTickCount();
  • #endif // defined (_MSC_VER) && (_MSC_VER >= 1020)
  • do {
  • //Secs = GetTickCount() - Start;
  • #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  • QueryPerformanceCounter((LARGE_INTEGER*)&CurTime);
  • Secs = (CurTime - StartTime)*1000/Freq;
  • #else
  • CurTime = GetTickCount();
  • Secs = (CurTime - StartTime);
  • #endif // defined (_MSC_VER) && (_MSC_VER >= 1020)
  • if( Secs >= 1000 ) {
  • cls(); //On efface l'écran et on met le curseur en haut a gauche. Ok j'avoue la fonction vient tout droit de BCX j'ai pas eu le courage d'aller mieux chercher et g pri le premier truc qui m'est tombé sous la main
  • printf("%d décryptés.\n",BrutesMade);
  • printf("%d/s (%ds écoulée(s)) \n",BrutesMade/(Secs/1000),(Secs/1000));
  • printf("Le mot de passe a au moins %d chars.\n\n== %s ==\n\n\n", nForceChars, buffer); //On affiche les stats
  • LastBrutes=BrutesMade; //9a c'est pour le compteur de pass par secondes
  • }
  • Sleep(1000); //On attenton une seconde
  • } while (Tourne==TRUE); //Une boucle jusqu'a se que un pass correct soit trouvé
  • }
  • int main(int argc, char *argv[]) {
  • hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  • // "aa36dc6e81e2ac7ad03e12fedcb6a2c0" = mdp
  • // "1eec414adf814acbc887f59327db58fb" = ?
  • // "02c425157ecd32f259548b33402ff6d3" = zzzz
  • // "95ebc3c7b3b9f1d2c40fec14415d3cb8" = zzzzz
  • char * md5s="02c425157ecd32f259548b33402ff6d3";
  • char cbit[3];
  • cbit[2]='\0';
  • for (int i=0; i<32; i+=2) {
  • memcpy(cbit, md5s+i, 2);
  • searched[i/2]=strtol(cbit, NULL, 16);
  • }
  • DWORD MaxSize=16; //Le nb maximum de caractères que le pass peut faire
  • CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadMonitor, NULL, 0, NULL); //On démarre le monitoring en tant que thread seconde ==> comme ça, ça ralenti a peine le scanning, et c'est plus simple pour les fénéants^^
  • for (nForceChars=1; nForceChars<=MaxSize; nForceChars++) {
  • ZeroMemory(buffer, MaxSize+1); //On efface le buffer pour plus de sécurité
  • brute_force(nForceChars, searched); //Et on brute force ça
  • }
  • return 0;
  • }
  • // *************************************************
  • // Run Time Functions
  • // *************************************************
  • void locate (int row,int col,int show,int shape)
  • {
  • CONSOLE_CURSOR_INFO cci = {0};
  • cursor.X = col-1;
  • cursor.Y = row-1;
  • SetConsoleCursorPosition(hConsole,cursor);
  • cci.bVisible = show;
  • cci.dwSize = shape;
  • SetConsoleCursorInfo(hConsole,&cci);
  • }
  • void cls (void)
  • {
  • COORD coordScreen = {0,0};
  • DWORD cCharsWritten;
  • CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
  • DWORD dwConSize;
  • register int attr;
  • cursor.X = 0;
  • cursor.Y = 0;
  • GetConsoleScreenBufferInfo( hConsole, &csbi );
  • dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  • FillConsoleOutputCharacter (hConsole, 32, dwConSize,coordScreen, &cCharsWritten);
  • attr = color_fg + color_bg * 16;
  • FillConsoleOutputAttribute (hConsole, attr, dwConSize,coordScreen, &cCharsWritten);
  • locate(1,1,1);
  • }
  • void color (int fg, int bg)
  • {
  • SetConsoleTextAttribute (hConsole,fg+bg*16);
  • color_fg = fg;
  • color_bg = bg;
  • }
#include <windows.h>
#include <stdio.h>
#include "md5.h" //Le fichier magique qui permet d'encoder en md5


// *************************************************
//                System Variables
// *************************************************

COORD   cursor;
HANDLE  hConsole;
int     color_fg = 7;
int     color_bg = 0;


// *************************************************
//               Standard Prototypes
// *************************************************

void    cls(void);
void    color (int,int);
void    locate (int,int,int=1,int=12);

// *************************************************
//                  Main Program
// *************************************************

DWORD BrutesMade=0;
DWORD NumberFounds=0;
BOOL Tourne=TRUE;
md5_byte_t buffer[1024];
DWORD nForceChars=0;
md5_byte_t searched[16];


/* ChangeLog
-les déclarations des variables pour calculer le md5 sont déclarés AVANT la boucle et plus pendant
-j'ai changé le char par un WORD (le int était pas une mauvaise idée, mais j'ai l'impression que c'est un peu plus lent chez moi)
-suprimé la conversion du md5 format brut vers le format héxa, et je compare le digest lui même (sans oublier de convertir avant le md5 que l'on recherche en format brut), mainteant sur mon pc ça tourne a 600000/s au lieu de 10000, 60x plus rapide !!!
-supression de la récusivité qui se fesait quand même bien sentir, merci à ccarniel
-adaptation a VC++ : plus grand rapidité que avec Lcc, mais mauvaise portabilité (il se trouv que le même exe, compilé sur une machine tourne moins bien sur une autre machine plus puissante !!!)
-et amélioration de la fonction de monitoring qui est maintenant plus précise (encore merci a ccarniel)
*/


void brute_force(DWORD max, md5_byte_t searched[16]) {
	char md5buf[33];
	DWORD maxm1=max-1;
	unsigned char ChiffreDebut = ' ', ChiffreFin = 254;
	int Curseur;
	bool Termine = false;
	md5_state_t state;
	md5_byte_t digest[16];

	// Combinaison = new unsigned char[max+1];
	memset(buffer, ChiffreDebut, (sizeof(char))*max);
	while (!Termine) {
		BrutesMade++; //On ajoute 1 au compteur de 'pass' testés

		//On fait un checksum md5 sur le buffer
		md5_init(&state);
		md5_append(&state, (const md5_byte_t*)buffer, max);
		md5_finish(&state, digest);

		if (!memcmp(digest, searched, 16)) { //memcmp est bcp plus rapide que strcmp, mais ne fait pas de comparaisons entre les minusucules et les majusucules, attention a ça quand vous mettez votre md5 a 'décrypter' !
			locate(++NumberFounds, 29); //Si trouvé, on place le curseur a droite dans la console
			for (int di = 0; di < 16; ++di) sprintf(md5buf + di * 2, "%02x", digest[di]); //Ok c'est pas le plus puissant mais on s'en fout, on le fait qu'une seule fois
			printf(": md5('%s')='%s'\n", buffer, md5buf); //On affiche le md5 et le pass qui correspond (c'est vrai il y a des chances de pas trouver le vrai mot de passe, mais on s'en fout, si on entre ça l'ordi va le comprendre comme le vrai mot de passe !!!)

			Tourne=FALSE; //On arrête le thread de monitoring
			ExitProcess(0);  //Et on quite
		}

		Curseur = 0;
		if (buffer[Curseur]>ChiffreFin) {
			do {
				buffer[++Curseur]++;
				if (Curseur == max) return ; // On a pas trouvé la combinaison
			} while (buffer[Curseur]>ChiffreFin);
			memset(buffer, ChiffreDebut, Curseur);
		}
	}
}

//Un ptit thread pour savoir où en est le prog parce que sinon on se fait un peu chier lol
void ThreadMonitor(void) {
    DWORD LastBrutes=0, Secs=0;
	#if defined (_MSC_VER) && (_MSC_VER >= 1020)
		__int64 Freq,StartTime,CurTime;
	#else
		unsigned long StartTime,CurTime;
	#endif // defined (_MSC_VER) && (_MSC_VER >= 1020)

	#if defined (_MSC_VER) && (_MSC_VER >= 1020)
		QueryPerformanceFrequency((LARGE_INTEGER*)&Freq);
		QueryPerformanceCounter((LARGE_INTEGER*)&StartTime);
	#else
		StartTime = GetTickCount();
	#endif // defined (_MSC_VER) && (_MSC_VER >= 1020)

	do {
		//Secs = GetTickCount() - Start;
		#if defined (_MSC_VER) && (_MSC_VER >= 1020)
			QueryPerformanceCounter((LARGE_INTEGER*)&CurTime);
			Secs = (CurTime - StartTime)*1000/Freq;
		#else
			CurTime = GetTickCount();
			Secs = (CurTime - StartTime);
		#endif // defined (_MSC_VER) && (_MSC_VER >= 1020)
		if( Secs >= 1000 ) {
			cls();  //On efface l'écran et on met le curseur en haut a gauche. Ok j'avoue la fonction vient tout droit de BCX j'ai pas eu le courage d'aller mieux chercher et g pri le premier truc qui m'est tombé sous la main
			printf("%d décryptés.\n",BrutesMade);
			printf("%d/s (%ds écoulée(s))   \n",BrutesMade/(Secs/1000),(Secs/1000));
			printf("Le mot de passe a au moins %d chars.\n\n== %s ==\n\n\n", nForceChars, buffer);  //On affiche les stats
			LastBrutes=BrutesMade;  //9a c'est pour le compteur de pass par secondes
		}
        Sleep(1000);  //On attenton une seconde
    } while (Tourne==TRUE);  //Une boucle jusqu'a se que un pass correct soit trouvé
}

int main(int argc, char *argv[]) {
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    // "aa36dc6e81e2ac7ad03e12fedcb6a2c0" = mdp
    // "1eec414adf814acbc887f59327db58fb" = ?
	// "02c425157ecd32f259548b33402ff6d3" = zzzz
	// "95ebc3c7b3b9f1d2c40fec14415d3cb8" = zzzzz

    char * md5s="02c425157ecd32f259548b33402ff6d3";
    char cbit[3];
    cbit[2]='\0';
    for (int i=0; i<32; i+=2) {
        memcpy(cbit, md5s+i, 2);
        searched[i/2]=strtol(cbit, NULL, 16);
    }

    DWORD MaxSize=16; //Le nb maximum de caractères que le pass peut faire
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadMonitor, NULL, 0, NULL); //On démarre le monitoring en tant que thread seconde ==> comme ça, ça ralenti a peine le scanning, et c'est plus simple pour les fénéants^^
    for (nForceChars=1; nForceChars<=MaxSize; nForceChars++) {
        ZeroMemory(buffer, MaxSize+1); //On efface le buffer pour plus de sécurité
		brute_force(nForceChars, searched); //Et on brute force ça
    }
    return 0;
}

// *************************************************
//                 Run Time Functions
// *************************************************

void locate (int row,int col,int show,int shape)
{
  CONSOLE_CURSOR_INFO cci = {0};
  cursor.X = col-1;
  cursor.Y = row-1;
  SetConsoleCursorPosition(hConsole,cursor);
  cci.bVisible = show;
  cci.dwSize   = shape;
  SetConsoleCursorInfo(hConsole,&cci);
}


void cls (void)
{
  COORD coordScreen = {0,0};
  DWORD cCharsWritten;
  CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
  DWORD dwConSize;
  register int attr;
  cursor.X = 0;
  cursor.Y = 0;
  GetConsoleScreenBufferInfo( hConsole, &csbi );
  dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  FillConsoleOutputCharacter (hConsole, 32, dwConSize,coordScreen, &cCharsWritten);
  attr = color_fg + color_bg * 16;
  FillConsoleOutputAttribute (hConsole, attr, dwConSize,coordScreen, &cCharsWritten);
  locate(1,1,1);
}


void color (int fg, int bg)
{
 SetConsoleTextAttribute (hConsole,fg+bg*16);
  color_fg = fg;
  color_bg = bg;
}


Conclusion

A oui et pour ceux qui connaissent pas, le md5 s'est une sorte de cryptage a sens unique, on peut pas décrypter, il fait 16 octects (ben oui 16 au lieu de 32, nous on en voit la version 'humaine' qui est décodée en héxadécimal)
Un octect=256 combinaisons. 16 octets=256^16 combinaisons, soit environ 3.4 puissance 38 combinaisons possibles, ou même d'après PowerCalc exactement 340282366920938463463374607431768211456... Donc autant dire que c'est quasi impossible de tomber dessus par hasard !
Le md5 est utilisé par exemple par la plus part des logiciels peer2peer pour reconnaitre un fichier vu qu'il est statistiquement impossible que deux fichiers aient le même md5.
Et il est aussi utilisé dans les site webs, quand vous entrez votre mot de passe il est tout de suite crypté en md5, et gardé sous cette forme dans la base de données, comme ça le webmaster où même un pirate ne peux avoir votre mot de passe, mais juste sa version cryptée en md5. (Sa évite les piratages quand sur tous les même sites vous mettez le même mot de passe, compte mail inclu...)

Des commentaires seraient les bien venus si vous avez de meilleures idées que moi pour trouver un mot de passe valide.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

07 août 2004 21:26:16 :
07 août 2004 22:26:38 :
08 août 2004 18:46:28 :

Commentaires et avis

signaler à un administrateur
Commentaire de Clem le 07/08/2004 22:47:35

Alors j'ai fait quelques petits test sur un autre pc (qui tourne a 15000/s), et ça donne
4 secondes pour trouver un pass de 3 lettres (calculs moyens très aproximatifs, ça dépent bien sur de quelles lettres le pass est fait)
3mins=> 4 lettres
2h30 => 5 lettres
4j => 6 lettres
6mois => 7 lettres
23 ans => 8 lettres
1 siècle => 9 lettres

Pas encore découragés ? lol

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 01:36:51

un conseil: n'utilisez pas "000000000" comme mot de passe :p

question: pourquoi tous ces en-têtes? t'as pas besoin de tt ça qd même, c'est ton convertisseur Basic -> C qui crée toutes ces crasses? :( c'est dommage.

4j pour décoder un passe c'est raisonnable, donc on peut dire qu'un passe de 6 lettres c'est VRMNT pas sécurisé :/

tu comptes que le mot de passe contient quels caractères? alpha-numériques ou tous les caractères visibles de la table ASCII? (bcp ça :/)

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 01:40:01

à propos de la liste de md5, une équipe de "hacker" (pr les appeler comme ça) a fait tourner il y a un certain temps une batterie de PC pdt 6 mois pr créer un catalogue de md5 (autant dire que ça prend des Go à stocker). ce que ça veut dire en clair, c'est qu'un organisme organisé (oui oui ^^) passe à travers du md5 "raisonnable" (pas "trop" de caractères) sans problème. prudence donc, si vous travaillez professionnellement. pour un site perso ça change rien ^^

signaler à un administrateur
Commentaire de Clem le 08/08/2004 01:51:08

Vi c'est mon convertisseur basic => c qui avait fait tout ça et j'ai pas eu le courage de trier tout ça, promis je revois mieux le tout bientot. (Je me suis servit de BCX pour les fonctions d'affichage a l'écran a tel position précise avec locate, et effacement avec cls)

Je n'utilise pas tout les caractères visible de la table ascii (je sais pas pourquoi si je les mets tous mon algo ce met a bugger, cf les commentaires dans la fonction brute_force), mais il scanne quand même du code ascii 32 au 122, autant dire que ça inclue déjà pas mal de monde si on regarde la table ascii (http://asciitable.com/)

Je vois pas comment faire fonctionner un tel programme en clusturing, mais c'est sur que ça augmenterai bien la vitesse.
Réquisitionnez une salle entière de LAN (enfin surtout leurs pcs^___^), montez ça en réseau, et 'crackage' assuré dans un temps raisonable (non non, la facture EDF c'est pas moi qui m'en occupe, c'est le gentil monsieur la bas :p)

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 02:56:07

bof, ce qui bouffe de l'électricité c'est surtout les écrans, hors les "super-ordinateurs" de calcul n'en ont pas, aucune utilité, on leur demande juste de calculer et de f* leur g* ;)

je joue avec la lib md5 depuis plus d'une heure là, j'ai écrit un algo bien à moi pour le brute force, mais en itératif, je pense que ça doit être plus rapide sur le principe, seulement j'ai des allocations dynamiques partout et des conversions md5 byte <-> char à tout va, bof bof tout ça, c'est pas la meilleure idée du siècle :) j'penserais bien à écrire une classe "wrapper" autour de la lib, histoire de rendre ces conversions et ces allocs transparentes, mais le procédural ça reste qd même plus rapide que l'orienté objet, alors pr un brute force je sais pas si c'est ma deuxième idée du sicèle ^^

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 02:58:21

(je viens de mettre 287s pour bruteforcer "Nico", ça fait long par rapport à tes 3 minutes :(, tes chiffres ils sont en moyenne ou ds le pire des cas? )

à savoir que je commence par augmenter les caractères à la fin, comme pour des chiffres, donc ici j'ai du chercher jusque 'o', ce qui est bien pire que 'O' ou encore ' '...

signaler à un administrateur
Commentaire de Clem le 08/08/2004 04:25:48

En écrans plat ça consomme moins :p
C'est vrai que c'est sympa cette lib, j'ai eu du mal a la trouver mais maintenant j'ai du mal a m'en séparer lol, vérification de non crackage du programme, mise à jour automatique, répertoriage de fichiers classés par le md5, bref...

ahhhh les alloc dynamiques, un autre truc dont j'ai du mal a me passer depuis que je l'ai connu, résultats: bourrage de ram et plantages a mort^^

les classes c'est vrai que c'est utile, mais il faut réfléchir a quels cas seulement ça peut servir, je me retrouve souvent a faire une classe pour simplifier le boulet, et puis après me dire "ben c'est bien bio ça, mais jpe faire exactement le même sans class, et ça tournera mieux"

euh je serais pas un hors sujet la ?
bon jme rattrape !

essaye de voir si tu peux corriger ça, si t'obtient une meilleure vitesse que moi c'est toujours intéréssant

oui c'est possible que ça a mit 287s, ça dépent déjà sensiblement du proc, mais aussi c'est un temps moyen, et donc un mot de passe commençant en 'a' sera plus rapide a trouver qu'un passe en 'z', en 4 lettres il met bien une petite dizaine pour scanner toutes les possibilités sur la seule première lettre (scanner toutes les aXXX en clair), moi mon essai c'était avec un mot de passe en C, alors que Nico est 10 lettres plus loin, a raison de 1s par lettre, ça fait 100s et une impréssision de 7s !
ah vi et le mien aussi augmente les char de la fin d'abord, puis augmente le suivant

ça te dit qu'on mette en commun la puissance de nos pc pour trouver les pass de la naza ? :D

signaler à un administrateur
Commentaire de ccarniel le 08/08/2004 10:37:51

Concernant le 'z' comme dernier caractère testé, c'est plutôt light.... Personnellement, j'ai l'habitude d'utiliser des caractères étendus (>128) dans mes mots de passe, et en plus ils font toujours au minimum 10 caractères.

Si tu veux pouvoir décoder un tel mot de passe (mis à part le temps), tu dois modifier cette ligne:
    for (char c=' '; c<'z'; c++)
par
    for (unsigned char c=' '; c<=255 ; c++)

Ainsi tu balaieras tout le spectre (enfin presque). Les char vont de -128 à +127, donc quand tu écrivais 132 par exemple, ben il prenait ça pour une valeur négative...


PS: Attention aux tests c<'z' ne testera jamais 'z',  il faudrait écrire c<='z' !!!!

signaler à un administrateur
Commentaire de AlexMAN le 08/08/2004 11:16:25

le char comme "incrémenteur", jette le, utilise un entier, car lors de l'execution, conversion de char en int donc perte de temps alors si on peut s'en passer (on peut TJRS s'en passer), on en profite !
voila, ct juste pour dire ca..

++

signaler à un administrateur
Commentaire de ccarniel le 08/08/2004 11:56:08

J'ai fait quelques modifs dans ton code et j'arrive à tester plus de 1'100'000 mdp par seconde sur un athlon XP1700 (un vieux truc quoi...)
Mes estimations ne concordent pas du tout avec tes calculs, bizarre:
Lettres durée
4 61"
5 92 minutes
6 5 jours et 20h
7 17 mois et 12 jours
8 132 ans
9 12 009 ans
10 1 100 000 ans

Mes modifs sont assez simples:
1. J'ai viré la récursivité.
2. Quand tu construits le mdp de 4 lettres, tu testes s'il est bon à chaque lettre or tu ne devrais le faire que quand il a atteint la taille nécessaire if( i==max)
3. J'ai viré for (int di = 0; di < 16; ++di) sprintf(md5buf + di * 2, "%02x", digest[di]); et remplacé par 16 lignes de macros qui font les calculs sans appel à des fonctions aussi lentes que sprintf.

signaler à un administrateur
Commentaire de ccarniel le 08/08/2004 15:49:32

Voici ma version, 1'200'000/s, légèrement amélioré par rapport à tout à l'heure. J'arrête là dessus :)
J'espère que le code sera lisible.


// *************************************************************
//   Created with BCX -- The BASIC To C Translator (ver 4.25)
//      BCX (c) 1999, 2000, 2001, 2002, 2003 by Kevin Diggins
// *************************************************************
#include <windows.h>    // Win32 Header File
#include <stdio.h>
#include "md5.h"

// *************************************************
//                System Variables
// *************************************************

COORD   cursor;
HANDLE  hConsole;
int     color_fg = 7;
int     color_bg = 0;

// *************************************************
//                 Run Time Functions
// *************************************************

void locate (int row,int col,int bVisible=1,int dwSize=12)
{
  CONSOLE_CURSOR_INFO cci = {0};
  cursor.X = col-1;
  cursor.Y = row-1;
  SetConsoleCursorPosition(hConsole,cursor);
  cci.bVisible = bVisible;
  cci.dwSize   = dwSize;
  SetConsoleCursorInfo(hConsole,&cci);
}


void cls (void)
{
  COORD coordScreen = {0,0};
  DWORD cCharsWritten;
  CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
  DWORD dwConSize;
  register int attr;
  cursor.X = 0;
  cursor.Y = 0;
  GetConsoleScreenBufferInfo( hConsole, &csbi );
  dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  FillConsoleOutputCharacter (hConsole, 32, dwConSize,coordScreen, &cCharsWritten);
  attr = color_fg + color_bg * 16;
  FillConsoleOutputAttribute (hConsole, attr, dwConSize,coordScreen, &cCharsWritten);
  locate(1,1,1);
}


void color (int fg, int bg)
{
SetConsoleTextAttribute (hConsole,fg+bg*16);
  color_fg = fg;
  color_bg = bg;
}




// *************************************************
//                  Main Program
// *************************************************

DWORD BrutesMade=0;
DWORD NumberFounds=0;
BOOL Tourne=TRUE;
char buffer[1024];
DWORD nForceChars=0;

char *HexValues =
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627\
28292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f\
505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374757677\
78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\
a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7\
c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef\
f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";

#define HexStringCopy(Dst,Src) { *Dst++=*(Src); *Dst++=(Src)[1]; }


//Une fonction récursive qui cherche tous les pass de 'max' charactères.
void brute_force(DWORD max, char * searched)
{
char md5buf[33];
unsigned char ChiffreDebut = ' ', ChiffreFin = 'z';
int Curseur;
bool Termine = false;

// Combinaison = new unsigned char[max+1];
memset(buffer,ChiffreDebut,(sizeof(char))*max);

while( !Termine )
{
BrutesMade++; //On ajoute 1 au compteur de 'pass' testés
//On fait un checksum md5 sur le buffer
md5_state_t state;
md5_byte_t digest[16];
md5_init(&state);
md5_append(&state,(const md5_byte_t *)buffer, max);
md5_finish(&state, digest);

register char *TmpMD5Buf = md5buf;
md5_byte_t *TmpDigest = digest;

HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;

//On compare de md5 a celui qui correspond au pass que l'on recherche
if (!memcmp(searched, md5buf, 32))
{ //memcmp est bcp plus rapide que strcmp, mais ne fait pas de comparaisons entre les minusucules et les majusucules, attention a ça quand vous mettez votre md5 a 'décrypter' !
locate(++NumberFounds, 29); //Si trouvé, on place le curseur a droite dans la console
buffer[max]='\0';
printf(": md5('%s')='%s'\n", buffer, md5buf); //On affiche le md5 et le pass qui correspond (c'est vrai il y a des chances de pas trouver le vrai mot de passe, mais on s'en fout, si on entre ça l'ordi va le comprendre comme le vrai mot de passe !!!)
Tourne=FALSE; //On arrête le thread de monitoring
ExitProcess(0);  //Et on quite
}
Curseur = 0;
buffer[Curseur]++;
if( buffer[Curseur]>ChiffreFin )
{
do
{
buffer[++Curseur]++;
if( Curseur == max )
{
return ; // On a pas trouvé la combinaison
}
} while ( buffer[Curseur]>ChiffreFin );
memset(buffer,ChiffreDebut,Curseur);
}
}
}

//Un ptit thread pour savoir où en est le prog parce que sinon on se fait un peu chier lol
void ThreadMonitor(void) {
    DWORD LastBrutes=0, Secs=0;

#if defined (_MSC_VER) && (_MSC_VER >= 1020)
__int64 Freq,StartTime,CurTime;
#else
unsigned long StartTime,CurTime;
#endif // defined (_MSC_VER) && (_MSC_VER >= 1020)

#if defined (_MSC_VER) && (_MSC_VER >= 1020)
QueryPerformanceFrequency((LARGE_INTEGER*)&Freq);
QueryPerformanceCounter((LARGE_INTEGER*)&StartTime);
#else
StartTime = GetTickCount();
#endif // defined (_MSC_VER) && (_MSC_VER >= 1020)

do {
//Secs = GetTickCount() - Start;
#if defined (_MSC_VER) && (_MSC_VER >= 1020)
QueryPerformanceCounter((LARGE_INTEGER*)&CurTime);
Secs = (CurTime - StartTime)*1000/Freq;
#else
CurTime = GetTickCount();
Secs = (CurTime - StartTime);
#endif // defined (_MSC_VER) && (_MSC_VER >= 1020)
if( Secs >= 1000 )
{
cls();  //On efface l'écran et on met le curseur en haut a gauche. Ok j'avoue la fonction vient tout droit de BCX j'ai pas eu le courage d'aller mieux chercher et g pri le premier truc qui m'est tombé sous la main
printf("%d décryptés.\n",BrutesMade);
printf("%d/s (%dms écoulée(s))   \n",BrutesMade/(Secs/1000),Secs);
printf("Le mot de passe a au moins %d chars.\n\n== %s ==\n\n\n", nForceChars, buffer);  //On affiche les stats
LastBrutes=BrutesMade;  //9a c'est pour le compteur de pass par secondes
}
        Sleep(1000);  //On attenton une seconde
    } while (Tourne==TRUE);  //Une boucle jusqu'a se que un pass correct soit trouvé
}

void PrintMD5(const char *mdp)
{
char md5buf[64];

md5_state_t state;
md5_byte_t digest[16];
md5_init(&state);
md5_append(&state,(const md5_byte_t *)mdp,strlen(mdp));
md5_finish(&state, digest);
char *TmpMD5Buf = md5buf;
md5_byte_t *TmpDigest = digest;

HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;
HexStringCopy( TmpMD5Buf , HexValues + *TmpDigest*2 ); TmpDigest++;

printf("(%s)=%s\n",mdp,md5buf);
}


int main(int argc, char *argv[]) {
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    char * searched = "02c425157ecd32f259548b33402ff6d3"; //Le md5 dont on cherche un pass correct
    // "aa36dc6e81e2ac7ad03e12fedcb6a2c0" = mdp
    // "1eec414adf814acbc887f59327db58fb" = ?
// 95ebc3c7b3b9f1d2c40fec14415d3cb8 = zzzzz
// 02c425157ecd32f259548b33402ff6d3 = zzzz
bool Recursif=false;

//PrintMD5("zzzz"); exit(0);

    DWORD MaxSize=16; //Le nb maximum de caractères que le pass peut faire
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadMonitor, NULL, 0, NULL); //On démarre le monitoring en tant que thread seconde ==> comme ça, ça ralenti a peine le scanning, et c'est plus simple pour les fénéants^^
    for (nForceChars=1; nForceChars<=MaxSize; nForceChars++) {
        ZeroMemory(buffer, MaxSize+1); //On efface le buffer pour plus de sécurité
        brute_force(nForceChars, searched); //Et on brute force ça
    }

    return 0;
}

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 19:46:31

bon ben puisque tlm en parle, moi j'ai une version à 400 000 (sur un PC qui faisait 150 000 avec ta version).

j'ai baqué la récursivité pour de l'itératif et je compare (avec memcmp) le hash de 16 octets plutôt que la conversion en char de 32 octets. ça vire printf et 16 comparaisons.

1,2 MK / s c'est bcp qd même, au-delà du fait que tu as super optimisé, faut féliciter les créateurs de la lib MD5, qui est super rapide!

signaler à un administrateur
Commentaire de Clem le 08/08/2004 19:53:13

Oui moi aussi j'ai penser a virer le printf comme ça et sur mon pc ça montait à 600000 au lieu de 10000 !!!
mais j'arrive pas a me débrouiller pour faire un algo sans récursiviter et celui de ccarniel semble tourner en boucle dans le vide chez moi au bout de 4 lettres

C'est clair qu'il on fait du bon boulot, ça doit être trop chaud a faire un algo aussi compliqué, senssible au moindre changement de bit, et sans pour autant qu'il mette 2h (quelques secondes au pire pour calculer le checksum de fichiers de plusieurs centaines de mo !)

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 20:02:31

ben regarde pour l'itératif, tu dois considérer que tu as en fait un nombre en base 256-32 (si tu balayes de l'espace jusqu'au caractère 255). Après, tu réfléchis en comparant à la base 10 (qu'on utilise tt le temps)

1459
+1
1460
//...
1499
+1
1500

tu analyses (c facile qd même :p) la logique: tu incrémentes le dernier caractère de 1, si il excède la limite supérieur (ici 9, mais ds le prog 255), tu le remets à 0 (espace) et tu incrémentes le caractère suivant (c'est-à-dire l'avant dernier) et tu refais les mêmes tests.

si tu en arrives à devoir incrémenter le tout premier caractère, c'est que t'es au bout des tests!


voici le truc que j'ai pondu hier soir:

//on a une boucle "à l'envers": on commence par la fin
   for(int i=NbCar-1; i >= 0; i--){
    if(++chaine[i] <= LimSup)
     break;
    chaine[i] = LimInf;
    if(i == 0)
     GoOn = false; //met fin à la boucle du brute force
   }


explication:
la boucle commence par incrémenter à la fin et revient petit à petit vers le début.
LimSup = 255 et LimInf = 32 (espace).

if(++chaine[i] <= LimSup)
revient à écrire:
chaine[i]++;
if(chaine[i] <= LimSup)

NB: chaine est bien sur le mot à tester, pas le hash
si c'est inférieur à LimSup, on ne doit pas incrémenter le nombre qui le précède, on termine cette boucle (break). Sinon, on remet le nombre à LimInf (0, donc 32) et on vérifie qu'il ne s'agissait pas du tt premier caractère (9999 + 1 = 10000, on est plus sur 4 chiffres mais sur 5, donc on a tt testé). Sinon, on passe au nombre qui précède etc...

signaler à un administrateur
Commentaire de Kirua le 08/08/2004 20:08:53

"si tu en arrives à devoir incrémenter le tout premier caractère, c'est que t'es au bout des tests!"

je voulais dire: si tu dois remettre le tout dernier caractère à LimInf après qu'il ait été à LimSup, désolé

signaler à un administrateur
Commentaire de ccarniel le 08/08/2004 22:22:40

"compare (avec memcmp) le hash de 16 octets plutôt que la conversion en char de 32 octets. ça vire printf et 16 comparaisons."

Effectivement, Kirua, je gagne encore 10% :) 1'331'000/s

Clem: Pour mon algo, ben trace le, je ne vois pas pourquoi ça  tournerai dans le vide. Je ne vois qu'une différence de compilateur de possible.
Surveille surtout là-dedans:
Curseur = 0;
buffer[Curseur]++;
if( buffer[Curseur]>ChiffreFin )
{
do
{
buffer[++Curseur]++;
if( Curseur == max )
{
return ; // On a pas trouvé la combinaison
}
} while ( buffer[Curseur]>ChiffreFin );
memset(buffer,ChiffreDebut,Curseur);
}

signaler à un administrateur
Commentaire de black_onix le 26/05/2005 17:07:27

je ne programme pas en C++ mais je voudrai me servir de ton programme, comment puije changer le MD5 crypté a trouver?

signaler à un administrateur
Commentaire de Vishnouu le 11/07/2005 14:34:03

Avec rainbow crack, ça va 100x plus vite! Allez voir sur ce site
http://rc.plain-text.info/view.php?action=viewallhashes
ou celui la pour rainbowcrack, je sais pas exactement comment ca fonctionne, mais c'est bien plus rapide http://www.antsight.com/zsl/rainbowcrack/

signaler à un administrateur
Commentaire de pmadfm le 05/02/2007 03:03:44

Bonjour,

Attention le rainbowcrack, semble contenir des virus.

Méfiance.

CDT

signaler à un administrateur
Commentaire de swordfishP le 12/02/2007 01:24:56

Le coup des 1'331'000/s je n'y crois pas trop. Il doit y avoir une erreur
dans ta manière de mesurer le rendement :[

Avec un code en c# bien optimisé je ne dépasse pas les 80'000/s sur un p4 2.9
J'utilise la meme technique que celle cité par Kirua (la boucle commence par incrémenter à la fin et revient petit à petit vers le début)

Resultats en cherchant le pass kx5o,  c197617fbb2b1201045684af36f1699e
[a-z][0-9]         9s
[a-z][A-Z][0-9]   48s
Sachant que mes 'alphabets' sont dans l'ordre

signaler à un administrateur
Commentaire de f0xi le 14/02/2007 18:15:31 administrateur CS

Code marqué comme louche pour la raison de :

- mises en place et démonstration d'une technique de piratage.


merci pour votre compréhension.


par contre une ou deux precisions :

MD5 est un algorithme de hash, donc de "somme", pas de cryptage (qui n'est d'ailleur pas un terme exact, puisqu'en francais on dirait "Chiffrer" ou "Coder")
et aussi, on ne peu etre sur que le "pass" trouver est identique au "pass" original, on dirat donc qu'on a "generé une collision".

signaler à un administrateur
Commentaire de scelw le 17/02/2007 10:57:50

Pourquoi certains hashs md5 sont de la forme "$1$ZWnke0$1fzDBVjUcT1Mpdd4u/T961" et non "21232f297a57a5a743894a0e4a801fc3"?

A quoi correspond la forme "$1$XXXXXXXX..."?

merci pour vos indications!

signaler à un administrateur
Commentaire de Kirua le 17/02/2007 11:24:17

Ce n'est sûrement pas un hash md5: caractères alpha numérique minuscules et majuscules ainsi que / et $ ... La représentation standard d'un hash md5 c'est la valeur numérique écrite en base hexadécimale, donc sur 32 caractères pour 16 octets de données. Ca vient d'où ton machin ?

signaler à un administrateur
Commentaire de ccarniel le 17/02/2007 11:25:46

quelle est ta séquence utilisée pour obtenir un tel hash ?
un hash est toujours une séquence hexadécimale de 16 octets, donc 32 caractères allant de 0 à 9 ou de A à F;

signaler à un administrateur
Commentaire de OneHacker le 01/05/2007 18:20:36

C'est ça que t'apelle un HASH MD5 -> 95ebc3c7b3b9f1d2c40fec14415d3cb8 ?

Car ca en est pas un, par exemple le Hast de "TEST" c'est -> cGWfZKDZJ3uz0V9SFbpQqw==

signaler à un administrateur
Commentaire de pthc le 07/08/2007 00:51:31

swordfishP
Je ne sais pas, j'ai un petit doute d'avance sur les performances du C# mais à ce point...
Le code qui calcule le hash, est codé en C# ou ça fait appel à une librairie standard du C# ?

Je n'ai pas de quoi tester de codes ici vu que je n'ai que gcc, cependant le code de Clem semble correct, sachant que d'autres logiciels de crackage obtienne un résultat de 8 millions de hash testé par seconde (sur des processeurs plus modernes que l'époque bien sûr)
Il serait interessant de profiter des dual/quad cores aussi, on pourrait bénéficier d'un gain non négligeable sans trop de difficultés.



OneHacker
Tu confonds un peu tout là.
95ebc3c7b3b9f1d2c40fec14415d3cb8 est bien un hash md5. Ou plutôt sa représentation hexadécimale; un hash md5 est du binaire, sur 128 bits. Pour le rendre lisible dans la table ascii il y a plusieurs façons de le faire :
convertir ces 16 octets en héxadécimal, ce qui peut devenir quelque chose du genre 95ebc3c7b3b9f1d2c40fec14415d3cb8.
Mais on pourrait aussi utiliser la base64 ( http://en.wikipedia.org/wiki/Base64 ), ce qui donne quelque chose de plus court il faut l'admettre, mais aussi plus compliqué à utiliser.
La représentation en héxa est bien plus facile et du coup bien plus utilisée.

signaler à un administrateur
Commentaire de OneHacker le 07/08/2007 13:28:40

pourquoi alors chez moi ca fini toujours par == ? (j'utilise la lib de Codes Sources)

signaler à un administrateur
Commentaire de edouarddu01 le 30/09/2007 00:28:22

je suis un noob donc ma question va vous sembler idiote mais comment on fais pour ce servir de ce programme?
merci de pas trop me donner une reponse trop bete

signaler à un administrateur
Commentaire de nicobsa le 04/07/2008 21:37:27

Bonjour a tout le monde, pardonnez moi de rouvrir cela après près d'un an, mais je souhaiterais également savoir quels paramètres passer à ce programme pour le faire fonctionner, doit ont placer le Hash dans un fichier ?

Merci de toute réponse.
A bientot sur CS :-D

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

md5 etc.... [ par xlsd ] Salut, est il possible (oui forcement) d'utiliser md5 en C/C++ je n'arrive pas a trouvé les fonctions etc..merci :) Cryptage par l'algorithme MD5 [ par LSRS ] [red]Salut tout le monde!!!J'ai un problème avec l'algorithme MD5 de RSA... je voudrais bien comprendre le mécanisme avec lequel il travaille...En plu Le cryptage par MD5 de RSA [ par LSRS ] Salut tout le monde...J'ai un très grand problème avec l'algorithme de hachage MD5 qui réprésente le squelette de mon stage d'été... Je n'arrive pas à utilisation du fichier md5.h [ par flatmax ] salut a tousje viens de recuperer les fichiers md5.h, md5.cpp, et j'aimerais savoir comment m'en servir pour obtenir le hash md5 d'un mot.quels foncti cryptage md5 [ par laflef ] salut je cherche le code source de l'algorithme de cryptage md5 base sur le hachage inversible RAW SOCKET - IP - Sendto() - Erreur 'WSAEADDRNOTAVAIL' [ par dark1933 ] Salut à tous,J'essaye désespérément d'envoyer un Ping en forgeant le datagramme IP adéquat.J'obtiens l'erreur "WSAEADDRNOTAVAIL" au moment de l'appel md5 [ par coockiesch ] Hello!!!Je cherche une fonction qui produise le meme cryptage que la fonction md5 de PHP. C'est possible???Merci@++Raf"On dit que seulement 10 personn pb avec communication rs232 [ par kekenobi ] salut a tous et a toutes!voila j'ai un petit pb avec mon programme portant sur la communication RS232:en fait je reçoit une trame de 19 caractères et recvfrom et checksum [ par nyarzduk ] Bonjour,juste une petite question, est-ce-que la fonction recvfrom() réalise un contrôle sur la trame reçue (checksum) et si oui quel est le code d'er Faire marcher CryptAcquireContext [ par Nebula ] Bonsoir à tous !J'essaie actuellement d'utiliser les fonctions de cryptographie de Windows (ce qui m'intéresse est le calcul de hash MD5 ou SHA, pour


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.