powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BASE64-HMAC-SHA384
16 сообщений из 66, страница 3 из 3
BASE64-HMAC-SHA384
    #39500739
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикСмысл запускать то что не работает?)


IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=
0PPx8ero6SDy5erx8gAAAAAAAAAAAAAAAAA=
IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=


/facepalm
Ты реально не понимаешь разницы между string и ansistring?.. Тогда я не вижу больше предмета для обсуждения, подтяни что ли теорию, потом подумай почему второй вызов base64encode выдают другой результат и на самом деле является UB.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500742
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНяшикСмысл запускать то что не работает?)


IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=
0PPx8ero6SDy5erx8gAAAAAAAAAAAAAAAAA=
IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=


/facepalm
Ты реально не понимаешь разницы между string и ansistring?.. Тогда я не вижу больше предмета для обсуждения, подтяни что ли теорию, потом подумай почему второй вызов base64encode выдают другой результат и на самом деле является UB.


ОМГ. Я привёл пример, что в string (он же WideString а именно MarshaledString) и AnsiString Выдают неверные результаты.


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

Как не крути твой код, на русские символы он выдаёт подобную беребелбду. С англ всё нормально

IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=
0PPx8ero6SDy5erx8gAAAAAAAAAAAAAAAAA=


Ты хотя бы проверяй результаты своей программы
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500746
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикalekcvp,
Как не крути твой код, на русские символы он выдаёт подобную беребелбду. С англ всё нормально
IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=
0PPx8ero6SDy5erx8gAAAAAAAAAAAAAAAAA=
Ты хотя бы проверяй результаты своей программы

Хорошо, вопрос на засыпку: почему ты длину AnsiString указываешь как Length(A2)*2 ? Что означает эта 2?..
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500750
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНяшикalekcvp,
Как не крути твой код, на русские символы он выдаёт подобную беребелбду. С англ всё нормально
IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=
0PPx8ero6SDy5erx8gAAAAAAAAAAAAAAAAA=
Ты хотя бы проверяй результаты своей программы

Хорошо, вопрос на засыпку: почему ты длину AnsiString указываешь как Length(A2)*2 ? Что означает эта 2?..


Потому что копипаст. Но это всё не важно, потому что правильный бейсик64 будет таким

'Русский Текст' => 0KDRg9GB0YHQutC40Lkg0KLQtdC60YHRgg==

Вот сайт для проверки http://base64.ru/

Код: 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.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
program Project3;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs;
  external 'msvcrt.dll';

function ZStartTime(var StartTime: Int64): Boolean;
begin
  Result := QueryPerformanceCounter(StartTime);
end;

function ZStopTime(const StartTime: Int64): AnsiString;
var
  iCounterPerSec, StopTime: Int64;
  time: Single;
begin
  if QueryPerformanceCounter(StopTime) then
  begin
    if QueryPerformanceFrequency(iCounterPerSec) then
    begin

      time := (0 - StartTime + StopTime) / iCounterPerSec;

      Result := '';
      SetLength(Result, 25);

      SetLength(Result, sprintf(PAnsiChar(Result), 'Result: %f sec.', time));
    end
    else
      Result := 'Error[ZStopTime(QueryPerformanceFrequency)]';
  end
  else
    Result := 'Error[ZStopTime(QueryPerformanceCounter)]';
end;

function base64_encode(const str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of Char;
  TArrayBytes = array of Byte;
var
  len, i, r, j: Integer;
  f: TArrayBytes;
  c: PWideChar;
  bb: Char;
begin
  j := 0;
  r := 0;
  len := Length(str);

  SetLength(f, len * 3);

  c := Pointer(str);
  bb := c[0];
  while bb <> #0 do
  begin
    if (WORD(bb) < $00000080) then
    begin
      f[j] := WORD(bb);
      inc(j, 1);
    end
    else if (WORD(bb) < $00000800) then
    begin
      f[j] := $C0 or ((WORD(bb) shr 6) and $FF);
      f[j + 1] := $80 or (WORD(bb) and $3F);
      inc(j, 2);
    end
    else if (WORD(bb) < $00010000) then
    begin
      f[j] := $E0 or ((WORD(bb) shr 12) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 2] := $80 or (WORD(bb) and $3F);
      inc(j, 3);
    end
    else if (WORD(bb) < $00200000) then
    begin
      f[j] := $F0 or ((WORD(bb) shr 18) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 12) and $3F);
      f[j + 2] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 3] := $80 or (WORD(bb) and $3F);
      inc(j, 4);
    end
    else if (WORD(bb) < $04000000) then
    begin
      f[j] := $F8 or ((WORD(bb) shr 24) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 18) and $3F);
      f[j + 2] := $80 or ((WORD(bb) shr 12) and $3F);
      f[j + 3] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 4] := $80 or (WORD(bb) and $3F);
      inc(j, 5);
    end
    else if (WORD(bb) < $80000000) then
    begin
      f[j] := $FC or ((WORD(bb) shr 30) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 24) and $3F);
      f[j + 2] := $80 or ((WORD(bb) shr 18) and $3F);
      f[j + 3] := $80 or ((WORD(bb) shr 12) and $3F);
      f[j + 4] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 5] := $80 or (WORD(bb) and $3F);
      inc(j, 6);
    end;
    inc(r);
    bb := c[r];
  end;

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

  i := 0;
  r := 0;
  while j >= 3 do
  begin
    PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
    PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
    PArrayChars(@Result)^[r + 2] := table[((f[i + 1] and 15) SHL 2) or (f[i + 2] SHR 6)];
    PArrayChars(@Result)^[r + 3] := table[f[i + 2] and 63];
    inc(i, 3);
    inc(r, 4);
    dec(j, 3);
  end;

  case j of
    1:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[f[i] and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[f[i + 1] and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;

var
  i: Cardinal;
  StartTime: Int64;

begin
  try
    Writeln(base64_encode('Русский Текст'));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500757
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикВот сайт для проверки http://base64.ru/

Еще раз говорю: ты не понимаешь что такое AnsiString :)
http://foxtools.ru/Base64
Введи сюда то что выдаёт моя функция (0PPx8ero6SDy5erx8g==) и выбери кодировку Windows 1251 , после этого нажми "отправить" и посмотри на результат декодирования.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500762
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

=_= Я думал что ты строишь дурака, но мне кажется что не строишь.

Русский текст 2 байта, и их надо сохранить последовательно - как застёгивает замочек ширинку ленту.

Т.е, разбить символ на 2 байта, и взять ещё 1 байт от следующего символа.

Тебе сколько раз можно повторять это??? Base64 пакует 3 байта!!!! Причём тут вообще вывод в AnsiString ???..
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500764
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикТебе сколько раз можно повторять это??? Base64 пакует 3 байта!!!! Причём тут вообще вывод в AnsiString ???..
Мне наш разговор напоминает разговор слепого с глухонемым, или ты просто очень скиллованный тролль.
Замени в своём примере на картинке S2: AnsiString; на S2: Utf8String; и посмотри на результат.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500766
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикОМГ. Я привёл пример, что в string (он же WideString а именно MarshaledString) и AnsiString Выдают неверные результаты.

Ты всерьёз считаешь, что одинаковый текст в разных кодировках должен давать одинаковый base64?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500774
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,


Вставь свой base64 в свой сайт http://foxtools.ru/Base64

alekcvp

результат на моём Core i7 26000JTQstC10L3QsNC00YbQsNGC0Ywg0L/QvtC/0YPQs9Cw0LXQsiDQt9Cw0LrQu9C10LLQsNC70Lgg0L/QuNGC0L7QvdCwIQ==

Няшик: Result: 2.444395 sec.
FAQyBDUEPQQwBDQERgQwBEIETAQgAD8EPgQ/BEMEMwQwBDUEMgQgADcEMAQ6BDsENQQyBDAEOwQ4BCAAPwQ4BEIEPgQ9BDAEIQA=
AsmB64: Result: 1.043641 sec.
л base64 т.к. просто и понятно :)

