如何使用Delphi XE8使用SHA-3/256散列字符串?

时间:2016-02-29 15:37:41

标签: delphi hash sha-3

我尝试使用Wolfgang Ehrardt的CRC / Hash库来散列字符串,并尝试使用SHA3 / 256算法。 我写了这个程序:

procedure TForm1.Button1Click(Sender: TObject);
var
  Context : THashContext;
  Digest: TSHA3_256Digest;
  buf:   TBytes;
  s: string;
begin
  buf := TEncoding.UTF8.GetBytes('0123456789012345');
  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 但它与通过http://emn178.github.io/online-tools/sha3_256.html的SHA-3/256工具获得的结果不同,其中相同的字符串给出 4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428

另一方面,如果我尝试哈希一个空白字符串,结果是 a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a 这是正确的。

所以问题是:我的代码中有错误吗?

1 个答案:

答案 0 :(得分: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('0123456789012345');
  SHA3_256Full(Digest, buf, Length(buf));
  Writeln(HexStr(@Digest, SizeOf(Digest)));
end.

输出

4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428