Code de Sha-1 en C

Fermé
quent57 - 12 janv. 2009 à 18:01
 loupius - 12 janv. 2009 à 18:33
Bonjour, j'ai éssayer de codé la fonctin de hachage sha1, mais je ne peut pas compiler pour l'instant, pouvez vous me dire ce que vous en pensez ?
Je me suis basé sur le pseudo code disponible sur wikidepia SHA-1
Merci d'avance !
ps : je ne peut compiler pour l'instant ...

Code : C

#include <stdio.h>

unsigned int left_rotate(unsigned int value, int shift) {
shift &= 31;
return (value << shift) | (value >> (32 - shift));
}

int main(int argc, char *argv[])
{
/*Déclaration des variables */
FILE* fichier = NULL;
unsigned h0, h1, h2, h3, h4;
unsigned A, B, C, D, E, F;
int lg = 0;
int zero_a_ajoute = 0;
int i,t,block;
int nb_de_block;
unsigned W[80], k;

fichier = fopen(argv[0],"rb");

h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
h4 = 0xC3D2E1F0;

///////////////// padding //////////////////

// compte le nombre de bit du fichier :
while fgetc(fichier) != EOF
lg ++;

lg *= 8; // un char pese 8 bit

fichier + lg + 1 = 0x1; // on écrit 1 aprés le fichier
zero_a_ajoute = ((lg + 1) + (512 - 448)) % 512; // on laisse la place pour rajouter la taille du fichier

for (i = 0 ; i < zero_a_ajoute ; i++)
fichier + lg + 1 + i = 0x0;

nb_de_block = ((lg + 1) + (512 - 448) / 512 + 1;

//////////////padding términé////////////////////////


for (block = 0 ; block <= nb_de_block ; block++)
{
for(t = 0; t < 16; t++) // casse le block en mot de 32-bit big-endian
{
w[t] = fichier[block * 512 + t * 4]) << 24;
w[t] |= fichier[block * 512 + t * 4 + 1]) << 16;
w[t] |= fichier[block * 512 + t * 4 + 2]) << 8;
w[t] |= fichier[block * 512 + t * 4 + 3]);
}

for (i = 16 ; i < 80 ; i++) //Extend the sixteen 32-bit words into eighty 32-bit words:
left_rotate(1,w[i] = (w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]));

/* Initialize hash value for this chunk: */
A = h0;
B = h1;
C = h2;
D = h3;
E = h4;

for (i = 0 ; i < 80 ; i++) // main loop
{
if (0<=i && i < 20) // on initialise les 19 premier mots
{
F = (B & C) | ((~ B) & D);
k = 0x5A827999;
}
else if (20 <= i && i < 40)
{
f = b ^ c ^ d; // ^ -> xor
k = 0x6ED9EBA1;
}
else if (40 <= i && i < 60)
{
f = (b & c) | (b & d) | (c & d);
k = 0x8F1BBCDC;
}
else if (60 <= i && i < 80)
{
f = b ^ c ^ d; // ^ -> xor
k = 0xCA62C1D6;
}

temp = left_rotate(5,A) + F + E + K + W[i];
E = D;
D = C;
C = left_rotate(30,B);
B = A;
A = temp;
}


h0 = h0 + A;
h1 = h1 + B;
h2 = h2 + C;
h3 = h3 + D;
h4 = h4 + E;
}

printf( "%08X %08X %08X %08X %08X",h0, h1, h2, h3, h4);
fclose(fichier);
return 0;
}


Merci d'avance !
A voir également:

1 réponse

Je pense que c'est du pseudo-language C ;=)))
Sur les lignes du genre:
'while fgetc(fichier) != EOF'
ou
'fichier + lg + 1 = 0x1;'
sans oublier l'oubli de bon nombre de déclarations,
c'est sûr que le compilateur va râler... mais ce n'est pas grave, il râle en silence.
0