Форум: "Основная";
Текущий архив: 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