Re: lug-bg: md5 digest + openssl
- Subject: Re: lug-bg: md5 digest + openssl
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Mon, 28 Feb 2005 14:52:25 +0200
On Mon, Feb 28, 2005 at 02:27:27PM +0200, Aleksandar Valchev wrote:
> Здравейте,
> Опитвам се да пресметна md5 сума на файл с помоща на openssl.
>
> В EVP_DigestUpdate(3) е даден малък пример. Аз го използвах и допълних малко
> т.е. чета съдържанието на файл(подаден като аргумент) и търся md5 сумата.
> Разбира се, че нещо не стана както трябва. Когато пресметна md5 сума на файл,
> с долния пример, ми излиза различна сума от пресметната с md5sum програмата.
>
> Подобен проблем видях при Java, който май беше свързан с encoding-а. Мисля си,
> че тук проблема може да идва от начина по който чета файла (би трябвало
> грешката да идва от грешни входни данни). При инициализирането и използването
> на функциите на openssl библиотеката не виждам да има нещо грешно.
[snip]
> while (!feof(f)) {
> fscanf(f, "%s", buffer);
> printf("%s\n", buffer);
> EVP_DigestUpdate(&mdctx, buffer, strlen(buffer));
> }
Функцията fscanf() всъщност не е най-добрият начин за четене в твоя
случай, а честно казано, рядко изобщо е най-добрия начин за каквото и да
е четене :)
Основният проблем в твоя случай можеш да видиш и сам, като погледнеш
разликата между format strings, които ползваш за fscanf() и за printf()
на следващия ред. Каква е разликата? При printf() ти се налага да
добавиш един символ за нов ред, защото... ами защото fscanf() не ти го
връща!
Проблемът е точно в това - fscanf() ти връща само някакви парчета от
съдържанието на файла, които в повечето случаи са горе-долу това, което
се намира между два whitespace разделителя - символ за нов ред,
интервал, табулация, или каквото още й хрумне на системата и на
библиотеката stdio. Е да де, ама това значи, че когато пресмяташ MD5
сумата, ти НЕ включваш тези whitespace разделители! Всъщност ти
пресмяташ MD5 сумата на файл, който би се получил, ако от оригиналния
файл *изтриеш* тези символи за нов ред и другите, на които fscanf() се
спира.
Правилният начин за действие в случая е да не ползваш fscanf(), а да я
заместиш с fread() примерно:
char buffer[512];
size_t n;
while ((n = fread(buffer, 1, sizeof(buffer))) > 0) {
EVP_DigestUpdate(&mdctx, buffer, n);
}
Това би трябвало да помогне; пробвай.
Поздрави,
Петър
--
Peter Pentchev roam@xxxxxxxxxxx roam@xxxxxxxx roam@xxxxxxxxxxx
PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
because I didn't think of a good beginning of it.
Attachment:
pgplcLg38xZKP.pgp
Description: PGP signature
|