Dsa
Secp256k1 簽名中的“無窮遠點”的 x 座標是如何編碼的?
我正在測試比特幣的實現,它使用 ECDSA 的曲線 Secp256k1,我想看看它如何處理無窮遠點( $ 0 $ ) 如果出現在簽名中。例如,r 可以是無窮遠點編碼的 x 座標。
怎麼樣 $ 0 $ 編碼?可以編碼嗎?
我發現 bouncycastle 用 0x00 為 0 的編碼添加前綴,並定義了一些其他前綴
ECCurve.decodePoint()
( $ (r,s) $ . 此資訊似乎在 X9.62 標準中。
無窮遠點的標準編碼是值 0x00 的單個字節(它在 P1363 中至少定義為,也可能在 X9.62 中定義)。可能存在其他表示(例如許多字節的值為 0x00),但實際上,“無限遠點”沒有明確定義的X和Y座標。
在 ECDSA 的情況下,您生成一個隨機值k,它必須位於1和r-1之間,其中r是正常生成點G的(素數)階。因此,kG 不能是無窮大的點——如果是,那麼實現就出錯了,或者密鑰不正確。由於kG不是無窮遠處的點,那麼它總是有一個明確定義的X座標,問題就不存在了。類似地,如果在驗證算法期間獲得了無窮大點,那麼肯定會發生一些可疑的事情,因此應該拒絕簽名(這不會發生在有效簽名中)。
橢圓曲線 Diffie-Hellman 也是如此。總而言之,如果無限點的編碼開始變得重要,那麼就出現了問題,最好的辦法是聲明失敗(例如,將簽名拒絕為無效)。
好吧,“無限點”最常見的表示是一個僅由零組成的值;也就是說,如果正常點被編碼為一系列 64 字節,那麼無窮遠處的點將被編碼為 64 00 字節。
另一方面,它似乎不適用於 ECDSA。ECDSA 簽名由 1 和曲線階數之間的兩個整數組成,而不是一個點。ECDSA 公鑰確實包含一個點;然而,無窮大點被明確排除在法律可能性之外。