DSA 簽名生成
我正在嘗試在 python 中實現給定的 DSA 簽名生成指令,在第 3 步和第 4 步中我無法理解的指令很少。
令 m 為任意長度的消息。簽名計算如下:
- 生成 k (即 k 是一個隨機整數$$ 0, q − 1 $$)
- r = g^^k(mod p)
- h = SHA3 256(m||r)
m||r 是什麼意思?m 是消息長度 r 也是一個數字,那麼
hashlib.sha3_256(input)
函式的輸入應該是什麼?正如我在 Python 中看到的,它說輸入必須是一個字元串(轉換為字節)。 4. s = α · h + k (mod q)h 是 sha3_256 返回的字元串,那麼如何將它與 α 相乘? 5. m 的簽名是元組 (s, h)
這 $ \parallel $ 符號表示串聯。在這種情況下,接受消息 $ m $ (這是一個位序列),對值進行編碼 $ r $ 作為位序列,並散列包含在的位序列 $ m $ 其次是編碼 $ r $ .
在第 4 步中,您有一個位序列(雜湊輸出),您必須以某種方式將其轉換回整數。這又是一個編碼問題,但這次是在解碼方向。這裡的基本主題是您必須有一些約定,讓您將整數編碼為位,並將位解碼為整數。從安全的角度來看,約定的選擇或多或少是開放的,但它當然是算法規範的一部分:簽名者和驗證者必須就這些細節達成一致,否則驗證者不會接受由簽名者。
順便說一句,這不是 DSA。DSA 由FIPS 186-4指定。您所描述的稱為Schnorr 簽名(有幾種變體,例如 $ m $ 和 $ r $ 在串聯中,或者是否 $ s = \alpha h + k $ 或者 $ s = \alpha h - k $ ; 所有這些變體都獲得了或多或少等效的安全性)。從歷史上看,這種區別很重要:DSA 是在 Schnorr 為他的方案申請專利的時候定義的,並且 DSA 的定義是為了避免該專利而仔細制定的。在密碼學上,差異也很重要:Schnorr 簽名的“安全圖片”更好(我們可以對 Schnorr 簽名進行安全證明,但我們不知道如何使用 DSA 來做到這一點;並且 DSA 簽名是可延展的,這是通常是無害的,但過去曾允許對比特幣進行重放攻擊)。