2014-01-08 110 views
1

我需要散列一個字符串,最好是SHA512,儘管它可能是SHA256,SHA1,MD5或CRC32。德爾福加密箱散列

我已經下載加密箱3,放TCryptographicLibrary和THASH組件的窗體上,設置散列屬性到SHA-512和用下面的代碼,以產生測試結果:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Hash1.HashString('myhashtest'); 
    Edit1.Text := Stream_To_AnsiString(Hash1.HashOutputValue); 
end; 

爲了最好說明問題,我已經去了一個在線哈希計算器,'myhashtest'的MD5哈希值是ff91e22313f0a41b46719e7ee6f99451,但是在我的測試程序中將哈希屬性設置爲MD5,結果爲ÿ‘â#ð¤Fqž~æù」Q,這顯然是錯誤的。我嘗試了使用其他哈希屬性的相同測試,包括我想要的SHA512,並且它們都返回垃圾。

我哪裏錯了?

+1

什麼是Delphi版本?什麼在線計算器?你能否包含它的鏈接,以便我們可以測試一些東西? –

+0

看起來像是base64編碼。 –

+0

在線結果看起來更像是簡單的十六進制編碼而不是base64。 –

回答

4

THash.HashOutputValue是原始哈希字節的流。看起來Stream_To_AnsiString()只是原樣複製那些原始字節到AnsiString,它不以任何方式編碼字節。您正在尋找的是原始字節的十六進制編碼版本。我知道LockBox有一個Stream_To_Base64()函數(如this example所示),但我不知道它是否有Stream_To_Hex()函數類型。如果沒有,你可以很容易地創建自己的,例如:

function Stream_To_Hex(Stream: TStream): AnsiString; 
var 
    NumBytes, I: Integer; 
    B: Byte; 
begin 
    NumBytes := Stream.Size - Stream.Position; 
    SetLength(Result, NumBytes * 2); 
    for I := 0 to NumBytes-1 do 
    begin 
    Stream.ReadBuffer(B, 1); 
    BinToHex(@B, @Result[(I*2)+1], 1); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Hash1.HashString('myhashtest'); 
    Edit1.Text := Stream_To_Hex(Hash1.HashOutputValue); 
end; 
+0

以上'Stream_To_Hex'函數在Delphi 10.1 Berlin Update 1中不起作用。什麼是錯的? – user1580348

+0

@ user1580348你需要更具體。使用它的實際問題是什麼? –

1

許多密碼函數默默地(即沒有在文檔中說明)輸出,並且需要Base64或十六進制編碼的字符串(通常也是AnsiStrings)。這是因爲加密的文本可以包含任何數據,並且只要您開始將其視爲「字符串」,字符串處理函數就會輕易窒息(例如,包含null的以null結尾的字符串)。通過Base-64/hex編碼密碼文本,您可以確保它是純舊的ASCII碼字符,舊碼可以讀取/寫入。

如果您在cryptocode或其方法參數中挖掘一點,您通常可以確定,並相應地轉換您的字符串。

+0

謝謝你們。一旦散列輸出轉換爲十六進制,它一切正常。 – user3173083