币圈常见签名算法
目前大部分币种采用的交易签名算法都是基于椭圆曲线,大致可以分为两类,ECDSA和Schnorr签名。由Schnorr衍生出了EdDSA,由EdDSA衍生出了ed25519算法。
一、ECDSA
1、原理
私钥:a ,公钥A:=aG;确定性随机数k;h(m)消息哈希https://cryptobook.nakov.com/digital-signatures/ecdsa-sign-verify-messages
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
2、币种
btc、eth、eos、ripple、vet、yoyo、aac、bhp、ckb、cmt、dcr、hpb、hc、int、neo、nuls、only、stc、wan、tem、trx、aitc、atom3、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=kG2、币种
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
zil3、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,https://cryptobook.nakov.com/digital-signatures/eddsa-and-ed25519
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
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
推荐阅读
- 唱歌教学(导致嗓音损坏的几个常见的错误唱歌方法!)
- Hive常见问题汇总
- JS常见数组操作补充
- 孕期妈妈们常见的几个误区
- jvm常见分析工具
- redis|redis 常见问题一
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- 戒掉花呗吧
- Spring|Spring Aop常见注解与执行顺序详解
- 59期day1(常见红蜘蛛故障和服务器基础知识)