J'éssai de coder sha1 en C !

J'éssai de coder sha1 en C ! - C - Programmation

Marsh Posté le 12-01-2009 à 18:10:18    

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 :
  1. #include <stdio.h>
  2. unsigned int left_rotate(unsigned int value, int shift) {
  3. shift &= 31;
  4. return (value << shift) | (value >> (32 - shift));
  5. }
  6. int main(int argc, char *argv[])
  7. {
  8. /*Déclaration des variables */
  9. FILE*      fichier = NULL;
  10. unsigned   h0, h1, h2, h3, h4;
  11. unsigned   A, B, C, D, E, F;
  12. int        lg = 0;
  13. int        zero_a_ajoute = 0;
  14. int        i,t,block;
  15. int        nb_de_block;
  16. unsigned   W[80], k;
  17. fichier = fopen(argv[0],"rb" );
  18. h0 = 0x67452301;
  19. h1 = 0xEFCDAB89;
  20. h2 = 0x98BADCFE;
  21. h3 = 0x10325476;
  22. h4 = 0xC3D2E1F0;
  23. /////////////////  padding //////////////////
  24. // compte le nombre de bit du fichier :  
  25. while fgetc(fichier) != EOF
  26.  lg ++;
  27. lg *= 8; // un char pese 8 bit
  28. fichier + lg + 1 = 0x1; // on écrit 1 aprés le fichier
  29. zero_a_ajoute = ((lg + 1) + (512 - 448)) % 512; // on laisse la place pour rajouter la taille du fichier
  30. for (i = 0 ; i < zero_a_ajoute ; i++)
  31.  fichier + lg + 1 + i = 0x0;
  32. nb_de_block = ((lg + 1) + (512 - 448) / 512 + 1;
  33. //////////////padding términé////////////////////////
  34. for (block = 0 ; block <= nb_de_block ; block++)
  35. {
  36.  for(t = 0; t < 16; t++) // casse le block en mot de  32-bit big-endian  
  37.  {
  38.   w[t] = fichier[block * 512 + t * 4]) << 24;
  39.   w[t] |= fichier[block * 512 + t * 4 + 1]) << 16;
  40.   w[t] |= fichier[block * 512 + t * 4 + 2]) << 8;
  41.   w[t] |= fichier[block * 512 + t * 4 + 3]);
  42.  }
  43.  for (i = 16 ; i < 80 ; i++) //Extend the sixteen 32-bit words into eighty 32-bit words:
  44.   left_rotate(1,w[i] = (w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]));
  45.  /*  Initialize hash value for this chunk: */
  46.  A = h0;
  47.  B = h1;
  48.  C = h2;
  49.  D = h3;
  50.  E = h4;
  51.  for (i = 0 ; i < 80 ; i++) // main loop
  52.  {
  53.   if (0<=i && i < 20) // on initialise les 19 premier mots
  54.   {
  55.    F = (B & C) | ((~ B) & D);
  56.    k = 0x5A827999;
  57.   }
  58.   else if (20 <= i && i < 40)
  59.   {
  60.    f = b ^ c ^ d; // ^ -> xor
  61.    k = 0x6ED9EBA1;
  62.   }
  63.   else if (40 <= i && i < 60)
  64.   {
  65.    f = (b & c) | (b & d) | (c & d);
  66.    k = 0x8F1BBCDC;
  67.   }
  68.   else if (60 <= i && i < 80)
  69.   {
  70.    f = b ^ c ^ d; // ^ -> xor
  71.    k = 0xCA62C1D6;
  72.   }
  73.   temp = left_rotate(5,A) + F + E + K + W[i];
  74.   E = D;
  75.   D = C;
  76.   C = left_rotate(30,B);
  77.   B = A;
  78.   A = temp;
  79.  }
  80.  h0 = h0 + A;
  81.  h1 = h1 + B;
  82.  h2 = h2 + C;
  83.  h3 = h3 + D;
  84.  h4 = h4 + E;
  85. }
  86. printf( "%08X %08X %08X %08X %08X",h0, h1, h2, h3, h4);
  87. fclose(fichier);
  88. return 0;
  89. }


Reply

Marsh Posté le 12-01-2009 à 18:10:18   

Reply

Marsh Posté le 12-01-2009 à 19:30:46    

Oué, y a encore du boulot pour avoir un truc compilable.
 
Quelques remarques:
 

  • Pour avoir la taille d'un fichier utilise plutôt un code du genre, plutôt que de parcourir les octets du fichier un à un (et relis la syntaxe du while) :

    Code :
    1. fseek(fichier, 0, SEEK_END);
    2. lg = ftell(fichier);
    3. fseek(fichier, 0, SEEK_SET);

  • En fait, j'ai l'impression que tu n'as strictement rien compris de comment gérer des fichiers en C. Ta manière de manipuler le fichier est complètement farfelue, remet tout à plat.


