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

Вниз

Хэширование строк в SHA1   Найти похожие ветки 

 
ixen   (2013-09-30 18:47) [0]

Привет! Нужно получить хэш SHA1 текстовой строки. Погуглив нашел несколько примеров, и немного их переделав, у меня получилось вот что:

function TForm1.crypthash(str:string; calc:Cardinal):string;
var hProv: HCRYPTPROV;
   hHash: HCRYPTHASH;
   pbHash: PByte;
   I:integer;
   BufLen:DWORD;
   buf,res:PChar;
begin
 result:="";
 if not CryptAcquireContext(@hProv,nil,nil,PROV_RSA_FULL, CRYPT_NEWKEYSET)
 then CryptAcquireContext(@hProv,nil,MS_ENHANCED_PROV,PROV_RSA_FULL, 0); // создаем контейнер

 CryptCreateHash(hProv, calc,0,0,@hHash); // подключаемся к провайдеру

 CryptHashData(hHash,PByte(PAnsiChar(str)),length(str),0); // получаем хэш строки
 buflen:=0;
 CryptGetHashParam(hHash, HP_HASHVAL, nil, @BufLen,0); // получаем размер буфера
 GetMem(pbHash, buflen); // выделяем память под хранение хэша в бинарном виде
 if CryptGetHashParam(hHash,HP_HASHVAL,pbHash, @BufLen,0) then // получаем хэш в бинарном виде
 begin
   buf:=PAnsiChar(pbhash); // представляю бинарный хэш в чар
   bintohex(buf, res, buflen); // перевожу бинарный хэш в шестнадцатиричный
   result:=res; // присваиваю результат функции
 end;
 FreeMem(pbHash);  // освобождаю память
 CryptDestroyHash(hHash); // уничтожаю хэш
 CryptReleaseContext(hProv, 0);  // отключаюсь от провайдера
end;


вызываю следующим образом:
sha1_edt.Text:=crypthash(sign_edt.Text,CALG_SHA1);

в результате выходит сообщение AV, но результат все таки вычисляется правильный, но только с мусором, например:
текст=123
хэш=40BD001563085FC35165329EA1FF5C5ECBDBBEEFøˆC

жирным это правильный хэш, а в конце мусор. Хэш проверял через сайт http://www.sha1-online.com/

Подскажите как сделать без ошибок и без мусора. Знаю что где то с выделением памяти напортачил, но я в этом не силен.


 
ixen   (2013-09-30 18:51) [1]

Забыл добавить. Использую модуль wcrypt2.pas


 
Необычный Порошок   (2013-09-30 19:39) [2]

1. Убрать вот эту ересь.
if not CryptAcquireContext(@hProv,nil,nil,PROV_RSA_FULL, CRYPT_NEWKEYSET)

контейнер и его приват ключи нам не нужны, тем более не нужно генерить новый контейнер. флаг CRYPT_VERIFYCONTEXT

2. зачем здесь PAnsiChar?

 buf:=PAnsiChar(pbhash); // представляю бинарный хэш в чар
 bintohex(buf, res, buflen); // перевожу бинарный хэш в шестнадцатиричный

Остальные косяки зависят от того как объявлены параметры функций в твоем  wcrypt2.pas


 
Необычный Порошок   (2013-09-30 20:00) [3]

кстати, если внутри wincrypt2.pas лежат копирайты мадам марии массимо гизалберти, то ее этот порт с в пас - кривой.

а еще полезно смотреть что за результат возвращают вызываемые функции и время от времени делать гетластеррор


 
ixen   (2013-10-01 07:31) [4]

Я пробовал другой модуль jwaWinCrypt.. результат такой же


 
ixen   (2013-10-01 07:38) [5]

Я посмотрел содержимое переменной хэша pbHash, выполняя код по шагам, там получается значение $1463F38. Я так понимаю его нужно перевести в шестнадцатеричный код. Видимо я не правильно его перевожу.


 
Inovet ©   (2013-10-01 11:37) [6]

> [5] ixen   (01.10.13 07:38)
> его нужно перевести в шестнадцатеричный код

Что это значит? Зачем во что-то переводить значение указателя?


 
Необычный порошок   (2013-10-01 11:53) [7]

bintohex(buf, res, buflen); // перевожу бинарный хэш в шестнадцатиричный

Видимо я не правильно его перевожу.

