他是中本聰?為什么連簡單的消息簽名都不用?
比特幣系統(tǒng)中可以給一串消息進行數字簽名,有三個作用:
- 證明你擁有某筆資金的私鑰
- 該證明是無可爭辯的、不可抵賴的
- 簽名后的交易沒有被其他人修改過
數字簽名使用橢圓曲線數字簽名算法(ECDSA),算法非常復雜,普通用戶不必掌握其算法的細節(jié),但你只要掌握了Bitcoin Core錢包軟件或類似工具,也可以非常輕松地生成簽名或驗證簽名。
生成簽名
在Bitcoin Core軟件的“文件”菜單下,點擊“消息簽名”菜單項,彈出一個對話框。分別填寫比特幣地址,消息文本,點擊“消息簽名”按鈕,則會在底部的簽名區(qū)出現(xiàn)一行文本,這段文本可以證明你擁有那個比特幣地址、那段消息是完整的、沒有被修改過一個字,這個證明誰都可以驗證、不可抵賴。
驗證簽名
在Bitcoin Core軟件的“文件”菜單下,點擊“驗證消息”菜單項,彈出一個對話框。分別填寫比特幣地址、消息文本、簽名文本,點擊“驗證消息簽名”按鈕,則會出現(xiàn)是否驗證成功的提示。
沒有安裝Bitcoin Core軟件也沒關系,很多網站都提供了驗證簽名的工具。比如:https://blockexplorer.com/messages/verify
再比如這個網站:
https://bitcotools.com/verify-messages
下面這個網址中列舉了幾十種簽名方法:
https://bitcointalk.org/index.php?topic=990345.0
截圖上文字顯示得不全,我的完整消息簽名是:
- H0UP22YwxdZ0EyetmIoY72w/v1QGQiSk2vAf6jViHlw/DBC+76775pFqxGclbrkny4D40bVWe9nPLgl/MMWQyZs=
在NBitcoin 中進行消息簽名用2個函數就可以搞定,非常方便:
- 生成簽名文本用 key.SignMessage(msg)
- 驗證簽名用 addr.VerifyMessage(msg, sig)
就這樣簡單,完整源代碼:
- // 用私鑰給一個消息進行簽名
- var msg = "我擁有這個地址的私鑰:17mKugcBDEJbu391Fq41AdwLeGHwJLPRDf";
- string priv = "3243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C8";
- Key k = new Key(Encoders.Hex.DecodeData(priv), -1, false); // 非壓縮密鑰
- var sig = k.SignMessage(msg);
- Console.WriteLine(sig);
- // 結果:
- // G2HBHn+ZmgTNtCnxMbgWf4nbXcTjB
- // KFvy3am3UWcxdA0TD3MDdpqaZgEoY
- // PsvbhR +OSZkR9hSp/rrO3nErlzBjY=
- // 驗證一個簽名
- var addr = new BitcoinPubKeyAddress("17mKugcBDEJbu391Fq41AdwLeGHwJLPRDf");
- Console.WriteLine(addr.VerifyMessage(msg, sig));
- // 驗證我以前用Bitcoin Core做過的一個簽名
- var addr2 = new BitcoinPubKeyAddress("12j75TnvVhEVxk3fiaPSy3w4FVfjsKbKZm");
- var msg2 = "申龍斌的程序人生";
- var sig2 = "H0UP22YwxdZ0EyetmIoY72w/v1QGQiSk2vAf6jViHlw/DBC+76775pFqxGclbrkny4D40bVWe9nPLgl/MMWQyZs=";
- Console.WriteLine(addr2.VerifyMessage(msg2, sig2));
Craig Steven Wright(CSW)一直聲稱他就是中本聰,為什么不拿創(chuàng)世區(qū)塊中的比特幣地址(1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa)對一段消息進行簽名?
看來澳本聰就是一個騙子。
【本文為51CTO專欄作者“申龍斌”的原創(chuàng)稿件,轉載可通過作者微信公眾號(申龍斌的程序人生)獲取聯(lián)系】