比特幣簽章重複使用臨時數,真的會洩漏私鑰嗎?

比特幣錢包用私鑰替交易產生數位簽章,全節點再用對應公鑰驗證授權。簽章會隨交易一起公開,而且同一把私鑰可以使用很多次;照這個直覺,多簽幾次似乎只會多留下幾份可公開檢查的證明。
不過,常見簽章演算法在每次簽署時,還需要一個只服務該次計算的祕密臨時數,英文常稱 nonce。若同一個臨時數被拿去簽署兩份不同訊息,兩份公開簽章之間可能出現足以解出私鑰的數學關係。攻擊者無須破解橢圓曲線,也不必控制比特幣網路。
因此,危險來源不在「簽章出現很多次」,而在不同簽署內容錯誤共用了同一個祕密臨時數,或臨時數本身可以被猜中。可靠錢包會用安全亂數,或依私鑰與待簽摘要確定性地產生臨時數,避免這項一次性的內部材料重複或外洩。
簽章同時用到長期私鑰與一次性材料
交易簽署前,錢包會依簽章規則整理輸入、輸出、金額與其他欄位,再計算待簽摘要。簽章演算法把這份摘要、長期私鑰與臨時數一起轉換成一組可公開驗證的數值。驗證者能確認簽署者掌握私鑰,卻不應從單份正常簽章反推出私鑰或臨時數。
臨時數的角色有點像每次簽署都要換新的內部墊片。它不是交易序號,也不是寫在區塊裡供大家協調先後的欄位;它只存在於產生簽章的計算過程。名稱中的「臨時」也不代表可以隨便從時間、計數器或少量隨機選項中挑一個,因為可預測性同樣會縮小攻擊者需要搜尋的範圍。
比特幣曾廣泛使用 ECDSA,Taproot 支出則使用 Schnorr 簽章。兩者的公式不同,但都有相似的實作要求:每次簽署所需的祕密 nonce 必須依演算法正確產生,不能在不該重複的訊息之間重用。
兩份不同訊息會把未知數變少
單看一份 ECDSA 簽章時,私鑰與臨時數都是攻擊者不知道的量,公開資料不足以直接把兩者分開。若兩份不同交易摘要錯用了同一個臨時數,兩條簽章關係便共享同一個未知量。攻擊者可以利用公開摘要與簽章值先求出臨時數,再回推長期私鑰。
這並非機率很低的密碼學碰撞,而是重用造成的代數漏洞。只要公開資料符合條件,計算可以離線完成;受害者之後更換 App 密碼、停止廣播舊交易,也不會讓已經暴露的私鑰重新保密。攻擊者取得私鑰後,可能簽署新的有效交易,花掉仍由該鑰匙控制的 UTXO。
Schnorr 簽章也不能忽略 nonce 管理。其關係式同樣會把長期祕密與一次性祕密結合;若跨不同訊息重用相同 nonce,公開簽章可能讓私鑰被解出。多人協作簽署時還要防止惡意參與者操弄或重播彼此的 nonce 貢獻,所以成熟協議會明確綁定參與者、訊息與簽署回合。
重送同一份簽章不等於再次洩密
網路可能反覆轉送同一筆交易,同一份已簽資料也可能被多個節點保存。這些副本沒有新增另一條獨立簽章關係,只是相同位元資料的重複出現。攻擊者看到一百份相同副本,獲得的資訊通常仍等同看到一份。
確定性簽章也不等於危險的 nonce 重用。可靠實作可以把私鑰與待簽摘要送入規定程序,為相同輸入重現相同 nonce,為不同摘要產生不同結果。相同交易再次簽署時可能得到同一份簽章;只要程序正確,這和把固定 nonce 套到兩份不同交易上是兩回事。
真正要警戒的是同一把私鑰對不同摘要產生簽章時,內部 nonce 卻相同、可預測或部分外洩。硬體故障、品質不佳的亂數來源、自製簽章程式、協議整合錯誤,以及裝置透過耗時或耗電差異洩漏內部資料,都可能破壞原本的安全假設。
鏈上只能看到結果,無法替裝置修正過程
區塊鏈會保存交易與簽章結果,節點能判斷簽章是否對目前交易有效,卻無法從單次驗證得知簽署裝置的亂數是否健康。即使一份簽章通過規則,它的產生過程仍可能留下日後可被其他簽章拼出的弱點。
這也說明為何「交易有效」與「簽署設備安全」是兩個層次。比特幣共識能拒絕無效簽章,無法阻止合法持有私鑰的故障軟體用危險方式計算。等到鏈上出現可相互分析的簽章,祕密可能已經失守。
對一般使用者而言,較實際的防線是使用經過廣泛檢驗的錢包與硬體簽署器,保持安全更新,避免把重要私鑰交給自行拼裝或來源不明的簽章工具。若已確認某把私鑰因 nonce 問題暴露,只停止使用舊軟體仍不夠;在攻擊者先行支出以前,還需要用可信環境把剩餘資產移到由全新祕密控制的地址。
所以,公開許多正常簽章不會自然累積成私鑰,重送相同交易也不會憑空增加一組方程式。真正危險的邊界,是不同簽署內容共用了本應一次性的祕密材料。數位簽章的安全不只依賴演算法名稱,也依賴每次簽署都正確處理那些看不見、卻不可重複的內部數值。