powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BASE64-HMAC-SHA384
25 сообщений из 66, страница 1 из 3
BASE64-HMAC-SHA384
    #39500075
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо очень получить хэш строки, данным алгоритмом
есть куча примеров SHA 256,512, но не 384.
Кто-нибудь реализовывал или есть алгоритм?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500091
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500093
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500097
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barney83Кто-нибудь реализовывал или есть алгоритм?
Я недавно нашел хороший алгоритм hmac, использующий виндовое криптоапи, подправил и перевел на паскаль. Реально работает хорошо.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
var
  g_nLastCryptError: DWORD = 0;
  g_strLastCryptErrorFunction: String = '';

function HMAC_COMMON( const K; KLen: Integer; const M; MLen: Integer; HashAlgorithm: ALG_ID; out Mac; MacLen: DWORD ): Boolean;

  procedure UpdateLastError( const SFunction: String );
  begin
    g_nLastCryptError := GetLastError;
    g_strLastCryptErrorFunction := SFunction;
  end;

const
  BLOCK_SIZE = 64;
var
  i_key_pad: Array[ 0 .. BLOCK_SIZE - 1 ] of Byte;
  o_key_pad: Array[ 0 .. BLOCK_SIZE - 1 ] of Byte;

  hProv: HCRYPTPROV;
  hHash: HCRYPTHASH;
  len, cb, i: ULONG;
  f: BOOL;
  lpkeyhash1, lpkeyhash2, lpkey: PAnsiChar;
  c: Byte;
begin
  g_nLastCryptError := 0;
  lpkeyhash1 := nil;
  lpkeyhash2 := nil;

  f := CryptAcquireContext( @hProv, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_SILENT );
  if f then begin
    len := KLen;
    if len > BLOCK_SIZE then begin
      f := CryptCreateHash( hProv, HashAlgorithm, 0, 0, @hHash );
      if f then begin
        cb := sizeof( len );
        f := CryptHashData( hHash, @K, len, 0 ) and
             CryptGetHashParam( hHash, HP_HASHSIZE, @len, @cb, 0 );
        if f then begin
          GetMem( lpkeyhash1, len );
          f := CryptGetHashParam( hHash, HP_HASHVAL, PByte( lpkeyhash1 ), @len, 0 );
          if not f then
            UpdateLastError( 'CryptGetHashParam(HP_HASHVAL) (1)' );
        end else
          UpdateLastError( 'CryptHashData/CryptGetHashParam(HP_HASHSIZE)' );

        CryptDestroyHash( hHash );
      end else
        UpdateLastError( 'CryptCreateHash (1)' );
    end;

    if f then begin
      if Assigned( lpkeyhash1 ) then
        lpkey := lpkeyhash1
      else
        lpkey := @K;

      i := BLOCK_SIZE;
      repeat
        Dec( i );
        if i < len then
          c := Byte( lpkey[ i ] )
        else
          c := 0;

        i_key_pad[ i ] := $36 xor c;
        o_key_pad[ i ] := $5c xor c;
      until i = 0;

      f := CryptCreateHash( hProv, HashAlgorithm, 0, 0, @hHash );
      if f then begin
        cb := sizeof( len );
        f := CryptHashData( hHash, @i_key_pad, sizeof(i_key_pad), 0 ) and
             CryptHashData( hHash, @M, MLen, 0 ) and
             CryptGetHashParam( hHash, HP_HASHSIZE, @len, @cb, 0 );
        if f then begin
          GetMem( lpkeyhash2, len );
          f := CryptGetHashParam( hHash, HP_HASHVAL, PByte( lpkeyhash2 ), @len, 0 );
          if not f then
            UpdateLastError( 'CryptGetHashParam(HP_HASHVAL) (2)' );
        end else
          UpdateLastError( 'CryptHashData/CryptHashData/CryptGetHashParam(HP_HASHSIZE)' );

        CryptDestroyHash(hHash);

        if f then begin
          f := CryptCreateHash( hProv, HashAlgorithm, 0, 0, @hHash );
          if f then begin
            f := CryptHashData( hHash, @o_key_pad, sizeof( o_key_pad ), 0 ) and
                 CryptHashData( hHash, PByte( lpkeyhash2 ), len, 0 ) and
                 CryptGetHashParam( hHash, HP_HASHVAL, PByte( lpkeyhash2 ), @len, 0 );
            if not f then
              UpdateLastError( 'CryptHashData/CryptHashData/CryptGetHashParam(HP_HASHVAL)' );

            CryptDestroyHash(hHash);

            if f and ( len = MacLen ) then
              Move( lpkeyhash2^, Mac, len )
            else begin
              SetLastError( ERROR_INVALID_BLOCK );
              UpdateLastError( 'len != MacLen' );
            end;
          end else
            UpdateLastError( 'CryptCreateHash (3)' );
        end;
      end else
        UpdateLastError( 'CryptCreateHash (2)' );
    end;

    CryptReleaseContext( hProv, 0 );
  end else
    UpdateLastError( 'CryptAcquireContext' );

  if Assigned( lpkeyhash1 ) then
    FreeMem( lpkeyhash1 );

  if Assigned( lpkeyhash2 ) then
    FreeMem( lpkeyhash2 );

  Result := f;
