简要介绍以太坊的签名算法 secp256k1
在密码学中,加密(英语:Encryption)是将明文信息改变为难以读取的密文内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。
加密算法就是加密的分类,加密算法分对称密码加密算法和非对称加密算法。对称加密就是将信息使用一个密钥进行加密,解密时使用同样的密钥,同样的算法进行解密。非对称加密,又称公开密钥加密,是加密和解密使用不同密钥的算法,广泛用于信息传输中。
在非对称加密中,使用公钥加密数据,再使用私钥解密数据。比如,小明用小红的公钥加密一条聊天内容“今晚我们约会吧”,小红就可以使用她自己的私钥解密这条消息。
如果使用私钥加密数据,公钥解密数据是否可行呢?实际上是完全可行的。 不过,我们仔细想一想。私钥是保密的,公钥是公开的。用公钥解密数据有什么好处呢,这种加密又有什么意义呢?
这样加密的意义在于:可以让别人确信的知道这条消息是谁发送的。比如小明使用自己的私钥加密消息“今晚不能赴约了”,任何人都可以使用小明的公钥解密出这条消息。即使小红没有及时看到留言,别人也可以直接告诉他小明今晚不回来,只需要拿出这条消息给小红看,小红就会相信,因为只有小明的私钥才能加密出这条消息,小明想否认都不行。
实际上,这种密钥加密数据就完成了数字签名。要验证这个签名是否正确,只需用私钥持有者的公钥进行解密验证。使用数字签名的目的就在于为了确认某个信息确实是有某个发送方发送的,任何人都不能伪造消息,并且,发送方也不能抵赖。
在实际应用时,签名针对的不是消息原始内容,而是针对消息的哈希值进行签名,即:
signature = encrypt(privateKey, SHA3-256(message))
对签名的验证,就是使用公钥来解密并验证得到的哈希值是否和原始消息的哈希值一致。
hash = decrypt(publicKey, signature)
ok = hash == SHA3-256(message)
常见的数字签名算法主要有RSA、DSA、ECDSA三种。椭圆曲线签名算法ECDSA是用于数字签名,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。而ECC(全称Elliptic Curves Cryptography)是一种椭圆曲线密码编码学。
ECDSA的特点是可以从私钥推导出公钥。 比特币就是使用的 ECDSA 下的标准算法 secp256k1。
secp256k1 是高效密码组标准(SECG) 协会开发的一套高效的椭圆曲线签名算法标准。 在比特币流行之前,secp256k1并未真正使用过。secp256k1 命名由几部分组成:sec来自SECG标准,p表示曲线坐标是素数域,256表示素数是256位长,k 表示它是 Koblitz 曲线的变体,1表示它是第一个标准中该类型的曲线。
SECG(Standards for Efficient Cryptography Group) 成立于1998年,一个从事密码标准通用性潜力研究的组织。旨在促进在各种计算平台上采用高效加密和提高互操作性。
那为什么比特币要选择 secp256k1 签名算法而不是其他已流行的算法呢?比特币开发者社区曾讨论过 secp256k1 是否安全。中本聪没有明确解释,只是说道”有根据的推测”。社区的讨论不外乎是在安全和效率上做权衡,选择一个不受任何政府控制、无后门的签名算法是比特币的首要考虑因素,其次,也需要提供计算速度,毕竟在比特币中加密、签名、校验签名是不断在处理的事情(60%左右的CPU时间几乎全用在这上面),而具有可预测性、高计算效率特性的Koblitz曲线是不错的选择。基于安全第一,效率第二原则,secp256k1 就是一个最优解。
同样的,以太坊的签名算法也是沿用 secp256k1,只不顾在此基础上稍微包装了一次。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!