Ecdsa

如果有人想通過張貼假簽名來冒充中本聰來欺騙人們,他們怎麼可能呢?

  • April 11, 2019

如果一個隨機的欺詐者想要發布一堆公眾認為來自比特幣創造者的神秘 ECDSA 簽名,以擾亂比特幣市場,從人們那裡提取資金,或者以其他方式說服人們聽他們的話。他們怎麼能那樣做?

不幸的是,鑑於公眾對密碼學的理解有限,這顯然是一個容易上當的騙局。

關鍵的訣竅是,非技術人員傾向於相信聽起來足夠行話的事情,而技術人員往往認為他們知道的比他們實際知道的要多得多——所以他們很容易被送入歧途。

在密碼系統中,細節比你想像的更重要。因此,您所要做的就是製作一個適用於稍微修改過的密碼系統的偽造品,然後許多認為他們了解 ECDSA 工作原理的人會爭先恐後地聲稱結果成立。

您能想到的大多數修改都足以使該方案不安全。

例如,幾年前 Craig Wright 聲稱通過簡單地從區塊鏈中複製一些預先存在的簽名並發布一些模糊的驗證指令來“證明他是 Satoshi”。它很快就被弄清楚了,但仍然設法愚弄了很多人——他們太沉迷於胡言亂語,無法想到顯而易見的事情。在這種情況下,“修改”是詐騙者聲稱簽署的消息與實際簽署的消息沒有任何關係。

最近似乎有人再次嘗試了類似的事情,但這次使用不是來自區塊鏈的“簽名”……導致一些 BCH 客戶的開發人員向 RedHat 的工程師“驗證” 。但事實證明,這種嘗試是假的,人們對加密的部分但不完整的理解燒毀了他們。

正如比特幣開發人員 Pieter Wuille 指出的那樣,“ ECDSA 簽名中的消息不是散列並且由‘簽名者’選擇是不安全的。 ”——這一次騙子剛剛發布了‘散列’、r、s 元組。ECDSA 的雜湊部分是算法的組成部分。如果驗證者自己不執行雜湊,則 ECDSA 的安全屬性不成立,存在性偽造變得微不足道。

[同樣的漏洞被嵌入到 BCH 中的原始 OP_DSV 操作碼中——它最初沒有對傳入的數據進行雜湊處理,而是將其留給了使用者——但我報告了它,他們似乎在部署它之前已經修復了它。]

如果驗證者自己不執行散列,而只是接受簽名者給定的值,他就會受到以下情況的影響:給定公鑰 P,選擇隨機的非零值 a 和 b。計算 R=aG+bP。現在 (Rx, Rx/b) 是密鑰 P 下“消息雜湊” (Rx*a/b) 的有效簽名。

這不會損害真正 ECDSA 的安全性,因為您找不到散列到所選 (Rx*a/b) 值的消息。

人們應該警惕混淆或過度技術性的“證明”——看起來“像”一個安全系統但出於某種原因讓人們使用原始數字或程式碼來驗證它的東西。精心設計的加密軟體付出了很多努力來避免使用者被這樣的特技所愚弄。這東西很棘手,如果他們被說服自己有效地實施定制的密碼系統,任何人都可能會混淆接受錯誤的證明。密碼系統並不安全,僅僅是因為您個人不知道如何破解它。

這是一個範例 Sage 腳本,用於生成偽造文件,該腳本將欺騙接受 ECDSA“簽名”而不自己對消息進行雜湊處理的人。它適用於任何 EC 密鑰,包括偽造者之前沒有看到簽名的密鑰。

F = 有限域 (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)
C = 橢圓曲線 ([F (0), F (7)])
G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)
N = 有限域 (C.order())
P = P=-C.lift_x(0x11db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c) # 區塊 9 coinbase 支付密鑰。
def forge(c, a=-1): # 創建一個偽造的 'ECDSA' (hashless) 簽名
# 將 a 設置為 -1 以外的值,以使其不那麼明顯
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
列印'hash1 = %d'%m
列印'r1 = %d'%(int(R.xy()[0]))
列印 's1 = %d'%s
對於範圍內的 c(1,10):
偽造(c)

這段程式碼產生了最近用來欺騙人們的那種偽造品。

雜湊1 = 25292222169426362969760742810503101183086560848420849767135309758511048414376
r1 = 61518691557461623794232686914770715342344584505217074682876722883231084339701
s1 = 54273397679854571629338298093917192510492979773857829699728440258287077154636

引用自:https://bitcoin.stackexchange.com/questions/81115