如何使用 SHA-3/256 和 Delphi XE8 散列字符串?
How to hash a string with SHA-3/256 with Delphi XE8?
我正在尝试使用 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,这是正确的。
所以问题是:我的代码有没有错误?
因为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
我正在尝试使用 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,这是正确的。
所以问题是:我的代码有没有错误?
因为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