币圈常见签名算法

目前大部分币种采用的交易签名算法都是基于椭圆曲线,大致可以分为两类,ECDSA和Schnorr签名。由Schnorr衍生出了EdDSA,由EdDSA衍生出了ed25519算法。
一、ECDSA 1、原理

私钥:a ,公钥A:=aG;确定性随机数k;h(m)消息哈希
r:=R(x, y)=k
G的x坐标
sign: s = k^-1 ( h(m) + ra) mod q
verify: h(m) * G / s + r
A/s =? kG
h(m) * G / s + r
A/s = (h(m) + rA)/s = [k(h(m) + ra)G]/(h(m)+ra) = k*G
https://cryptobook.nakov.com/digital-signatures/ecdsa-sign-verify-messages
2、币种
btc、eth、eos、ripple、vet、yoyo、aac、bhp、ckb、cmt、dcr、hpb、hc、int、neo、nuls、only、stc、wan、tem、trx、aitc、atom
3、code:
// sign BigInteger k; do // generate r { k = kCalculator.nextK(); ECPoint p = basePointMultiplier.multiply(ec.getG(), k).normalize(); r = p.getAffineXCoord().toBigInteger().mod(n); } while (r.equals(ZERO)); s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);

二、Schnorr签名 1、原理
私钥:x,公钥:y;随机数k,Q=kG
e = Hash(Q || pubKey || msg)
sign: s = k - e * x
verify: s
G+yQ =? kG
sG+ye=(k-ex)G+ye=kG -exG+yG=k*G
2、币种
zil
3、code:
// sign ECPoint Q = secp256k1.getG().multiply(k); BigInteger e = hash(Q, publicKey, msg).mod(secp256k1.getN()); BigInteger s = e.multiply(privateKey).mod(n); s = k.subtract(s).mod(n);

三、EdDSA 1、原理
pubKey = privKey * G,
k = hash(hash(privKey) + msg) mod q
R = k * G
h = hash(R + pubKey + msg) mod q
sign: s = (k + h * privKey) mod q signature { R, s }
verify: R + hpubkey =? sG
s * G = (k + h * privKey) * G = k * G + h * privKey * G = R + h * pubKey
https://cryptobook.nakov.com/digital-signatures/eddsa-and-ed25519
2、币种
algo、vite
四、ed25519 1、原理
在eddsa的基础上做了小改动,Sha512(seed)得到64位的新串,前面32位充当私钥,后32位用于计算r
r=Sha512(后32位 + msg)
R =r * G
h = hash(R + pubKey + msg) mod q
sign: s = (r + h * privKey) mod q
币圈常见签名算法
文章图片
image.png 2、币种
【币圈常见签名算法】ada、ae、bcb、btm、etm、hbar、dot、iost、kin、sc、sda、xas、xem、xlm、xtz

    推荐阅读