Elliptic-Curves
為什麼我們有 ECDH 時還需要 ECDSA?
ECDSA 和 ECDH 為我們提供了以下方法:
// ECDSA var signature = ECDSA.sign(privateKey, hash); var isValid = ECDSA.verify(publicKey, hash, signature); // ECDH var sharedSecret1 = ECDH.compute(node1.publicKey, node2.privateKey); var sharedSecret2 = ECDH.compute(node2.publicKey, node1.privateKey); // sharedSecret1 == sharedSecret2;
ECDSA 給出一個很長的簽名(73 字節)。
我想知道如果我們只能使用 ECDH 進行簽名並獲得更小的簽名,為什麼我們需要 ECDSA:
function sign(priavteKey, hash) { // generate public key from private key var publicKey = computePublicKey(hash); var sharedSecret = ECDH.compute(publicKey, privateKey); var signature = hash(sharedSecret); return signature; } function verify(publicKey, hash, signature) { var sharedSecret = ECDH.compute(publicKey, hash); return (hash(sharedSecret) == signature); }
此方法公開 ECDH 的私鑰之一,並使用它來生成簽名雜湊。這種方法有什麼辦法可以暴露真正的私鑰嗎?
我一直在閱讀這些答案,似乎還可以……
為了簡化您的定義:
$$ s = \operatorname{sign}(k, m) = h(G\ h(m)\ k)\ \operatorname{verify}(Gk, m, s)\iff s \overset{?}{=} h(Gk\ h(m)) $$ 這顯然是不安全的,因為我可以偽造“簽名”!
$$ s’ = \operatorname{forge}(Gk, m’) = h(Gk\ h(m’)) $$ ECDH 不是簽名方案。Schnorr 很棒,而且比 ECDSA 有趣得多!包括但不限於:門檻值 k-of-n 分佈式身份、n-of-n 多重簽名聚合、批量驗證、公鑰恢復、隱式證書等等!