Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

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



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.