Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp256k1, sm2 都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结果相同。
一般说来随机数是安全措施中重要的一种方法,但是随机数的产生也是安全隐患,著名的索尼公司产品 PS3 密钥泄露事件,就是随机数产生的问题导致的。如果你对之前绍过的 Schnorr,secp256k1,sm2 等签名过程比较熟的的话,就容易理解如果在签名过程中出现了这个相同的随机数 r,那么私钥将很容易被计算出来,造成泄露。
Why EdDSA ?
为什么要有爱德华签名机制?
这就要从其发展历史来看,从前几篇的介绍,我们可以知道,爱德华曲线族的研究比较晚,在爱德华数字签名体制出现之前,已经有了椭圆曲线签名 EcDSA 机制,基于 Weierstrass 曲线, 代表性的是 secp256r1 和 secp256k1,前者就是 NIST P256 椭圆曲线算法。
如同任何事物都是不断发展向前的, 基于椭圆曲线的数字签名亦是如此。EdDSA 旨在克服传统的 EcDSA 的一些不足而诞生。
那么 EcDSA 有哪些不足呢?主要如下:
签名过程中不安全的使用随机数【包括安全的随机数发生器实现的困难性与程序员正确使用随机数的困难性】,可能导致密钥泄露
ECDSA 签名的可锻造性,参考此篇
签名伪造:如果不需要提供签名消息, 可以根据已有签名值伪造对应私钥的签名值
当然效率上的提升是公共点,不单独列出, 关于第三点很有意思,“澳本聪”就曾经利用“伪造‘的签名来冒充”中本聪“,详细的过程下一节在说。
好了, EdDSA 是为改进这些不足和提高效率而产生。
关于 Edwards 曲线和 Weierstrass 曲线的发展,下面一组图很生动形象:
图一:两种曲线原始形状
图二:形状类比海星和乌龟
图三:比赛赛跑
07 年以后,爱德华曲线的研究取得快速发展,后来居上,但都是在学术界,真正的广泛使用是在 13 年斯诺登事件以后。
EdDSA 签名机制优点
实现上做了优化,可在多种计算平台上都能达到较高的性能;
签名过程中不需要唯一的随机数,能够避免随机数引发的安全问题;
无分支和秘密数据索引操作,对于侧信道攻击等具有更好的免疫效果;
公钥和签名值都较小 (Ed25519 公钥为 32 个字节, 签名值为 64 字节),【注:这一点其实不明显,和 secp256r1 和 secp256k1 一样】
计算公式是完备 (Complete), 无需对不相信的点执行点的验证操作;
抵抗碰撞, 弱哈希函数的碰撞不会破坏签名机制 (PureEdDSA).
问题来了,既然 Ed25519 签名比较优秀,比特币为什么没有采用?
因为出现时间较晚!
后来的一些区块链项目开始采用,包括 Stellar、Near Protocol 等。
小结
本文主要说了 EdDSA 签名机制的发展及其优点,当然了也不是完美的,也有若干瑕疵,后续在说吧。
到此我们已经多次提到不安全的随机的可能导致泄漏密钥的问题, 具体是怎样的呢?EcDSA 签名机制的弱点,其中有一项就是可以一定程度是“伪造”签名,通过签名验证。之所以说是一定程度,就代表不是真正意义上的签名。
Ed25519使用了扭曲爱德华曲线,签名过程和之前介绍过的Schnorr,secp256k1, sm2都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结果相同。