Greg Maxwell:CSW再次偽造中本聰簽名
在BCH算力戰爭的第二天,一些密碼貨幣愛好者發現了一條訊息,它似乎擁有著比特幣第9個區塊的“有效簽名”,這條訊息警告稱比特幣區塊鏈上的隔離見證(Segwit )協議存在一些問題。此外,Coingeek的所有者Calvin Ayre隨後在推特上發文稱“中本聰活了!”,Ayre還轉發了來自Twitter賬號@Satoshi的訊息。
真的是來自中本聰本人嗎?很快比特幣技術大神Greg Maxwell解釋稱,這其實只是Craig Wright第二次偽造的簽名:
“如果有人想要釋出一堆神祕的ECDSA簽名,使得公眾認為這些簽名是來自比特幣的創造者,以此破壞比特幣市場,從人們那裡榨取錢財,或以其他方式說服人們聽取他的意見,他們要怎樣才能實現呢?”
Maxwell自答道:
“不幸的是,鑑於公眾對密碼學的理解有限,這顯然是一件容易造成欺詐的事情。
他們的關鍵技巧在於,非技術人員傾向於相信那些看起來很麻煩的東西,而技術人員往往認為他們比實際知道的要多得多,所以他們很容易誤入雜草堆當中。
在密碼系統當中,細節比你想象地要更重要,因此,你所要做的,就是一個製作一個稍有修改的密碼系統偽造品。然後很多自認為理解ECDSA工作原理的人,便會急於宣稱其結果成立。
你能想到的大多數修改,足以使該方案不安全。
因此,例如幾年前,Craig Wright通過簡單地從區塊鏈中複製一些預先存在的簽名,並在驗證它們時釋出了一些混淆的指令來證明自己就是中本聰。然而,很快這件事就被揭穿了,但這個方法仍然愚弄了很多人,這些人陷入了困境,想當然地認為事實就是這樣的。在這種情況下的“修改”,是詐騙者聲稱要簽名的訊息,與實際簽名的訊息沒有任何關係。
最近,他似乎再次嘗試了,但這次的“簽名”並非來自區塊鏈...導致一些BCH客戶端的開發者向 ofollow,noindex" target="_blank">RedHat的一名工程師 進行了“驗證”。但事實證明,這個簽名還是偽造的,人們對密碼學的理解不夠深入,這導致他們再次被騙了。
正如比特幣開發者Pieter Wuille所說,“ECDSA簽名訊息並非是一個雜湊,而由‘簽名者’所選擇的是不安全的。”
這一次,詐騙者 釋出了 'hash',r,s元組。ECDSA的雜湊部分是演算法不可獲取的部分。如果驗證者本身沒有執行雜湊,則ECDSA的安全屬性不會成立,則 偽造會變得微不足道 。
[同樣的漏洞也被帶到了BCH中的原始 OP_DSV
操作碼中,它最初沒有對輸入資料進行雜湊處理,而是將其留給了使用者。但我上報了它,並且在部署之前,開發者們似乎已修復了它。]
如果驗證者自己不執行雜湊,但僅接受簽名者給出的值,則給定公鑰P,選擇隨機非零值a和b。計算R=aG+bP。現在, (R.x, R.x/b)是金鑰P對“訊息雜湊” (R.x*a/b)的有效簽名。
這不會危及真實ECDSA的安全性,因為你無法找到雜湊至所選(R.x * a / b)值的訊息。
人們應該警惕那些模糊或過於技術性的“證明”(那些看起來像“安全系統”的東西,但出於某種原因,人們會使用原始數字或程式碼來驗證它)。而精心被設計的加密軟體,因做了大量的工作,其可避免使用者被這樣的特技給愚弄。這些東西很棘手,如果他們確信自己有效地實施定製的密碼系統,任何人都可能會陷入困惑,以至於接受這種虛假證明。一個系統是不安全的,這僅僅是因為,你自己對它不夠了解。
這裡有一個示例Sage指令碼來生成偽造簽名,這些指令碼會欺騙那些接受ECDSA“簽名”的人,而無需雜湊訊息。它適用於任何EC金鑰,包括偽造者之前沒有看到過的簽名。
F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) C = EllipticCurve ([F (0), F (7)]) G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) N = FiniteField (C.order()) P = P=-C.lift_x(0x11db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c) # block 9 coinbase payout key. def forge(c, a=-1):# Create a forged 'ECDSA'(hashless) signature # set a to something other than -1 to be less obvious a = N(a) R = c*G + int(a)*P s = N(int(R.xy()[0]))/a m = N(c)*N(int(R.xy()[0]))/a print 'hash1 = %d'%m print 'r1 = %d'%(int(R.xy()[0])) print 's1 = %d'%s for c in range(1,10): forge(c)
而下面的這段程式碼,就生成了最近欺騙人們的偽造簽名:
hash1 = 25292222169426362969760742810503101183086560848420849767135309758511048414376 r1 = 61518691557461623794232686914770715342344584505217074682876722883231084339701 s1 = 54273397679854571629338298093917192510492979773857829699728440258287077154636
”
你怎麼看?