Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
3-1211525758
Михаил (Питер)
2008-05-23 10:55
2008.12.14
ADO


2-1225562458
dmitry_12_08_73
2008-11-01 21:00
2008.12.14
Как прописать настройки директив компилятора в константу


6-1196409724
Ш-К
2007-11-30 11:02
2008.12.14
Как реализовать обсервер.


1-1203322940
kblc
2008-02-18 11:22
2008.12.14
Родительское окно


2-1225894334
svb
2008-11-05 17:12
2008.12.14
из Excel в DBEhgrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский