簡單:散列到素數欄位
如果我有一些字節,並且我想將安全雜湊計算為 300 位長的素數欄位,我可以:
使用一個不錯的雜湊,比如 sha3_512,然後
- 模我的主要領域(引入一些偏見)。
- 扔掉最重要的位,直到數字<我的素數(偏向較小的數字)
- 將最重要的位扔掉,直到 300 位,然後在需要時對我的素數取模(減少偏差?)。
- 將最重要的位扔掉,直到 300 位,然後如果數字太大(最終收斂),則重新開始(散列雜湊)。(沒有偏見,慢)
- ???一些更好的方法????
總體偏見有多重要?
- 如果我使用生成的散列作為 EC 簽名方案的散列,它是微不足道的……因為散列沒有保護任何東西……它只是一個值得關注的衝突,我們已經使情況變得更糟了一小部分一點。
- 如果我在例如 mpc 計算期間使用生成的雜湊作為“nonce”來保護秘密值,它可能是“洩漏的”。在這種方案的許多用途中,有人可能會使用偏見來攻擊密鑰或 mpc。用於降低簽名延展性的確定性隨機數也是如此,這就是為什麼我認為它們是一個非常糟糕的主意。請參閱https://ecc2017.cs.ru.nl/slides/ecc2017-tibouchi.pdf了解這有多糟糕。
- 如果我使用生成的雜湊作為基於配對的簽名方案的私有部分(這需要將消息映射到曲線中),在我看來,偏差只會導致類似的碰撞損失。
有沒有人比較過偏見的掩蔽方法?是否有關於最佳實踐的良好參考?是否對需要關注此類掩蔽的協議類型進行了很好的分析?
首先要注意的是,如果您的範例是將消息散列為 512 位值,然後將該 512 位欄位映射為一個值 $ (0, p-1) $ , 那麼(除非 $ p $ 恰好是 2 的冪,而且很少有素數)總會有一些偏差。 $ p $ 不是的除數 $ 2^{512} $ ,因此某些值將具有比其他值更多的 512 位原像(並且採用複雜的雜湊方法不會改變這一點)。
其次,如果這是我們需要接受的範式,那麼您的方法 1(計算 $ hash \bmod p $ ) 實現最小可能的偏差;一些值會有 $ \lfloor 2^{512}/p \rfloor $ 原像(因此有可能發生 $ 2^{-512} \lfloor 2^{512}/p \rfloor $ , 其他人會有 $ \lfloor 2^{512}/p \rfloor + 1 $ 原像(因此有可能發生 $ 2^{-512} \lfloor 2^{512}/p \rfloor + 2^{-512} $ ; 沒有其他可能性。
第三,這種偏差的數量(對於 $ p \approx. 2^{300} $ ) 真的很小;之間的比率 $ 2^{-512} \lfloor 2^{512}/p \rfloor $ 和 $ 2^{-512} \lfloor 2^{512}/p \rfloor + 2^{-512} $ 大約是 $ 1 + 2^{-212} $ ; 甚至檢測到微小的偏差(並且無法利用不可檢測的偏差),您需要大約採樣 $ 2^{424} $ 在檢測到偏差之前的雜湊值;你永遠不會產生那麼多。
第四,取模方法的一個優點是它易於測試(假設您使用的是經過審查的取模常式)。對於涉及異常的方法,這些可能會更棘手(因為您需要檢查所有可能的情況以確保正確處理這些情況);使用模數,只有一種情況。