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

Вниз

Хэширование строк в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
15-1391203874
Дмитрий СС
2014-02-01 01:31
2014.08.31
Конвертор видеосигнала.


2-1380552472
ixen
2013-09-30 18:47
2014.08.31
Хэширование строк в SHA1


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


15-1390229340
Пит
2014-01-20 18:49
2014.08.31
Отображаемые элементы в cxGrid


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский