為什麼簽名 S 值過高不安全?
發送
RawTX
到PushTX
消息時經常收到警告(Non-canonical signature: S value is unnecessarily high)
為什麼具有大值的簽名 S 很危險(即,當第一個 HEX 數字以 開頭時
FF ...
)???從 Pieter Wuille的回答來看,我知道這樣做是為了 TX 的安全
但我想了解它在計算中是如何工作的?您能否舉例說明在確定密鑰時如何應用它
K
?
這並不危險,因為私鑰可以被洩露。更危險的是,攻擊者可以製作功能相同但簽名略有不同的交易版本,因此具有不同的交易 ID。
這個問題是稱為交易延展性的一組問題的一部分。交易延展性是第三方在交易後修改交易的能力,使其具有不同的交易 ID,但在功能上仍與原始交易相同。這意味著交易仍然花費相同的輸入並創建相同的輸出。這並不意味著攻擊者可以拿走任何比特幣——不可能改變交易的輸出。
一般來說,ECDSA
s
值具有延展性。任何第 3 方都可以接受簽名,s
以非常具體的方式修改值,並且簽名仍然是完全有效的。正因為如此,它引入了一種可以處理交易的方式。需要注意的是,這不會洩露私鑰,不會洩露 nonce,並且不允許偽造簽名。它所做的只是更改簽名的實際字節。這種修改的工作方式是否定
s
值。如果您這樣做s - n (mod n)
,則通常表示為 的結果對於該簽名-s
仍然有效s
。這樣做的結果是總會有 2 個可能的s
值,其中一個高於另一個。此外,一個總是小於n / 2
,一個大於n / 2
。比特幣選擇要求它s
是低價值——我們可以很容易地選擇要求s
它是高價值。使用低或高並不重要,只要始終使用它來避免這種形式的交易濫用。交易濫用是一個問題的原因是因為它會導致同一交易的交易 ID 不同。這意味著大多數錢包和節點會將交易視為與原始交易衝突的新交易。許多錢包軟體都存在交易衝突的問題。他們可能會顯示不正確的餘額。它們還可能無限期地顯示衝突的交易,這可能會給使用者造成混淆。並不是說交易濫用會導致比特幣失去或被盜,而是它會導致使用者體驗下降,並可能由於軟體錯誤而失去硬幣。