Dsa
為什麼使用(r,s)(r,s)(r,s)代替(r,s−1)(r,s−1)(r,s^{-1})作為 DSA 簽名?
DSA 簽名由兩個標量組成 $ (r,s) $ .
簽約時 $ s $ 生成為:
- $ s=k^{-1}(H(m)+xr) \mod q $
- 簽名是 $ (r,s) $
驗證時 $ s $ 僅用於計算 $ w = s^{-1} $ . 那麼為什麼 DSA 儲存 $ s $ 在簽名而不是 $ w $ ?
使用 $ w $ 對簽名沒有性能影響,因為計算 $ s $ 或者 $ w $ 需要一個模反轉。 $ w = s^{-1} \mod q = k (H(m)+xr)^{-1} \mod q $ .
由於模反演計算,它將加速驗證 $ w $ 不再需要了。
唯一的優點 $ s $ 我看到的是,可以在知道散列之前計算模反轉。DSA 設計人員是否認為預計算比驗證減慢更重要,或者使用 $ s $ 我沒看到?
嗯,一整天了,還沒有人給出權威的答案;我將猜測為什麼設計 DSA 的人會做出他們所做的選擇。
使用 DSA,有與此討論相關的三個操作:
- A:對簽名進行預計算(沒有看到正在簽名的消息)
- B:給定一個預計算的簽名和一條消息,生成實際的簽名
- C:驗證簽名。
標準 DSA 和您的變體 DSA 執行完全相同的操作,除了標準 DSA 在步驟 A 和 C 計算模逆,而您的變體在步驟 B 計算它。
確實,標準 DSA 執行兩個模逆運算,而您的變體只執行一個;然而,這可能不是唯一的因素。
如果我們看一下步驟 B,我們會發現所涉及的操作非常便宜(單模乘法和加法);如果我們在那裡包含一個模乘運算,我們將大大增加該運算的成本。相比之下,步驟 A 和 C 已經很昂貴(涉及模冪運算或點乘);包括模逆只會使這些操作減慢一小部分。
也就是說,DSA 具有通過預計算生成簽名的速度非常快的特性。您的變體顯著降低了這一優勢;DSA 設計者旨在保持這一優勢,即使以增加所需的總計算量為代價。
現在,您可能不同意上述邏輯;實際上,人們已經提出了與您建議的完全一樣的 DSA 變體。