Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1345 connectés 

  FORUM HardWare.fr
  Programmation
  C

  J'éssai de coder sha1 en C !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

J'éssai de coder sha1 en C !

n°1837019
quent57
Posté le 12-01-2009 à 18:10:18  profilanswer
 

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. }


mood
Publicité
Posté le 12-01-2009 à 18:10:18  profilanswer
 

n°1837058
tpierron
Posté le 12-01-2009 à 19:30:46  profilanswer
 

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
n°1837067
masklinn
í dag viðrar vel til loftárása
Posté le 12-01-2009 à 19:52:50  profilanswer
 

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
n°1837075
quent57
Posté le 12-01-2009 à 20:17:52  profilanswer
 

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
n°1837195
theshockwa​ve
I work at a firm named Koslow
Posté le 13-01-2009 à 10:25:39  profilanswer
 

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
n°1837371
tpierron
Posté le 13-01-2009 à 15:12:14  profilanswer
 

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.

n°1837382
Stephen135
Posté le 13-01-2009 à 15:23:08  profilanswer
 

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.

n°1837393
quent57
Posté le 13-01-2009 à 15:44:42  profilanswer
 

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 !

n°1837415
tpierron
Posté le 13-01-2009 à 16:14:40  profilanswer
 

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.

n°1837520
quent57
Posté le 13-01-2009 à 17:59:44  profilanswer
 

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)

mood
Publicité
Posté le 13-01-2009 à 17:59:44  profilanswer
 

n°1837560
tpierron
Posté le 13-01-2009 à 19:25:45  profilanswer
 

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

n°1837685
jagstang
Pa Capona ಠ_ಠ
Posté le 14-01-2009 à 09:18:49  profilanswer
 

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?  

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  J'éssai de coder sha1 en C !

 

Sujets relatifs
[C] Conversion Hexa vers ASCIIB. Stroustrup - Programming: Principles and Practice Using C++
[C / OpenGL] Comment faire un deplacement libre (si possible: freefly[C] Savoir si un type de fichier est présent dans un répertoir
[C]programme affichant la suite d'operation pour trier une liste.[C] boucle de lecture streaming audio
[Résolu][C] probleme avec une macro[HELP] Communiquer en C/C++ avec des API Siemens S5
Erreur dans un programme basique en C[C] Interrompre une fonction qui attend une action utilisateur
Plus de sujets relatifs à : J'éssai de coder sha1 en C !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR