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 ??