應用密碼學

ECDSA 簽章

ECDSA 是比特幣與 Taproot 之前的以太坊用來證明資金所有權的方式:持有私鑰者對一個訊息雜湊產生簽章 (r, s),任何人都能用公鑰驗證,過程中完全不會得知金鑰。它是較舊的 DSA 在橢圓曲線上的對應版本。

要用私鑰 d 對雜湊 z 簽章:選一個每次簽章專用的隨機 nonce k,落在 [1, n−1],計算點 kG,令 r = (kG).x mod n,再計算 s = k^(−1)·(z + r·d) mod n;簽章即為 (r, s)。要用公鑰 Q = dG 驗證:計算 u1 = z·s^(−1)、u2 = r·s^(−1),並檢查 (u1·G + u2·Q).x mod n 是否等於 r。以太坊在 (r, s) 之外附帶一個復原碼 v,讓 ecrecover 預編譯合約能直接從簽章還原出簽署者地址。

兩個惡名昭彰的陷阱主導了 ECDSA 的安全。其一,nonce k 必須均勻隨機且絕不重用:兩個共用同一個 k(甚至只是略有偏差的 k)的簽章,會讓攻擊者以簡單代數解出私鑰——索尼 PlayStation 3 的簽署金鑰外洩、以及無數錢包被掏空,皆肇因於此。其二,可塑性:(r, s) 與 (r, n−s) 都是有效簽章,因此簽章——連同由它衍生的比特幣交易 ID——可在不知金鑰的情況下被竄改;比特幣的 low-s 規則(BIP-62)與 SegWit 修正了此問題。

r = (k*G).x mod n ; s = k^(-1) * (z + r*d) mod n

ECDSA 最致命的 bug 是不均勻的 nonce。RFC 6979 透過 HMAC 由私鑰與訊息確定性地導出 k,把亂數產生器這個攻擊面消除掉,同時讓簽章維持完全可驗證。

又称
Elliptic Curve Digital Signature Algorithm橢圓曲線數位簽章演算法