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>
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; p>
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 ? p>
?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> 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?
;