IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

programme md5


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 20
    Par défaut programme md5
    Bonjour,
    Pour un devoir nous devons faire la fonction md5 en C.
    Ce programme est composé de 2 fonction.
    La première padd effectue le padding du message et la seconde empreinte effectue l'empreinte du message pour lequel le padding à déjà été effectué.

    Le problème est que la fonction empreinte doit recevoir en paramètre un tableau de caractère et la taille en octet de ce tableau. Sauf que le tableau que je renvoie fait 8 octet alors qu'il devrait en faire 64 (avec l'exemple du message bonjour).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
     
    #define ROTATION(x,n) ( ((x)<<(n)) | ((x)>>(32-(n))))
     
    //Initialisation de 4 fonctions non linéaire
    int fc_F(int x,int y,int z){
    	return ((x&y)|(~x&z));
    }
    int fc_G(int x,int y,int z){
    	return ((x&z)|(y&~z));
    }
    int fc_H(int x,int y,int z){
    	return (x^y^z);
    }
    int fc_I(int x,int y,int z){
    	return (y^(x|~z));
    }
     
     
    //fonction qui effectue le padding
    char* padding(char message[], int taille_message){
     
    	const int EMPLACEMENT = 8;
    	const char un='1';
     
     
    //calcule de la taille du tableau
    	int longueur_message=strlen(message);
    	int longueur_tableau=((((longueur_message + EMPLACEMENT)/64)+1)*64);
     
     
    //copie du message
    	char *padd=malloc(sizeof(char)*longueur_tableau);
     
     
    	for(int i=0;i<longueur_message;i++){
     
    		padd[i]=message[i];
    	}
     
    	padd[longueur_message]= un;
     
     
    //calcule du nombre de zéro à ajouter
     
    	for (int i=(longueur_message+1);i<longueur_tableau;i++)
     
    	{
    		padd[i]='0';
     
    	}
     
    // Ajouter la taille du message
     
    	int x =(longueur_tableau - EMPLACEMENT);
     
    	char taille[x];
     
    	sprintf(taille,"%d",taille_message);
    	int j=x;
     
    	for(int i=0; i<strlen(taille);i++)
    	{
    		padd[j]=taille[i];
    		j++;
    	}
     
        int b=sizeof (padd); // Ici il m'affiche 8 alors qu'il doit m'afficher 64
    	printf("%d",b);
     
     
    	return (padd);
    }
     
    //fonction qui renvoie l'empreinte d'une chaine de caractères entrée en paramètre
    char* empreinte(char message[], int taille){
     
    	//initialisation de variable
    	int i, j, g, f, temp, t;
    	const long int pow_2_32=4294967296;
     
    	//initialisation de 4 variables de 32 bits
    	int A=0x01234567;
    	int B=0x89abcdef;
    	int C=0xfedcba98;
    	int D=0x76543210;
     
    	//initialisation du nombre de paquet
    	long long nb_paquet=taille/64;
    	//printf("%d\n",nb_paquet);
     
    	//initialisation de w
    	char w[16]={0};
     
    	//initialisation de r
    	int r[64]={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
    	5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
    	4,11,16,23,4,11,16,23,4,11,16,23,4,11,26,23,
    	6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};
     
    	//initialisation de k
    	int k[64];
     
    	for(i=0; i<64 ; i++){
    		double si=sin(i+1);
    		double abso=fabs(si);
    		double  puissance=abso*pow_2_32;
    		k[i]= (int) floor(puissance);
    		//printf("%d\n",k[i]);
    	}
     
    	//boucle paquet par paquet
    	for(j=0; j<nb_paquet ; j++){
     
    		//subdivise chaque paquet en 16 mots de 32 bits
    		for (i=0; i<16 ;i++){
    			w[i]=message[j*16+i];
    			//printf("%d\n",w[i]);
    		}
     
    		//sauvegarde des variables
    		int AA=A;
    		int BB=B;
    		int CC=C;
    		int DD=D;
     
    		//boucle principal
    		for(i=0; i<64 ;i++){
    			if((i>=0) && (i<=15)){
    				f=fc_F(BB,CC,DD);
    				g=i;
    			}
    			else if((i>=16) && (i<=31)){
    				f=fc_G(BB,CC,DD);
    				g=(5*i+1)%16;
    			}
    			else if((i>=32) && (i<=47)){
    				f=fc_H(BB,CC,DD);
    				g=(3*i+5)%16;
    			}
    			else{
    				f=fc_I(BB,CC,DD);
    				g=(7*i)%16;
    			}
    			temp=DD;
    			DD=CC;
    			CC=BB;
    			BB=ROTATION(AA+f+k[i]+w[g],r[i])+BB;
    			AA=temp;
    		}
     
    		//reassignement des variables
    		A+=AA;
    		B+=BB;
    		C+=CC;
    		D+=DD;
    	}
    	// convertion des registres en chaines de caractères
    	char *emp=malloc(sizeof(char)*32);
    	sprintf(emp, "%x", A);
    	char ch1[24];
    	sprintf(ch1, "%x", B);
    	char ch2[16];
    	sprintf(ch2, "%x", C);
    	char ch3[8];
    	sprintf(ch3, "%x", D);
     
     
    	strcat(emp,strcat(ch1,strcat(ch2,ch3)));
     
    	return emp;
     
    }
     
     
    int main(){
    	char message[]="bonjour";
    	int taille = sizeof(message);
    	char *pad=padding(message, taille);
     
    	int taille_empreinte=sizeof(pad)*8;
    	char *hachage=empreinte(pad,taille_empreinte);
    	printf("%s \n",hachage);
    	free(pad);
    	free(hachage);
     
    }

    Voilà ! Pouvez-vous m'aider ??

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Citation Envoyé par e5mm100 Voir le message
    Sauf que le tableau que je renvoie fait 8 octet alors qu'il devrait en faire 64 (avec l'exemple du message bonjour).
    int b=sizeof (padd); // Ici il m'affiche 8 alors qu'il doit m'afficher 64.
    l'erreur de débutant.

    La taille d'1 pointeur c'est soit 4 (en 32 bits) soit 8 (en 64 bits).
    Tu ne peux pas connaitre la taille d'1 tableau sans transmettre sa taille (à moins d'être dans le même fichier source/ fonction avec la formule sizeof(tab) / sizeof( tab[0] ) si je ne me trompe pas )

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 20
    Par défaut
    merci pour votre réponse mais du coup si j'ai bien compris au moment du return de la fonction de padd je dois écrire
    return (padding,longueur_tableau);
    Sauf que le problème c'est que ma fonction empreinte est un fontion de type char*

  4. #4
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Houlà !!

    Le return ne retourne qu'un seul type de données (standard, ou un type que tu aurais définis préalablement au moyen de typedef).

    Donc le return (padding,longueur_tableau); ça ne fonctionnera pas au niveau de l'analyseur syntaxique et tu auras une erreur à la compilation.

    Si tu dois retourner l'ensemble, j'ai pas tout lu pour dire la vérité, il faudrait alors changer ton type de retour en une structure contenant la valeur de padding et la valeur de longueur_tableau.

    Du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct s_valeurs
    {
     ... _padding;   // ... pour le type de padding
     ... _longueur; // ... pour le type de longueur_tableau
    }t_valeurs;
    ...dans ta fonction tu remplaces char* par t_valeurs...

    ...dans le corps de la fonction tu crées un "objet" t_valeurs auquel tu assignerais les valeurs aux champs respectifs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    t_valeurs tmpValeurs={padding,longueur_tableau};
    return tmpValeurs;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (t_valeurs){padding,longueur_tableau};
    ...je sais pas si ma vision pourrait t'aider...

    [EDIT]
    Si tu dois connaître la taille (en caractères) d'un tableau de caractères (char*) ce serait strlen() qu'il faudrait utiliser et non sizeof() qui n'indique que la taille du type.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 20
    Par défaut
    Bonjour j'ai pris en compte en compte votre remarque et j'ai modifier mon programme pour que ma permière fonction renvois une structure avec la taille et le tableau. Cependant ça ne marche toujours pas.

    Je pense que le problème vient de la deuxième fonction. Tout marche mais je n'ai pas la bonne empreinte à la fin et je ne sais pas pourquoi .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
     
    #define ROTATION(x,n) ( ((x)<<(n)) | ((x)>>(32-(n))))
     
    //Initialisation de 4 fonctions non linéaire
    int fc_F(int x,int y,int z){
    	return ((x&y)|(~x&z));
    }
    int fc_G(int x,int y,int z){
    	return ((z&x)|(~z&y));
    }
    int fc_H(int x,int y,int z){
    	return (x^y^z);
    }
    int fc_I(int x,int y,int z){
    	return (y^(x|(~z)));
    }
     
    typedef struct Tableau
    {
        int longueur_tableau;
        char *padding;
    }Tableau;
     
    //fonction qui effectue le padding
    Tableau padd(char message[], int taille_message){
     
    	Tableau var;
     
    	const int EMPLACEMENT = 8;
    	const char un='1';
     
    //calcule de la taille du tableau
    	int longueur_message=strlen(message);
    	var.longueur_tableau=((((longueur_message + EMPLACEMENT)/64)+1)*64);
     
     
     
    //copie du message
    	var.padding=malloc(sizeof(char)*var.longueur_tableau);
     
     
    	for(int i=0;i<longueur_message;i++){
     
    		var.padding[i]=message[i];
    	}
     
    	var.padding[longueur_message]= un;
     
     
    //calcule du nombre de z�ro � ajouter
     
    	for (int i=(longueur_message+1);i<var.longueur_tableau;i++)
     
    	{
    		var.padding[i]='0';
     
    	}
     
    // Ajouter la taille du message
     
    	int x =(var.longueur_tableau - EMPLACEMENT);
     
    	char taille[x];
     
    	sprintf(taille,"%d",taille_message);
    	int j=x;
     
    	for(int i=0; i<strlen(taille);i++)
    	{
    		var.padding[j]=taille[i];
    		j++;
    	}
     
    	int a=sizeof(var.padding);
    	printf("%d",a);
     
     
    	return var;
    }
     
     
    //fonction qui renvoie l'empreinte d'une chaine de caractères entrée en paramètre
    char* empreinte(char message[], int taille){
     
    	//initialisation de variable
    	int i, j, g, f, temp;
    	const long long int pow_2_32=4294967296;
     
    	//initialisation de 4 variables de 32 bits
    	int A=0x01234567;
    	int B=0x89abcdef;
    	int C=0xfedcba98;
    	int D=0x76543210;
     
    	//initialisation du nombre de paquet
    	long long nb_paquet=taille/64;
    	//printf("%d\n",nb_paquet);
     
    	//initialisation de w
    	int w[16]={0};
     
    	//initialisation de r
    	int r[64]={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
    	5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
    	4,11,16,23,4,11,16,23,4,11,16,23,4,11,26,23,
    	6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};
     
    	//initialisation de k
    	int k[64];
     
    	for(i=0; i<64 ; i++){
    		double si=sin(i+1);
    		double abso=fabs(si);
    		double  puissance=(abso*pow_2_32);
    		k[i]= (int) floor(puissance);
    		//printf("%d\n",k[i]);
    	}
     
    	//boucle paquet par paquet
    	for(j=0; j<nb_paquet ; j++){
     
    		//subdivise chaque paquet en 16 mots de 32 bits
    		for (i=0; i<16 ;i++){
    			w[i]=message[j*16+i];
    			printf("%d\n",w[i]);
    		}
     
    		//sauvegarde des variables
    		int AA=A;
    		int BB=B;
    		int CC=C;
    		int DD=D;
     
    		//boucle principal
    		for(i=0; i<64 ;i++){
    			if((i>=0) && (i<=15)){
    				f=fc_F(BB,CC,DD);
    				g=i;
    			}
    			else if((i>=16) && (i<=31)){
    				f=fc_G(BB,CC,DD);
    				g=((5*i)+1)%16;
    			}
    			else if((i>=32) && (i<=47)){
    				f=fc_H(BB,CC,DD);
    				g=((3*i)+5)%16;
    			}
    			else{
    				f=fc_I(BB,CC,DD);
    				g=(7*i)%16;
    			}
    			temp=DD;
    			DD=CC;
    			CC=BB;
    			BB=ROTATION(AA+f+k[i]+w[g],r[i])+BB;
    			AA=temp;
    		}
     
    		//reassignement des variables
    		A+=AA;
    		B+=BB;
    		C+=CC;
    		D+=DD;
    	}
    	// convertion des registres en chaines de caractères
    	char *emp=malloc(sizeof(char)*32);
    	sprintf(emp, "%x", A);
    	char ch1[24];
    	sprintf(ch1, "%x", B);
    	char ch2[16];
    	sprintf(ch2, "%x", C);
    	char ch3[8];
    	sprintf(ch3, "%x", D);
     
     
    	strcat(emp,strcat(ch1,strcat(ch2,ch3)));
     
    	return emp;
     
    }
     
     
    int main(){
    	char message[]="bonjour";
    	int taille = sizeof(message);
    	Tableau tab = padd(message,taille);
     
     
     
    	char *hachage=empreinte(tab.padding,tab.longueur_tableau);
    	printf("%s \n",hachage);
    	free(hachage);
    }

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par e5mm100 Voir le message
    Je pense que le problème vient de la deuxième fonction. Tout marche mais je n'ai pas la bonne empreinte à la fin et je ne sais pas pourquoi .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	const char un='1';
     
    	for(int i=0;i<longueur_message;i++){
     
    		var.padding[i]='0';
    	}
    Je pense qu'un des soucis vient d'ici. Il ne faut pas confondre les caractères '0' ou '1' (respectivement 48 ou 49, sur 8 bits donc 00110000 et 00110001) avec des bits 0 ou 1 (donc 0 ou 1 sur un unique bit).
    Tu devrais utiliser memset() et memcpy() pour optimiser tes opérations de remplissage de zone...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Aide avec mon programme decryptage MD5
    Par hacker59 dans le forum VB.NET
    Réponses: 0
    Dernier message: 19/05/2013, 20h20
  2. Problème programmation md5
    Par deltabweb dans le forum Windows
    Réponses: 15
    Dernier message: 20/01/2008, 19h06
  3. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo