目前大部分币种采用的交易签名算法都是基于椭圆曲线,大致可以分为两类,ECDSA和Schnorr签名。由Schnorr衍生出了EdDSA,由EdDSA衍生出了ed25519算法。
一、ECDSA
1、原理
私钥:a ,公钥A:=aG;确定性随机数k;h(m)消息哈希
r:=R(x, y)=kG的x坐标
sign: s = k^-1 ( h(m) + ra) mod q
verify: h(m) * G / s + rA/s =? kG
h(m) * G / s + rA/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: sG+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、原理
image.png在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
2、币种
ada、ae、bcb、btm、etm、hbar、dot、iost、kin、sc、sda、xas、xem、xlm、xtz
网友评论