2017-03-28 68 views
5

我得到這樣一個代碼段:QCryptographicHash - 現實中的SHA3是什麼?

void SHAPresenter::hashData(QString data) 
{ 
    QCryptographicHash* newHash = new QCryptographicHash(QCryptographicHash::Sha3_224); 
    newHash->addData(data.toUtf8()); 
    QByteArray hashResultByteArray = newHash->result(); 
    setHashedData(QString(hashResultByteArray.toHex())); 
    delete newHash; 
} 

根據Qt specQCryptographicHash :: Sha3_224應 「生成SHA3-224散列和Qt中引入5.1」。我想將該代碼的結果與其他源進行比較,以檢查我是否以正確的方式放置數據。我發現網站:https://emn178.github.io/online-tools/sha3_224.html 所以我們在這兩種情況下都有SHA3_224。問題是,首先會生成「測試」這樣的字節串:

3be30a9ff64f34a5861116c5198987ad780165f8366e67aff4760b5e 

而第二個:

3797bf0afbbfca4a7bbba7602a2b552746876517a7f9b7ce2db0ae7b 

不相似的。但也有認爲這樣做「Keccak-224」網站: https://emn178.github.io/online-tools/keccak_224.html

這裏的結果是:

3be30a9ff64f34a5861116c5198987ad780165f8366e67aff4760b5e 

我知道SHA3基於Keccak的功能 - 但這裏有什麼問題?這兩種實現中的哪一種遵循NIST FIPS 202的正確方式,我們如何知道這一點?

+3

問題是,SHA3是改性Keccak。 Qt似乎在計算Keccak,而不是SHA3。好吧。 https://bugreports.qt.io/browse/QTBUG-59770 – peppe

+0

如果您在標準正式接受之前創建代碼並將其命名爲SHA-3,那麼這就是您所得到的結果。作者應該已經實現Keccac +版本號而不是「SHA-3」。也許他們應該將它的實現「NSSHA」重命名爲Non-Standard-Secure-Hash-Algorithm「:P –

+0

那麼,它可以安全地重命名爲Keccak,因爲它就是這樣做的,但它肯定不能被稱爲SHA3。 – peppe

回答

2

我正在爲Java編寫一個Keccak庫,所以我有方便的玩具來測試最初的懷疑。

首先簡要總結。 Keccak是一個海綿功能,可以使用多個參數(比特率,容量,域後綴和輸出長度)。 SHA-3只是Keccak的一個子集,這些值已經由NIST(FIPS PUB 202)選擇和標準化。

在SHA3-224的情況下,所述參數如下:

bitrate: 1152 
capacity: 448 
domain suffix: "01" 
output length: 224 (hence the name SHA3-224) 

需要注意的重要一點是,域後綴是被輸入消息之後並且在填充前所附一個比特串。域後綴是區分Keccak函數的不同應用程序(如SHA3,SHAKE,RawSHAKE等)的可選方法。所有SHA3功能都使用「01」作爲域後綴。

根據文檔,我認爲Keccak最初沒有域名後綴概念,而Keccak團隊提供的已知答案測試要求不使用域名後綴。

所以,你的問題。如果我們將字符串「測試」並使用ASCII或UTF-8編碼將其轉換爲字節數組(因爲Keccak使用二進制編碼,所以文本必須首先轉換爲字節或位,因此決定使用哪種字符編碼使用),然後將其提供給真正的SHA3-224哈希函數我們會得到以下結果(以十六進制表示,16個字節爲方便閱讀的線):

37 97 BF 0A FB BF CA 4A 7B BB A7 60 2A 2B 55 27 
46 87 65 17 A7 F9 B7 CE 2D B0 AE 7B 

SHA3-224可以概括爲Keccak[1152, 448](M || "01", 224)其中M || "01"表示「在輸入消息之後和多速率填充之前附加01」。

但是,如果沒有域名後綴,我們會得到Keccak[1152, 448](M, 224),其中寂寞的M表示不添加後綴位,並且多速率填充將在輸入消息之後立即開始。如果我們餵你相同的輸入「測試」消息,該消息不使用域後綴,然後我們得到以下結果(再次十六進制)此Keccak功能:

3B E3 0A 9F F6 4F 34 A5 86 11 16 C5 19 89 87 AD 
78 01 65 F8 36 6E 67 AF F4 76 0B 5E 

所以這個結果表明,該功能是不SHA3​​-224

這意味着你所看到的輸出的差異完全是由是否存在域名後綴「01」(這是我立即懷疑你閱讀你的問題)所解釋的。任何聲稱是SHA3的東西都必須使用「01」域名後綴,因此對於行爲不同的工具要非常謹慎。請仔細檢查文檔以確保它們在創建/使用對象或函數時不要求您指定所需的域後綴,但聲稱爲SHA3的任何內容都不應使忘記後綴位成爲可能。