Edit: bon, en fait, c'est possible de manipuler directement le contenu du fichier comme un tableau de caractère comme tu le fais. Mais c'est un concept relativement avancé, et si tu en as connaissance, tu ne posterais sans doute pas dans ce forum.

Message cité 2 fois
Message édité par tpierron le 12-01-2009 à 19:40:14
Reply

Marsh Posté le 12-01-2009 à 19:52:50    

quent57 a écrit :

Bonjour, j'ai essayer de codé la fonction de hachage sha1


Pourquoi?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 20:17:52    

Merci pour vos réponses !
 

tpierron a écrit :

Oué, y a encore du boulot pour avoir un truc compilable.
 
Quelques remarques:
 

  • Pour avoir la taille d'un fichier utilise plutôt un code du genre, plutôt que de parcourir les octets du fichier un à un (et relis la syntaxe du while) :

    Code :
    1. fseek(fichier, 0, SEEK_END);
    2. lg = ftell(fichier);
    3. fseek(fichier, 0, SEEK_SET);

  • En fait, j'ai l'impression que tu n'as strictement rien compris de comment gérer des fichiers en C. Ta manière de manipuler le fichier est complètement farfelue, remet tout à plat.


Edit: bon, en fait, c'est possible de manipuler directement le contenu du fichier comme un tableau de caractère comme tu le fais. Mais c'est un concept relativement avancé, et si tu en as connaissance, tu ne posterais sans doute pas dans ce forum.


Bon alors, ok pour la taille d'un fichier, je fait des recherches sur la syntaxe de tes trois fonction (ou si tu veux m'en dire plus ?)
Sinon j'ai pas compris grand choses à la manipulation de fichiers c'est vrai,  
en faite je me suis inspiré d'une autre implantation de sha-1, trouvé sur le net, qui utilisai ce concept ('fichier +1' etc)
Je me suis dis que c'était logique vu que fichier est un pointeur, et comme je manipule des bit, ba sa fait une case dans la mémoire vive, on peut donc directement ajouter 1 au pointeur fichier ..., pour avoir le bit d'aprés
 
Aurai tu d'autre conseil ?
Je suis enfin chez moi, je vais pouvoir compiler !!
 


Pour la fac ^^


Message édité par quent57 le 12-01-2009 à 20:19:01
Reply

Marsh Posté le 13-01-2009 à 10:25:39    

tpierron a écrit :

Code :
  1. fseek(fichier, 0, SEEK_END);
  2. lg = ftell(fichier);
  3. fseek(fichier, 0, SEEK_SET);




 
Attention aux fichiers de plus de 4Go ...


---------------
last.fm
Reply

Marsh Posté le 13-01-2009 à 15:12:14    

theshockwave a écrit :

Attention aux fichiers de plus de 4Go ...


Arf, exact. Il y a pour cela les fonction fseeko et ftello qui retournent un off_t au lieu de long. Mais c'est du POSIX, et non plus du C.

Reply

Marsh Posté le 13-01-2009 à 15:23:08    

Oui, quel intéret de réinventer la roue ?
Ca a déjà été fait il y a plus de 20 ans.
36000 codes en C sur le Web.

Reply

Marsh Posté le 13-01-2009 à 15:44:42    

L'intéret est de s'entrainer a coder je suppose, on ne peut inventer des choses sans savoir comment les algorytmes existants marchent je pense !  
Sinon je répète que c'est pour la fac !  
Je testerai votre bout de code bientot, la jsuis en pleine periode de partiel ....
Merci pour vos conseils !

Reply

Marsh Posté le 13-01-2009 à 16:14:40    

Hmm, le seul bout de code qui a été présenté, c'est une autre façon de calculer la taille d'un fichier, et il est sans intérêt.
 
Ta boucle de lecture du fichier est de toute façon pas terrible, tu n'as pas besoin de la taille du fichier. Pour calculer le SHA1, lit le fichier par bloc (car de toute façon, c'est comme ça que travaille l'algo du SHA1), si la quantité de données lues est inférieure à la taille du bloc, rajoute des 0 à la fin du bloc. Voilà, pas besoin de connaitre la taille du fichier.

Reply

Marsh Posté le 13-01-2009 à 17:59:44    

Oui je veux bien mais comment puis-je lire le fichier par bloc ?, je teste les 512 prochain bit a chaque foi ? ( a chaque itération)

Reply

Marsh Posté le 13-01-2009 à 17:59:44   

Reply

Marsh Posté le 13-01-2009 à 19:25:45    

fread et plus généralement la biliothèque stdio, qui est la base minimale du C.

Reply

Marsh Posté le 14-01-2009 à 09:18:49    

quent57 a écrit :

algorytmes

 


aaaaaaaah mes yeux  :cry:


Message édité par jagstang le 14-01-2009 à 09:18:56

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed