使用 Whirlpool 散列函式加密數據
我讀過 Whirlpool 散列函式可以產生可以用作偽隨機生成器的足跡。
使用它來加密一些數據是否*“可以” ?*
EncryptedData = Concat(DataBlock XOR Whirlpool(DataBlock + SecretKey))
有時,例如在非常受限的環境中,僅使用少數幾個密碼原語進行所有處理會很有用。(當你只有一把錘子時,一切看起來都像釘子。)
在這樣的環境中,使用密鑰派生函式來派生流以用作流密碼,或使用散列函式作為密碼等可能很有用。
然而,以非標準方式使用原語可能會出現實施錯誤,並且通常是“路徑較少”,從而冒著沒有考慮到的漏洞風險。
EncryptedData = Concat(DataBlock XOR Whirlpool(DataBlock + SecretKey))
您是否想過解密以這種方式加密的數據?DataBlock 應該是保密的,但 Whirlpool 將其作為輸入。因此,要解密 EncryptedData,必須知道 DataBlock。
一個很好的檢查使用基於密碼函式的雜湊函式的方法,因為密碼是 SHACAL-2。SHACAL(-2)是經過最充分檢驗的“雜湊函式轉化為密碼”結構之一。它已與 SHA-1 和 SHA-2 雜湊函式一起使用。可以使用類似的構造將 Whirlpool(的某些實現)轉換為前向密碼函式,然後在計數器模式下使用它。
如果必須使用整個 Whirlpool 函式(“WhirlpoolCAL”構造上方不會使用散列函式的填充部分),那麼您可以使用密鑰派生構造作為流密碼。請參閱NIST SP 800-108 Recommendation for Key Derivation Functions using Pseudorandom Functions。該文件顯示了幾種可用於使用散列函式構造密鑰流的方法(已批准的散列函式是 SHA 系列,但在這裡您將使用 Whirlpool)。請注意,NIST SP 800-108 需要 HMAC 構造來從散列函式建構鍵控散列函式。
該文件還警告不要將函式用作流密碼:“為遵守本建議書,派生的密鑰材料不得用作流密碼2的 密鑰流。2使用密鑰派生提供的安全級別本建議書中規定的為流密碼生成密鑰流的功能尚未得到研究。”
所以總結是,你“可以”這樣做:
EncryptedData = Data XOR KDF(HMAC(Whirlpool))
其中 KDF 是使用以下過程實現的(有關完整詳細資訊,請參見上述文件 SP800-108)。
過程:
- n := ⎡L/h⎤。
- 如果 n > 2r-1,則指示錯誤並停止。
- 結果(0):= ∅。
- 對於 i = 1 到 n,執行
a。K(i) := PRF (KI,$$ i $$2 || 標籤 || 0x00 || 上下文 ||$$ L $$2) 12
b。結果(i) := 結果(i-1) || (一)。 5. 返回: KO := result(n) 的最左邊 L 位。
但是: Stephen Touset 的上述評論,SP 800-108 文件,以及這個答案,都警告不要這樣做。在適當的模式下使用像 AES(或者可能是 Camellia 或 ARIA 或其他)這樣的好的密碼來滿足對稱加密和解密的需求,並避免自製密碼學。
(如果您想使用 XOR 並且沒有消息完整性,則使用 AES-CTR。AES-GCM 通常是更好的主意。)