Kodowanie ciągu znaków za pomocą HMAC_512.

0

Witam

Mam do napisania w delphi program który koduje ciąg znaków za pomocą HMAC_512.

Pseudokod w C++ ze sprawdzeniem wygląda następująco:

function hmac_512(msg, sec) {
    sec = Base64Decode(sec);
    result = hmac(msg, sec, sha512);
    return Base64Encode(result);
}


secret = "7pgj8Dm6";
message = "Test\0Message";

result = hmac_512(message, secret);
if (result == "69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO3mQxlsWNPrw==")
    print("Success!");
else
    printf("Error: %s", result);

W delphi napisałem coś takiego:

procedure TMainForm.BtnClick(Sender: TObject);
var
  mes, secret,test, secretencode : string;
  secretdecode, testdecode : Tbytes;
  secretpointer : ^Tbytes;

begin

  mes:= 'Test\0Message';
  secret := '7pgj8Dm6';
  secretdecode := DecodeBytes64 (secret);
  Secretpointer := @secretdecode;

  Edit2.Text := SHA512DigestToHex(CalcHMAC_SHA512(secretpointer, 64, mes, 128));
  test2 :=     CalcHMAC_SHA512(secretpointer, 64, mes, 128);


end;

Funkcja CalcHMAC_SHA512 oblicza wartość HMAC512 i zwraca wartość do recordu:

  T512BitDigest = record
    case integer of
      0 : (Word64s : array[0..7] of Word64);
      1 : (Longs   : array[0..15] of LongWord);
      2 : (Words   : array[0..31] of Word);
      3 : (Bytes   : array[0..63] of Byte);
    end;

Jak z tego rekordu mam wyciągnąć wartość EncodeBytes64.

źródło funkcji CalcHMAC_SHA512 wykorzystuje ze strony: https://code.google.com/p/fundamentals/source/browse/trunk/Source/Utils/cHash.pas?r=30

0

Może spróbuj to napisać samemu, a nie korzystać z gotowych implementacji, to zrozumiesz o co w tym chodzi (wszakże sam napisałeś, że "mam do napisania", a nie "mam do zgapienia")
... lub przynajmniej sprecyzuj pytanie: co to jest EncodeBytes64?

0

w module masz też funkcje do wyświetlania, w oczy rzuciły mi się:
function SHA512DigestAsString(const Digest: T512BitDigest): AnsiString;
function SHA512DigestToHex(const Digest: T512BitDigest): AnsiString;
aha zapewne chodzi o przedstawienie surowego buforu w postaci base64. Poszukaj sobie funkcji, która koduje do base64 bufor. Bufor pobierzesz tak jak robi to funkcja SHA512DigestAsString

1 użytkowników online, w tym zalogowanych: 0, gości: 1