区块链中的数字签名算法
数字签名算法
常见的数字签名算法主要有 RSA、DSA、ECDSA 三种。椭圆曲线签名算法 ECDSA 是用于数字签名,是 ECC 与 DSA 的结合,整个签名过程与 DSA 类似,所不一样的是签名中采取的算法为 ECC,最后签名出来的值也是分为 r,s。而 ECC(全称 Elliptic Curves Cryptography)是一种椭圆曲线密码编码学。
secp256k1
secp256k1 是高效密码组标准(SECG) 协会开发的一套高效的椭圆曲线签名算法标准。 在比特币流行之前,secp256k1 并未真正使用过。secp256k1 命名由几部分组成:sec 来自 SECG 标准,p 表示曲线坐标是素数域,256 表示素数是 256 位长,k 表示它是 Koblitz 曲线的变体,1 表示它是第一个标准中该类型的曲线。
比特币/以太坊为何选择secp256k1
那为什么比特币要选择 secp256k1 签名算法而不是其他已流行的算法呢?比特币开发者社区曾讨论过 secp256k1 是否安全。中本聪没有明确解释,只是说道”有根据的推测”。从社区的讨论中,有推测是其它的曲线,比如secp256r1中的参数是美国国安局精心挑选的,相当于安全性受到权威机构的干涉。总的来说选择secp256k1是安全和性能考量的结果。
以太坊沿用了比特币中的数字签名算法。
libsecp256k1和openssl
长期以来,实现了该算法的第三方库只有openssl,因此btcoin core一直都引用了此库。openssl是一个庞大的开源库,不仅仅实现了椭圆曲线加密算法,在椭圆曲线加密算法中也不仅仅实现了secp256k1这一种椭圆曲线。不久大家就发现了openssl的一些问题,除了自身结构复杂庞大,文档也不全面,最重要的是,opensssl的算法一致性也有潜在的问题,这会导致区块链发生不可预料的分叉,造成难以估量的损失。
所以自2016年2月13日起,在新发布的bitcoin core 0.12.0版本中,libsecp256k1库代替了openssl ecdsa。 libsecp256k1中只实现了一种椭圆曲线算法,代码简练,很快大部分社区就接收了这种改变。ibsecp256k1已经成为bitcoin社区事实上的标准,成为开发者唯一能选择的官方库。