Hash
(EC)DSA 簽名沒有散列,還是解除安裝散列?
在根據FIPS 186-4的 (EC)DSA 中,要簽名的消息首先被散列。想像一下,我們跳過這個散列階段,而是將消息放在散列所在的位置,並限制消息的大小 $ h $ 到原始雜湊的輸出寬度 $ N $ 位。由此產生的方案很容易受到(至少)這些存在的偽造品的影響( $ q $ 是乘法組階):
- 消息的任何簽名 $ 0\le h<2^N-q $ 對消息也有效 $ h+q $ ;
- 消息的有效簽名 $ h=0 $ 和 $ h=q $ 很容易獲得:在 DSA 中, $ (r,s) $ 和 $ r=s=y\bmod q $ 訣竅,在哪裡 $ y $ 是公鑰;有一個ECDSA的模擬,它 $ r=s=x_A\bmod q $ , 在哪裡 $ x_A $ 是個 $ x $ 公鑰的座標,和 $ q=n $ .
其他攻擊可能嗎?特別是,對簽名預言的臨時訪問是否允許完全中斷(密鑰提取或其他方式來簽署任何消息)?
當人們想要降低簽名設備和使用它對大型消息進行 (EC)DSA 簽名的主機之間的通信成本時,這個問題是直接有趣的:我們能否將雜湊計算完全解除安裝到主機上?我相信這是成立的(正如評論中所指出的,這似乎是實踐),但我們可以證明這一點嗎?如果不是,我們如何在不破壞標準一致性的情況下安全地解除安裝大部分計算?
讓我們專注於 DSA。在消息上簽名 $ m\in \mathbb{Z}_q $ 對於建議的“無雜湊”協議,執行如下:
- 挑選 $ k\in_R \mathbb{Z}_q $ , 計算 $ r=f(g^k) $ , 在哪裡 $ f(\cdot):=(\cdot \bmod p) \bmod q $ .
- 計算 $ s=k^{-1}(m+xr)\bmod q $
- 返回 $ (r,s) $ 如果簽名沒有退化。
驗證算法,輸入 $ (m,s,r) $ , 檢查是否 $ f((g^m\cdot y^r)^{(1/s)})=r $ .
以下內容包括在僅密鑰攻擊下對隨機消息的偽造。
- 讓 $ K=g^a\cdot y^b $ , 在哪裡 $ a,b\in_R\mathbb{Z}_q $
- 計算 $ r=f(K) $ , 並設置 $ s=r/b $
- 返回 $ (r,s) $ 作為偽造 $ m=(a\cdot r)/b $
(我會在適當的時候添加參考資料。)