如果我們使用原始公鑰作為地址,可能會對 ECDSA 進行哪些潛在攻擊?
根據這個關於為什麼地址是雜湊而不是公鑰的答案,如果您擁有公鑰而不是地址,則可能存在潛在的攻擊,這些攻擊是什麼?如果一個人正在編寫一種加密貨幣,你會建議不要將地址作為以 base58 編碼的公鑰並在末尾加上校驗和嗎?為什麼?
理論
假設為了偽造 ECDSA 簽名,您需要首先計算給定公鑰的私鑰(此操作稱為“離散對數”(DL),其硬度是 ECDSA 安全性的基礎)。為此,您必須實際擁有公鑰。
獲得公鑰後,假設您需要至少2 128次操作來計算其私鑰。這是一個巨大的數字(如果世界上每台電腦每個時鐘週期都可以執行一項相關操作,那將需要 1 億年以上的時間;實際上,它會比這多幾個數量級)。然而,這是假設計算離散對數或量子電腦的算法沒有根本性突破。一個足夠強大的量子電腦(不是任何已經存在的東西)可能能夠更快地進行這種計算。
通過使用包含公鑰散列而不是直接使用公鑰的地址,實際的公鑰在其所有者花費輸出之前不會向世界透露。除非在使用的散列函式(SHA256 和 RIPEMD160)中發現任何(驚人的)漏洞,否則即使是量子電腦也無法輕易地從散列函式中找到公鑰。然而,在這種情況下,使用的 160 位雜湊仍然被認為是相對較弱的(在足夠強大的量子電腦上進行2 80次操作)。
簡而言之:論點是,通過使用公鑰雜湊,具有 DL 破解或假設的量子電腦的人竊取硬幣的能力變得更加困難。
在實踐中
我在這部分寫的是我自己的觀點,想必不是每個人都同意。
我相信散列公鑰的這種(經常重複的)優勢充其量是微不足道的,最壞的情況是一種虛假的安全感。有幾個原因:
- 該參數僅適用於(嘗試)輸出輸出。一旦有人試圖花費一個付費公鑰雜湊輸出,他們就會洩露完整的公鑰。在礦工的少量合作下,原始交易可能會被暫時延遲,從而讓假設的量子計算攻擊者有時間找到私鑰並竊取硬幣。
- 地址重用過去和現在都非常普遍,而且顯然難以避免。每當地址被重用時,它們的公鑰在第一次花費時就會被洩露,這使得所有未來的地址仍然容易受到攻擊。
- 人們用比特幣做的幾乎所有有趣的事情(包括多重簽名、2FA、託管、支付渠道、BIP32 賬戶……)都涉及與其他方共享公鑰。認為在這樣的世界中,任何安全性都可以通過使用公鑰散列來獲得,這是一種錯覺——因為公鑰仍然一直在公開,通常人們甚至都不知道它。
- 即使您限制自己小心地不依賴任何這些技術,並且在使用之前將所有公鑰保密,但仍有超過 500 萬個 BTC(我自己的研究)與公開的公鑰一起儲存。我無法想像如果那些實際上容易被盜(或者甚至只是可信地被認為是易受攻擊的),BTC 會保留任何價值。
這並不意味著我們有問題。足夠強大的量子電腦還很遙遠——如果它們對於解決這些問題所需的大量 q 比特完全可行的話。這讓我們有時間慢慢遷移到實際上抗量子的方案(根本不使用 ECDSA 或類似的密碼學)。這還沒有完成,因為目前現有的抗量子方案帶有非常大的密鑰和簽名,以及其他各種警告。這使得它們現在非常不吸引人,但是對它們的研究正在迅速進行,如果需要,它們是存在的。
你應該使用公鑰地址嗎?
如果一個人正在編寫一種加密貨幣,你會建議不要將地址作為以 base58 編碼的公鑰並在末尾加上校驗和嗎?為什麼?
關於其他加密貨幣的建議在這裡是題外話,但關於比特幣的Taproot 提案將有效地做到這一點。它的輸出(以及地址)包含一個完整的公鑰,因為它具有許多優點(它更小、更便宜,並且使許多更高級的協議變得更容易)。
Bech32地址格式用於這些類型的輸出,與 Base58 相比具有許多優點(更易於音譯/比較、更強的錯誤檢測、更可擴展、更小的 QR 碼……)。
免責聲明:我是 Taproot 提案和 Bech32 標準的共同作者。
TL;DR:公鑰應該是public。