Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.14;
Скачать: CL | DM;

Вниз

SHA-1   Найти похожие ветки 

 
POP   (2008-02-27 21:57) [0]

Пытаюсь использовать вот этот модуль - http://www.koders.com/delphi/fid872E48EC7C07A22D798357AEC0BABAC9E52BD5AE.aspx?s=sha1

Но прога вылетает с ошибкой "Integer Overflow" в функции SHA1Compress.

То есть даже встроенная в модуль функция SHA1SelfTest для теста не выполняется.

Использую Delphi7se.

Может кто сталкивался с такой ошибкой в этом модуле?

Посоветуйте какой-нибудь другой модуль для получения SHA-1 хеша для буфера байт.


 
Amoeba ©   (2008-02-27 23:21) [1]

А отладчик на что существует? Пройдись под ним, и тогда поймешь, то ли не умеешь готовить SHA1Compress, то ли на самом деле библиотека кривая, и ее надо править.


 
Германн ©   (2008-02-28 01:35) [2]


> Amoeba ©   (27.02.08 23:21) [1]

Скорее всего он не умеет или не хочет связываться с отладчиком.


 
TSHA1Context   (2008-02-28 12:24) [3]

У меня этот модуль работает под D3:

uses sha1;

var SH:TSHA1Context;

procedure TForm1.FormCreate(Sender: TObject);
var s:String;         FS:TFileStream; D:TSHA1Digest;  i:integer;
begin
 S:="abc";

 SHA1Init(SH);
 SHA1Update(SH,Pointer(S),Length(S));// OR  SHA1Update(SH,@S[1],Length(S));
 SHA1Final(SH,D);

 Caption:=S;

 FS:=TFileStream.Create("outrrr.txt",fmCreate or fmopEnWrite) ;
 try
   FS.WriteBuffer(D,sizeof(D));
 finally
   FS.Free;
 end;
 FS:=TFileStream.Create("outsss.txt",fmCreate or fmopEnWrite) ;

 try
   FS.WriteBuffer(Pointer(S)^,Length(S));
 finally
   FS.Free;
 end;

 S:="";
 if SHA1SelfTest then Caption:="OK - ";
 for i:=0 to 19 do S:=S+IntToHex(D[i],2);
 Caption:=Caption+s;

end;


Я внёс а модуль некоторые изменения:



uses  Sysutils;//, Tools;

//реализация функции LRot32:
function LRot32(a:integer;b:integer):integer;
begin
 result:=(a shl b) or (a shr (32-b));
end;


 
Amoeba ©   (2008-02-28 12:40) [4]


> //реализация функции LRot32:
> function LRot32(a:integer;b:integer):integer;
> begin
>  result:=(a shl b) or (a shr (32-b));
> end;

Это имеется в виду операция циклического сдвига? Если да, то стоит переписать на asm"е

function LRot32(a:integer;b:integer):integer;
asm
  rol a, b
end;


 
Amoeba ©   (2008-02-28 12:44) [5]

Правильно будет так:

function LRot32(a:integer;b:integer):integer;
asm
       MOV     CL,DL
       ROL     EAX,CL
end;


 
POP   (2008-03-01 00:43) [6]


> Я внёс а модуль некоторые изменения:uses  Sysutils;//, Tools;
> //реализация функции LRot32:function LRot32(a:integer;b:
> integer):integer;begin  result:=(a shl b) or (a shr (32-
> b));end;


А зачем ты эти изменения внес?

Там и так две строки всего:

mov ecx, edx
rol eax, cl

PS. Проблема решилась диррективой {$Q-}


 
Германн ©   (2008-03-01 01:12) [7]


> PS. Проблема решилась диррективой {$Q-}
>

Эээ. А ты уверен что проблема решилась? Ведь этой директивой ты всего лишь отключил проверку на Integer Overflow.


 
Anatoly Podgoretsky ©   (2008-03-01 01:33) [8]

> Германн  (01.03.2008 01:12:07)  [7]

А он верный последователь Вредных Советов, подавить ошибку, что бы программа работала без ошибки.

Это же умно.


 
Германн ©   (2008-03-01 02:13) [9]


> Anatoly Podgoretsky ©   (01.03.08 01:33) [8]

Угу. Это Кул!


 
POP   (2008-03-01 14:32) [10]


> Эээ. А ты уверен что проблема решилась? Ведь этой директивой
> ты всего лишь отключил проверку на Integer Overflow.


Я об этом знаю. Но мне сказали, в этой реализации SHA-1 переполнение это нормально. Подсказали вот здесь - http://forum.sources.ru/index.php?showtopic=225477

Пришлось поверить на слово, считает хэш верно пока.


 
TSHA1Context   (2008-03-01 14:39) [11]

>А зачем ты эти изменения внес?

У меня D3.

Там ещё нужно добавить тип:


type
 DWord=integer;


 
POP   (2008-03-01 18:05) [12]


> У меня D3.Там ещё нужно добавить тип:type  DWord=integer;


В модуле Tools.pas используется такая директива:

{$IFDEF VER120}
 dword= longword;
{$ELSE}
 dword= longint;
{$ENDIF}

Но у меня с ней не компилировалась программа, выскакивала какая-то ошибка в моем модуле.

Пришлось эту директиву убрать и в модулях sha1 и tools добавить в uses модуль Windows, чтобы комилилось все.

Скажи, это имеет отношение к тому что ты говоришь? У меня Delphi7.

Я сам не уверен.. как бы логика работы не нарушилась.


 
TSHA1Context   (2008-03-02 14:20) [13]

>Скажи, это имеет отношение к тому что ты говоришь?

Незнаю, но оказывается на больших файлах (более ~250MB) хеш неправильно считается. Вот как проверялось:


uses sha1;
var SH:TSHA1Context;

procedure TForm1.FormCreate(Sender: TObject);
var s:String;         FS:TFileStream; D:TSHA1Digest;  i:integer;
begin
 S:="";

 SHA1Init(SH);

 FS:=TFileStream.Create("tttbooks.zip",fmOpenRead or fmShareDenyWrite) ;  //276 MB

 try
   i:=FS.Size ;
   while i>=64 do
   begin
   SetLength(S,64);
   FS.Read((@S[1])^,64);
   SHA1Update(SH,Pointer(S),64);
   i:=i-64;
   end;

   if i>0 then
   begin

          SetLength(S,i);
          FS.Read((@S[1])^,i);
          SHA1Update(SH,@S[1],i);
   end;
   SHA1Final(SH,D);

 finally
   FS.Free;
 end;

 S:="";
 if SHA1SelfTest then Caption:="OK - ";
 for i:=0 to 19 do S:=S+IntToHex(D[i],2);
 Caption:=Caption+s;
end;


В чём дело - не пойму.



Страницы: 1 вся ветка

Текущий архив: 2008.12.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
2-1225477693
self.name
2008-10-31 21:28
2008.12.14
принцип работы FireBird


15-1223898497
Vlad Oshin
2008-10-13 15:48
2008.12.14
GPLS - что это за условие распостранения?


4-1201614798
lead-in
2008-01-29 16:53
2008.12.14
RasEntryDlg


15-1223642333
xayam
2008-10-10 16:38
2008.12.14
PHP-Ext


15-1223319483
oxffff
2008-10-06 22:58
2008.12.14
Prism - это Delphi .Net для VS