end;


(переменые ошибое - для отладки, в принципе уже вроде не нужны)
Передай туда нужный алгоритм шифрования и результат с длиной, например, так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  THMAC_SHA256_DATA = packed array[ 0 .. 31 ] of Byte;

function HMAC_SHA256( const Key, Text: AnsiString; out ResHash: THMAC_SHA256_DATA ): Boolean;
begin
  Result := HMAC_COMMON( Pointer( Key )^, Length( Key ), Pointer( Text )^, Length( Text ), CALG_SHA256, ResHash, sizeof( ResHash ) );
end;



А затем - загони результат в Base64 например так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
function EncodeBase64( Value: AnsiString ): AnsiString;
const
  b64alphabet: PAnsiChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  pad: PAnsiChar = '====';

  function EncodeChunk(const Chunk: String): String;
  var
    W: LongWord;
    i, n: Byte;
  begin
    n := Length(Chunk); W := 0;
    for i := 0 to n - 1 do
      W := W + Ord(Chunk[i + 1]) shl ((2 - i) * 8);
    Result := b64alphabet[(W shr 18) and $3f] +
              b64alphabet[(W shr 12) and $3f] +
              b64alphabet[(W shr 06) and $3f] +
              b64alphabet[(W shr 00) and $3f];
    if n <> 3 then
      Result := Copy(Result, 0, n + 1) + Copy(pad, 0, 3 - n);   //add padding when out len isn't 24 bits
  end;

var
  i, nLen, nEndLen: Integer;

begin
  Result := '';
  while Length(Value) > 0 do
  begin
    Result := Result + EncodeChunk(Copy(Value, 0, 3));
    Delete(Value, 1, 3);
  end;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  THMAC_SHA256_DATA = packed array[ 0 .. 31 ] of Byte;

function HMAC_SHA256_AsBase64( const Key, Text: AnsiString ): AnsiString;
var
  ResHash: THMAC_SHA256_DATA;
begin
  Result := '';
  if HMAC_COMMON( Pointer( Key )^, Length( Key ), Pointer( Text )^, Length( Text ), CALG_SHA256, ResHash, sizeof( ResHash ) ) then begin
    SetString( Result, PAnsiChar( @ResHash ), sizeof( ResHash ) );
    Result := EncodeBase64( Result );
  end;
end;



тебе понадобится Wcrypt2.pas найти в интернете и возможно константы алгоритмов типа CALG_SHA_384 (все они есть в мсдн).

Да, начиная от CALG_SHA_256 не всякая WinXP поддерживает эти алгоритмы.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500099
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я это тестил на d6 и fpc 3.0.2 для win32/i386 и win64/x86_64
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500120
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще докину пару ссылок:
https://github.com/fundamentalslib/fundamentals4
https://github.com/fundamentalslib/fundamentals5

SHA384 в 5й версии точно есть, правда без HMAC.
HMACи есть только для SHA1/256/512.

