Elliptic-Curves

為什麼我們有 ECDH 時還需要 ECDSA?

  • March 12, 2018

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 多重簽名聚合、批量驗證、公鑰恢復、隱式證書等等!

引用自:https://crypto.stackexchange.com/questions/26824