[/quot]
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500779
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикalekcvp,
base64 т.к. просто и понятно :)
[/quot]
Таки ты тролль. "FAQyBDUEPQQwBDQERgQwBEIETAQgAD8EPgQ/BEMEMwQwBDUEMgQgADcEMAQ6BDsENQQyBDAEOwQ4BCAAPwQ4BEIEPgQ9BDAEIQA=" - это в кодировке Unicode или cp_1200 на том сайте.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500780
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНяшикalekcvp,
base64 т.к. просто и понятно :)

Таки ты тролль. "FAQyBDUEPQQwBDQERgQwBEIETAQgAD8EPgQ/BEMEMwQwBDUEMgQgADcEMAQ6BDsENQQyBDAEOwQ4BCAAPwQ4BEIEPgQ9BDAEIQA=" - это в кодировке Unicode или cp_1200 на том сайте.[/quot]

Я уже все перетыкал что бы его расшифровать. Даже в пыху вставил, и там же получил

25=04F0BL �?>?C3052 �70:;520;8 �?8B>=0!�

http://sandbox.onlinephpfunctions.com/code/984f3917de156ce71e9b11c09ac46a84e40d2a11
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500788
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЯ уже все перетыкал что бы его расшифровать. Даже в пыху вставил, и там же получил
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39501122
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barney83Не работает пример, валится на
UpdateLastError( 'CryptCreateHash (2)' );
Странно. Там и ошибкам вроде негде взяться в этой строке. Надо смотреть SysErrorMessage( g_nLastCryptError ) в этой строке и разбираться. Я, честно говоря, не тестировал для 384 и выше, только для MD5, SHA1 и SHA256.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39501177
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barney83,

подкорректировал ф-цию, теперь работает и для 384/512

Код: 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.
122.
123.
124.
125.
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;

var
  i_key_pad: Array[ 0 .. 127 ] of Byte;
  o_key_pad: Array[ 0 .. 127 ] of Byte;

  lpProvider: PChar;
  dwProvType: DWORD;

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

  if ( HashAlgorithm >= CALG_SHA_384 ) and ( HashAlgorithm <= CALG_SHA_512 ) then begin
    lpProvider := nil;
    dwProvType := PROV_RSA_AES;
    BLOCK_SIZE := 128;
  end else begin
    lpProvider := MS_DEF_PROV;
    dwProvType := PROV_RSA_FULL;
    BLOCK_SIZE := 64;
  end;

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

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

    if Result 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;

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

        CryptDestroyHash(hHash);

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

            CryptDestroyHash(hHash);

            if Result 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 );
end;



Нужна будет константа PROV_RSA_AES = 24
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39501181
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Код: pascal
1.
2.
3.
4.
5.
6.
            if Result and ( len = MacLen ) then
              Move( lpkeyhash2^, Mac, len )
            else begin
              SetLastError( ERROR_INVALID_BLOCK );
              UpdateLastError( 'len != MacLen' );
            end;


заменить на
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
            if Result then begin
              if len = MacLen then
                Move( lpkeyhash2^, Mac, len )
              else begin
                Result := False;
                SetLastError( ERROR_INVALID_BLOCK );
                UpdateLastError( 'len != MacLen' );
              end;
            end;
...
Рейтинг: 0 / 0
16 сообщений из 66, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BASE64-HMAC-SHA384
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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