См. Source/Utils/flcHash.pas
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500122
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Код: pascal
1.
2.
3.
4.
5.
  while Length(Value) > 0 do
  begin
    Result := Result + EncodeChunk(Copy(Value, 0, 3));
    Delete(Value, 1, 3);
  end;


Боюсь даже подумать, с какой скоростью это будет тормозить работать.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500134
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,

Можно работающий код?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500173
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем не подошел родной код из первой ссылки?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500183
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkin,

не компилируется, нахватает каких-то файлов и т.д.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500190
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно. намек не заходит.
тогда прямой вопрос. версию делфи может раскроете?
потому что начиная вроде с сиэттла в делфи есть родной модуль с SHA2 хэшем
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500191
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkin,

Embarcadero® RAD Studio XE Version 15.0.3953.35171
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500206
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда DCPCrypt должен работать
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500213
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkin,

HMAC там нет
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500218
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barney83YuRock,

Можно работающий код?
Я дал работающий код.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500220
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpYuRock,

Код: pascal
1.
2.
3.
4.
5.
  while Length(Value) > 0 do
  begin
    Result := Result + EncodeChunk(Copy(Value, 0, 3));
    Delete(Value, 1, 3);
  end;



Боюсь даже подумать, с какой скоростью это будет тормозить работать.
Да, ужас, но мне не надо было быстродействия в этой ф-ции пока-что. Я её "скачал не смотря", протестировал на глаз и всё.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500223
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockBarney83YuRock,

Можно работающий код?
Я дал работающий код.
Единственное, в EncodeBase64 (которую я в качестве примера дал) надо все String заменить на AnsiString, раз у тебя дельфя юникодная.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500227
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,

ALG_ID это что за тип данных, не хватает явно каких-то модулей еще
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500231
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barney83,

он определен в Wcrypt2.pas
Могу дать свой, но не факт, что он у тебя скомпилится
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500234
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barney83,

И еще, возможно, для алгоритмов > SHA256 надо константу BLOCK_SIZE изменить с 64 на 80.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500418
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

У меня вот так реализована, работает очень быстро 1.178297 сек на процессоре 2009г - E3300 (1M Cache, 2.50 GHz, 800 MHz FSB)


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
function base64_encode(str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of char;
var
  len, i, r: Integer;
  a, b: Byte;
  Sum: Cardinal;
begin
  len := Length(str);

  SetLength(Result, ((len + 2) div 3) * 4);

  i := 0;
  r := 0;
  while i <= len - 3 do
  begin
    Sum := WORD(str[i + 1]) shl 16 + WORD(str[i + 2]) shl 8 + WORD(str[i + 3]);

    PArrayChars(@Result)^[r + 0] := table[Sum shr 18 and $3F];
    PArrayChars(@Result)^[r + 1] := table[Sum shr 12 and $3F];
    PArrayChars(@Result)^[r + 2] := table[Sum shr 6 and $3F];
    PArrayChars(@Result)^[r + 3] := table[Sum and $3F];

    inc(i, 3);
    inc(r, 4);
  end;

  case len mod 3 of
    1:
      begin
        a := WORD(str[len]) and $FF;
        PArrayChars(@Result)^[r + 0] := table[a SHR 2];
        PArrayChars(@Result)^[r + 1] := table[a and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        a := WORD(str[i + 1]) and $FF;
        b := WORD(str[i + 2]) and $FF;
        PArrayChars(@Result)^[r + 0] := table[a SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((a and 3) SHL 4) or (b SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[b and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;


...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500419
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл приложить как тестил на скорость

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
    if ZStartTime(startTime) then
    begin
      for i := 0 to 10000000 do
      begin
        base64_encode('HytujkyHytujkyukHytujkyukuk');
      end;
      Writeln(ZStopTime(startTime));
    end;
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500420
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас заметил кое что, чем меня уже пинали на форуме...

Добавляем const

function base64_encode(const str: string): string;



И результаты уже - 0.930440 sec.

Не за что бы не залез и не увидел, если бы не ты
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500425
няша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикНе за что бы не залез и не увидел, если бы не ты
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500427
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
няша,

И причём тут это?. Это уже спам.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BASE64-HMAC-SHA384
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]