Portál AbcLinuxu, 2. listopadu 2025 03:18
pochuťiť.
SHA1_Init(&c); SHA1_Update(&c,password,(unsigned long)strlen(password)); SHA1_Final(sha1,&c);Už ani nemá cenu číst dál, protože v článku je jasně naznačen špatný způsob programování. strlen totiž vrací size_t a né unsigned long a nelze spoléhat na to, že size_t je stejně velký jako unsigned long. Pokud SHA1_Update opravdu chce unsigned long jako argument znamenající velikost bufferu, pak je to špatně navržená funkce.
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);(teda aspoň v sha.h, v nápovede je stále unsigned long)
sha je pole 32 znaku. ne vsude je znak bajtovy.
#include "gcrypt.h" //...etc..
gcry_md_hd_t digest=0;
int num;
char buffer[4096];
FILE*instream=fopen("foo","rb");
gcry_md_open(&digest,GCRY_MD_SHA1,0);
while ((num = fread(buffer, 1, 4096, instream)) != 0)
gcry_md_write (digest, buffer, num);
char * result = gcry_md_read (digest,0);
for(num=0; gcry_md_get_algo_dlen (GCRY_MD_SHA1) > num ; ++num)
printf ("%02x",result[num]);
printf ("\n");
gcry_md_close (digest);
a nekamenujte me jestli vam to nepude skompilit napoprvy, psal sem to skoro zpameti.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.