2016-02-29 7 views
3

Я пытаюсь использовать строку с использованием библиотеки CRC/Hash от Wolfgang Ehrardt, и я пытаюсь использовать алгоритм SHA3/256. Я написал эту процедуру:Как хэш строку с SHA-3/256 с Delphi XE8?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Context : THashContext; 
    Digest: TSHA3_256Digest; 
    buf: TBytes; 
    s: string; 
begin 
    buf := TEncoding.UTF8.GetBytes(''); 
    SHA3_256Full(Digest, buf, SizeOF(buf)); 
    s:=HexStr(@Digest, SizeOf(Digest)); //HexStr is in mem_utils unit from the same CRC/Hash library 

    memo1.lines.clear; 
    memo1.Lines.add(s); 
end; 

Полученный хэш b64f67d4a6fe871afc5c42e3128b5e3b6943c475bab1a138667c0213e1f9a6bb но отличается от результата, полученного с помощью инструмента ША-3/256 в http://emn178.github.io/online-tools/sha3_256.html, где та же строка дает 4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428.

С другой стороны, если я пытаюсь хэш пустой строки, результат a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a, который является правильным.

Итак, вопрос: допустил ли я ошибку в своем коде?

+0

Прямая ссылка CRC/Hash библиотеки из Вольфганга Ehrardt, просто быть здесь: http://www.wolfgang-ehrhardt.de/crchash_en.html – Nashev

ответ

3

Потому что buf - динамическая переменная массива, реализованная как указатель, SizeOf(buf) - размер указателя. Либо 4, либо 8 в зависимости от вашей цели. Я не думаю, что это то, что вы намереваетесь вообще. Вы намерены передать длину массива байтов. Таким образом, заменить

SizeOf(buf) 

с

Length(buf) 

Эта программа

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    mem_util, hash, sha3_256; 

var 
    Digest: TSHA3_256Digest; 
    buf: TBytes; 

begin 
    buf := TEncoding.UTF8.GetBytes(''); 
    SHA3_256Full(Digest, buf, Length(buf)); 
    Writeln(HexStr(@Digest, SizeOf(Digest))); 
end. 

выходы

 
4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428 
+0

Большое спасибо, он отлично поработал :) – ZipGenius