4

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;

The resulting hash is b64f67d4a6fe871afc5c42e3128b5e3b6943c475bab1a138667c0213e1f9a6bb but it differs from the result obtained through the SHA-3/256 tool at http://emn178.github.io/online-tools/sha3_256.html , where the same string gives 4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428 .

一方、空の文字列をハッシュしようとすると、結果は正しいa7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434aになります。

質問は次のとおりです。コードに間違いがありますか?

4

1 に答える 1

4

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
于 2016-02-29T15:39:46.393 に答える