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