Red de conocimiento informático - Material del sitio web - Cómo obtener el hash SHA1 de un archivo usando C

Cómo obtener el hash SHA1 de un archivo usando C

Existe una función del algoritmo SHA1

Cópiala.

Luego abre el archivo, lee los datos y llama a la función SHA1.

#include?lt;stdio.hgt;

#include?lt;stdlib.hgt;

#include?lt;string.hgt;

p>

#include?lt;assert.hgt;

#include?

#include?lt;errno.hgt;

#undef?BIG_ENDIAN_HOST

typedef?unsigned?int?u32;

/******************

*?Rotar ?a?

#ifdefinido(__GNUC__)? amp ?definido(__i386__)

static?inline?u32

rol (?u32?x ,?int?n)

{

__asm__("roll?cl, 0"

: "=r"?(x )

: ¿"0"?(x), "c"?(n));

retorno?x;

}

#else

#define?rol(x,n)?(? ((x)?lt;lt;?(n))?|?((x)?gt;gt;? (32-(n )))?)

#endif

typedef?struct?{

u32?h0, h1, h2, h3, h4;

u32?nblocks;

unsigned?char?buf[64];

int?count;

}?SHA1_CONTEXT;

void

sha1_init(?SHA1_CONTEXT?*hd?)

{

hd-gt;h0?=?0x67452301;

hd-gt;h1?=?0xefcdab89;

hd-gt;h2?=?0x98badcfe;

hd-gt;h3?=?0x10325476;

hd-gt;h4?=?0xc3d2e1f0;

hd-gt;nblocks?=?0;

hd-gt;count?=?0;

}

/******************

*?Transformar?Palabra de 32 bits

*/

static?void

transform(?SHA1_CONTEXT?*hd,?unsigned?char?*data?)

{

u32 ?a, b, c, d, e, tm;

u32?x[16] / *Obtener el valor de la cadena. variable*/

a?=?hd-gt;h0;

b?=?hd-gt;h1;

c?=?hd- gt;h2;

d?=?hd-gt;h3;

e ?=?hd-gt;h4;

#ifdef?BIG_ENDIAN_HOST

memcpy(?x,?data,?64?);

#else

{

int?i;

¿sin firmar?

char?*p2;

for(i=0,?p2=(unsigned?char*)x;?i?lt;?16;?i,?p2? =?4 ?)?

{

p2[3]?*datos

p2[2]?*datos

p2[; 1]? =?*datos ;

p2[0]? =?*datos ;

}

}

#endif

#define?K1?0x5A827999L

#define?K2?0x6ED9EBA1L

#define?K3?0x8F1BBCDCL

#define?> #define?K4?0xCA62C1D6L

#define?F1(x,y,z)(?z?^?(?x?amp;?(?y?^?z?)?)?)

#define?F2(x,y,z)(?x?^?y?^?z?)

#define?F3(x,y,z)( ? (?x?amp;?y?)?|?(?z?amp;?(?x?|?y?)?) ?)

#define?F4(x,y, z)(?x?^?y?^?z?)

#define?M(i)?(?tm?=x[iamp;0x0f]?^?x[(i-14 )amp;0x0f]?\

^?x[(i-8)amp;0x0f]?^?x[(i-3)amp;0x0f]?

, ? (x[iamp;0x0f]? =?rol(tm,1))?

#define?R(a,b,c,d,e,f,k,m)?do? {?e? =?rol(?a,?5?)?\

?f(?b,?c,?d?)?

?k ?

?m; ?

b?=?rol(?b,?30?);\

}?mientras(0)

R(?a,?b,?c,?d,?e,?F1,?K1,?x[?0]?);

R(?e,?a,?b ,?c,?d,?F1,?K1,?x[?1]?) ;

R(?d,?e,?a,?b,?c,?F1,? K1,?x[?2]?);

R(?c,?d,?e,?a,?b,?F1,?K1,?x[?3]?);

R(?b,?c,?d,?e,?a,?F1,?K1,?x[?4]?);

R(?a ,?b,?c,?d,?e,?F1,?K1,?x[?5]?) ;

R(?e,?a,?b,?c,? d,?F1,?K1,?x[?6]?) ;

R(?d,?e,?a,?b,?c,?F1,?K1,?x[ ?7]?) ;

R(?c,?d,?e,?a,?b,?F1,?K1,?x[?8]?) ;

