Code de Sha-1 en C
quent57
-
loupius -
loupius -
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 !
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:
- Code de Sha-1 en C
- Code ascii - Guide
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages