quent57 | Bonjour, j'ai essayer de codé la fonction 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 http://en.wikipedia.org/wiki/SHA_hash_functions
Merci d'avance !
Code : C
Code :
- #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;
- }
|
|