R(?b,?c,?d,?e,?a,?F1,?K1,?x[?9]?

R(?

);

R(?a,?b,?c,?d,?e,?F1,?K1,?x[10]?

R(?e,?a,?) b,?c,?d,?F1,?K1,?x[11]?);

R(?d,?e,?a,?b,?c,?F1,? K1,?x[12]?)

R(?c,?d,?e,?a,?b,?F1,?K1,?x[13]?)

R(?b ,?c,?d,?e,?a,?F1,?K1,?x[14]?

R(?a,?b,?c,?d,?e); ,?F1,?K1,?x[14]?)

R(?e,?F1,?K1,?x[15]?) ;

R( ?e, ?a, ?b, ?c, ?d, ?F1, ?K1, ?M(16)?) ;

R(?d, ?e, ?a, ?b, ?c, ?F1, ?K1, ?M(17)?) ;

R(?c, ?d, ?e, ?a, ?b, ?F1, ?K1, ?M( 18)?) ;

R(?b,?c,?d,?e,?a,?F1,?K1,?M(19)?) ;

R(?a,?b,?c,?d,?e,?F2,?K2,?M(20)?);

R(?

R( ?d, ?e, ?a, ?b, ?c, ?d, ?F2, ?K2, ?M(21)?

R(?d, ?e, ?a, ?b, ?c, ?F2, ?K2, ?M(22)?

R(?c, ?d, ?e, ?a, ?b, ?F2, ?K2, ?M(23)?);

R(?);

R(?b, ?c, ?d, ?e, ?a, ?F2, ?K2, ?M(24)?

R(?a, ?b, ?c, ?d, ?e, ?F2, ?K2, ?M(25)?

R(?e,?a,?b,?c,?d,?F2,?K2,?M(26)?;

R(?d,?e,? a,?b,?c,?F2,?K2,?M(27)?);

R(?c,?d,?e,?a,?b,?F2,? K2,?M(28)?);

R(?b,?c,?d,?e,?a,?F2,?K2,?M(29)?K2,?M (29)?);

R(?a,?b,?c,?d,?e,?F2,?K2,?M(30)?); > R(?e,?a,?b,?c,?d,?F2,?K2,?M(31)?

R(?d,?e,?a, ?b, ?c, ?F2, ?K2, ?M(32)?) ;

R(?c, ?d, ?e, ?a, ?b, ?F2, ?K2, ?M(33)?) ;

R(?b,?c,?d,?e,?a,?F2,?K2,?M(34)?) ;

R(?a,?b,?

R(?e,?a,?b,?c,?d,?e,?F2,?K2,?M(35) ?);

R(?e,?a,?b,?c,?d,?F2,?K2,?M(36)?); ?d, ?e, ?a, ?b, ?c, ?F2, ?K2, ?M(37)?;

R(?

R(?b) ,?c,?d,?e,?a,?b,?F2,?K2,?M(38)?

R(?b,?c,?d,?e) ,?a,?F2,?K2,?M(39)?

R(?a,?b,?c,?d,?e,?F3,?K3,?M (40)?);

R(?);

R(?e,?a,?b,?c,?d,?F3,?K3,?M (41)?);

R

(?d,?e,?a,?b,?c,?F3,?K3,?M(42)?

R(?c,?d,?e,?a) ,?b,?F3,?K3,?M(43)?;

R(?M(43)?

R(?b,?c, ?d, ?e, ?a, ?F3, ?K3, ?M(44)?

R(?a, ?b, ?c, ?d, ?e, ?F3, ?K3, ?M(45)?);

R(?e, ?a, ?b, ?c, ?d, ?F3, ?K3, ?M(46)?) ;

R(?d,?e,?a,?b,?c,?F3,?K3,?M(47)?);

R(?c,? d,?e,?a,?b,?F3,?K3,?M(48)?) ;

R(?b,?c,?d,?e,?a,? F3,?K3,?M(49)?);

R(?a,?b,?c,?d,?e,?F3,?K3,?M(50)?) ;

R(?e,?a,?b,?c,?d,?F3,?K3,?M(51)?) ;

R(?d ,?e,?a,?b,?c,?F3,?K3,?M(52)?

R(?c,?d,?e,?a,?b ,?F3,?K3,?M(53)?);

R(?b,?c,?d,?e,?a,?F3,?K3,?M(54) ?);

R(?);

R(?a, ?b, ?c, ?d, ?e, ?F3, ?K3, ?M(55) ?) ;

R(?e,?a,?b,?c,?d,?F3,?K3,?M(56)?) ;

R( ?d, ?e, ?a, ?b, ?c, ?F3, ?K3, ?M(57)?);

R(?M(57)?);

R(?c,?d,?e,?a,?b,?F3,?K3,?M(58)?);

R(?b,?c,? d,?e,?a,?F3,?K3,?M(59)?) ;

R(?a,?b,?c,?d,?e,?F4,? K4,?M(60)?);

R(?F4,?K4,?M(60)?);

R(?e,?a,?b ,?c,?d,?F4,?K4,?M(61)?) ;

R(?d,?e,?a,?b,?c,?F4,?K4 ,?M(62)?);

R(?c,?d,?e,?a,?b,?F4,?K4,?M(63)?); >

R(?b,?c,?d,?e,?a,?F4,?K4,?M(64)?

R(?a,?b, ?c, ?d, ?e, ?F4, ?K4, ?M(65)?

R(?e, ?a, ?b, ?c, ?d, ?F4, ?K4, ?M(66)?) ;

R(?d, ?e, ?a, ?b, ?c, ?F4, ?K4, ?M(67)?) ;

R(?c,?d,?e,?a,?b,?F4,?K4,?M(68)?);

R(?R(? a,?b,?c,?d,?e,?a,?F4,?K4,?M(69)?;

R(?a,?b,?c,? d,?e,?F4,?K4,?M(70)?);

R(?e,?a,?b,?c,?d,?F4,?K4,? M(71)?);

R(?);

>

R(?d,?e,?a,?b,?c,?F4,?K4,?M(72)?);

R(?c,?d, ?e, ?a, ?b, ?F4, ?K4, ?M(73)?) ;

R(?b, ?c, ?d, ?e, ?a, ?F4, ?K4, ?M(74)?);

R(?M(74)?);

R(?a, ?b, ?c, ?d, ? e,?F4,?K4,?M(75)?;

R(?e,?a,?b,?c,?d,?F4,?K4,?M(76)? )??

R(?d,?e,?a,?b,?c,?F4,?K4,?M(77)?K4,?M(77)?);

R(?c,?d,?e,?a,?b,?F4,?K4,?M(78)?);

R(?b, ?c, ?d, ?e, ?a, ?F4, ?K4, ?M(79)?) ;

/*?encadenamiento?vars?*/

hd -gt; h0? =?a;

hd-gt; h1? =?b;

hd-gt; hd-gt; h3? =?d;

hd-gt; h4? =?e;

}

/* Utilice INBUF con longitud INLEN de mensajes de actualización de contenido. void

sha1_write(?SHA1_CONTEXT?*hd,?unsigned?char?*inbuf,?size_t?inlen)

{

if(?hd-gt ;count?==?64?)?{

if(?hd-gt; count?=?0;

hd-gt;nblocks ;

}

if(? !inbuf?)

return;

if(?hd-gt; count?)?{

for(?;?inlen?amp;amp;?hd-gt;count?lt;?64;?inlen--?)

hd-gt;buf[hd-gt;count]? =?*inbuf;

sha1_write(?hd,?NULL,?0?);

if(? !inlen?)

retorno; p>

}

while(?inlen?gt;=?64?)?{

transform(?hd,?inbuf?);

hd-gt;count?=?0;

hd-gt;nblocks;

inlen?=?64;

inbuf?=? 64;

}

para(?;?inlen?amp;amp;?hd-gt;count?lt;?64;?inlen--?)

hd -gt ;buf[hd-gt;count]? =?*inbuf ;

}

/* Esta rutina finalmente finaliza el cálculo y devuelve un resumen

<. p>* El controlador está listo para un nuevo bucle, pero agregar bytes al

* controlador dañará el búfer devuelto

* Devuelve: 20 bytes que representan el resumen.

*/

estática?/*?flush?*/;

t?=?hd-gt;nblocks;

/*?*/

lsb = tlt;lt;?6;

msb = tgt;gt;?26;

/*¿Agregar los recuentos? */

t?=?lsb;

if (? (lsb? =?hd-gt; count)? lt;?t?)

msb;

/*?Multiplicar por?{? /*?enough?room?*/

hd-gt;buf[hd-gt;count] =?0x80; ?/*?pad?*/

while(?hd-gt;count?lt;?56?)

hd-gt;buf[hd-gt;count]? =?0;?/*?pad?*/

}

else?{? /*?need?one?extra?block?*/

hd-gt;buf[hd-gt;count]? =?0x80;?/*?pad?character?*/

while(?hd-gt;count?lt;?64?)

hd-gt;buf[hd-gt;count]? =?0;

sha1_write(hd,?NULL,?0);?/*?flush?*/ ;

memset(hd-gt;buf,?0,?56?);?/* Llene el siguiente bloque de datos con ceros*/

}

/* Agregar recuento de 64 bits*/

hd-gt;buf[56]? =?msb?gt;gt;?24;

hd-gt;buf[ 57 ]?=?msb?gt;gt;?16;

hd-gt;buf[58]?=?msb?gt;gt;?8;

hd- gt ;buf[59]? =?msb;

hd-gt;buf[60]? =?lsb?gt;?24;

hd-gt;buf [ 61]?=?lsb?gt;gt;?16;

hd-gt;buf[62]?=?lsb?gt;gt;?8;

hd - gt;buf[63]? =?lsb;

transformar(?hd,?hd-gt;buf?);

p?=?hd-gt;buf;

#ifdef?BIG_ENDIAN_HOST

#define? while(0)

#else?/*?*p ?hd-gt;h## a ?gt;gt;?16;?

*p ? =?hd-gt;h##a?gt;gt;?8;?*p ? # a;?}? while(0)

#endif

X(0);

X(1);

X (2);

X(3);

X(4);

#undef?

;