Hash

如果您只知道 hash(a) 和 Hash(b) 和 Hash(c),有什麼方法可以計算 (a + b +c)) 的雜湊?

  • October 28, 2022

例如,如果你說 3 個不同的明文段落 a、b、c,而你只知道 hash(a)、hash(b) 和 hash(c),那麼你有一個明文 d,它聲稱是a,b和c的串聯,有沒有辦法使用hash(a,b,c)來證明d要麼是a+b+c,要麼不是a+b+c?

不是數學家,我猜有一種蠻力方法,取決於 a、b 和 c 的長度,嘗試將 d 的每一種可能劃分為 3 部分,看看你是否可以匹配各個散列,但是除非 ab 和 c 很短,否則似乎計算量很大。有沒有一種方法不依賴於 a、b 和 c 的長度?

不是數學家,我猜有一種蠻力方法,取決於 a、b 和 c 的長度,嘗試將 d 的每一種可能劃分為 3 部分,看看你是否可以匹配各個散列,但是除非 ab 和 c 很短,否則似乎計算量很大。

實際上,聽起來並沒有那麼糟糕。認為 $ d $ 長度為兆字節。有一百萬種(加一種)方法 $ a $ 可以是前綴 $ d $ (假設 $ a $ 已知是整數個字節;如果它可能是任意位串,則乘以 8);散列所有可能的前綴,並查看它們是否與已知值匹配 $ hash(a) $ . 一旦你有 $ a $ (因此長度 $ a $ ),然後您可以對 $ b $ ; 最多有一百萬個雜湊值,你可以恢復 $ b $ (然後還要驗證 $ c $ )

假設您的雜湊函式是 SHA-2 或 SHA-3 或類似的東西(如果您在掃描可能的匹配項期間重用中間雜湊值 $ hash(a), hash(b) $ )

這類似於眾所周知的結構,即所謂的增量散列。有關指針,請參閱本文

粗略地說,增量雜湊與集合操作是同態的。或者換句話說,如果你有一個數據庫 $ \mathcal{D} $ 你

  1. 需要維護雜湊 $ H_{\mathcal{D}} := H(\mathcal{D}) $ 的,同時
  2. 通過添加更新( $ \mathcal{D} + e := \mathcal{D}\cup {e} $ ) 和刪除 ( $ \mathcal{D}-e := \mathcal{D}\setminus{e} $ ) 元素,

可以使用增量散列來有效地更新 $ H_{\mathcal{D}} $ 無需重新計算 $ H(\mathcal{D}) $ 每次手術後。

引用自:https://crypto.stackexchange.com/questions/102476