2016-02-29 1 views
3

J'essaie de hacher une chaîne en utilisant la bibliothèque CRC/Hash de Wolfgang Ehrardt et j'essaie d'utiliser l'algorithme SHA3/256. j'ai écrit cette procédure:Comment hacher une chaîne avec SHA-3/256 avec 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; 

Le hachage est b64f67d4a6fe871afc5c42e3128b5e3b6943c475bab1a138667c0213e1f9a6bb mais il est différent du résultat obtenu par l'outil SHA-3/256 à http://emn178.github.io/online-tools/sha3_256.html, où la même chaîne donne 4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428.

De l'autre côté, si je tente de hachage d'une chaîne vide, le résultat est a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a qui est correct.

Donc la question est: est-ce que je fais une erreur dans mon code?

+0

Lien direct vers la bibliothèque CRC/Hash de Wolfgang Ehrardt, juste pour être ici: http://www.wolfgang-ehrhardt.de/crchash_en.html – Nashev

Répondre

3

Parce que buf est une variable de tableau dynamique, implémentée en tant que pointeur, SizeOf(buf) est la taille d'un pointeur. Soit 4 ou 8 selon votre cible. Je ne pense pas que ce soit ce que vous avez l'intention de faire. Vous avez l'intention de passer la longueur du tableau d'octets. Ainsi, remplacer

SizeOf(buf) 

avec

Length(buf) 

Ce programme

{$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. 

sorties

 
4e058e17199441d69589d3c775face0c4949af7f4f011317efce2fc22606c428 
+0

Merci beaucoup, ça a très bien fonctionné :) – ZipGenius