какого типа параметр buf у bintohex?


 
ixen   (2013-10-01 16:54) [8]


> какого типа параметр buf у bintohex?

Типа Pchar


 
brother ©   (2013-10-01 16:57) [9]

это указатель на содержимое...


 
Необычный порошок   (2013-10-01 19:23) [10]

Типа Pchar

ну значит ковыряй свой странный бинтухекс, который хочет указатель на двоичный буфер в виде пчара


 
ixen   (2013-10-02 08:51) [11]

Немного подправил код, AV выходит при закрытии программы. Хэш считает правильно но в конце один знак псевдографики добавляется..
function TForm1.crypthash(str:string; calc:Cardinal):string;
var hProv: HCRYPTPROV;
  hHash: HCRYPTHASH;
  pbHash: PByte;
  I:integer;
  BufLen:DWORD;
  buf,res:PChar;
begin
...
if CryptGetHashParam(hHash,HP_HASHVAL,pbHash, @BufLen,0) then // получаем хэш в бинарном виде
begin
  buf:=PChar(pbhash); // представляю бинарный хэш в чар
  New(res);  // резервирую память под переменную res
  bintohex(buf, res, buflen); // перевожу бинарный хэш в шестнадцатиричный
  result:=res; // присваиваю результат функции
 Dispose(res);   // освобождаю память под переменную res
end;
...
end;


 
DVM ©   (2013-10-02 10:27) [12]


> ixen

Попробуй мой модуль: http://yadi.sk/d/PvxlW4D8AFVxH
С ним попроще будет, да и кроссплатформенно.


 
ProgRAMmer Dimonych ©   (2013-10-02 12:17) [13]

> [11] ixen   (02.10.13 08:51)
> Немного подправил код, AV выходит при закрытии программы.
> Хэш считает правильно но в конце один знак псевдографики
> добавляется..
> function TForm1.crypthash(str:string; calc:Cardinal):string;
>
> var hProv: HCRYPTPROV;
>  hHash: HCRYPTHASH;
>  pbHash: PByte;
>  I:integer;
>  BufLen:DWORD;
>  buf,res:PChar;
> begin
> ...
> if CryptGetHashParam(hHash,HP_HASHVAL,pbHash, @BufLen,0)
> then // получаем хэш в бинарном виде
> begin
>  buf:=PChar(pbhash); // представляю бинарный хэш в чар
>  New(res);  // резервирую память под переменную res
>  bintohex(buf, res, buflen); // перевожу бинарный хэш в
> шестнадцатиричный
>  result:=res; // присваиваю результат функции
> Dispose(res);   // освобождаю память под переменную res
> end;
> ...
> end;

Ну ещё бы! Сколько по-твоему памяти выделит New(), сколько будет использовать таинственный bintohex() и что из всего этого получится?


 
Необычный порошок   (2013-10-02 13:35) [14]

это капец конечно.
работать с PChar через new и dispose.
какие еще рандомные комбинации функций ты можешь придумать?


 
ixen   (2013-10-02 19:15) [15]


> Попробуй мой модуль: http://yadi.sk/d/PvxlW4D8AFVxH
> С ним попроще будет, да и кроссплатформенно.

Спасибо, попробую. А этот модуль может считать хэш md5 ?


 
DVM ©   (2013-10-02 22:50) [16]


> ixen   (02.10.13 19:15) [15]


> А этот модуль может считать хэш md5 ?

этот не может, вот этот может: http://yadi.sk/d/-_LkQxucAJ6dd


 
ProgRAMmer Dimonych ©   (2013-10-02 23:55) [17]

> [16] DVM ©   (02.10.13 22:50)

Сейчас посыплются вопросы по использованию модуля. А смысл?


 
ixen   (2013-10-03 23:39) [18]

DVM,  спасибо большое за модули. Вопросов не будет, там все понятно.



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

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

Наверх




Память: 0.51 MB
Время: 0.006 c
2-1381400402
Error-Code-0xDEADBEEF
2013-10-10 14:20
2014.08.31
проектирование бд


2-1381237944
12345
2013-10-08 17:12
2014.08.31
получить строку


15-1391185991
Jeer
2014-01-31 20:33
2014.08.31
Э..один раз умирать:)


2-1381424131
Алла
2013-10-10 20:55
2014.08.31
StringGrid программно переместить выделение


4-1269440249
Елена
2010-03-24 17:17
2014.08.31
Определить что установлена Win 7