理解以太坊的椭圆曲线签名-校验签名

摘要:
原理以太坊数字签名与比特币之间的关系以太坊数字签字几乎完全遵循比特币的数字签名算法ECDSA-secp256k1。什么是ECDSA以太坊数字签名算法使用椭圆曲线数字签名算法,英文缩写为ECDSA。以太坊使用一组名为secp256k1的参数来确定椭圆的形状。因此,以太坊的签名算法全称为ECDSA-secp256k1。然而,以太坊仅使用64字节。在一个字节的64字节中,32字节表示椭圆曲线的X坐标,32字节代表椭圆曲线的Y坐标。以太坊的哈希算法使用了新的SHA3-256。
原  理

以太坊数字签名和比特币的关系

以太坊数字签名,几乎完全沿用了比特币的数字签名算法ECDSA-secp256k1。只有哈希的生成方式不一样,这个之后会说。ECDSA-secp256k1是一种非对称加密算法。

什么是ECDSA

以太坊数字签名算法使用的是椭圆曲线数字签名算法,英文简称ECDSA。其中EC是“椭圆曲线”的简称,DSA是“数字签名算法”的简称。

什么是secp256k1

椭圆曲线算法简单的说就是用X和Y坐标画一个曲线。这个曲线怎么画,需要很多个参数来确定。以太坊使用了一套叫secp256k1的参数确定了椭圆的形状。所以,以太坊的签名算法全称就是是ECDSA-secp256k1。

什么是非对称加密

什么是对称加密,什么是非对称加密呢?简单的说,只有一个密钥的,就是对称加密,加密解密用它。有两个密钥的,就是非对称加密,加密用一个密钥,解密用另外一个。相对于对称加密算法而言,非对称加密优点是不需要在网络上暴露加密的密钥,从机制上来说更安全;缺点是加密效率比对称加密低很多。所以非对称加密一般只用于诸如数字签名这类数据量较小的加密运算。

常见的非对称加密算法除了椭圆加密算法之外,还有著名的RSA。椭圆加密相比RSA的区别是:

  • 椭圆加密的密钥更短

  • 椭圆加密计算更快而安全性相当

  • RSA的私钥和公钥是何以互换加解密的,但椭圆加密只能私钥加密公钥解密。

私钥

以太坊的私钥是一个32字节的数,取值范围从1~0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140。这个数可以由伪随机算法(PRNG)产生。其实0也是一个合法的私钥,只不过这是一个特殊私钥,以太坊的创世区块就是这个私钥生成的。

公钥

以太坊的非压缩公钥是一个65字节的数,这个是继承至比特币的。但以太坊只使用了其中64个字节,有一个字节这64个字节中,32字节表示椭圆曲线的X坐标,32字节表示椭圆曲线的Y坐标。这个XY坐标是私钥通过ECDSA-secp256k1推导出来的。所以说,椭圆曲线算法的公钥是通过私钥计算出来的。而反过来,用公钥推导私钥,以现有计算机的计算几乎是不可能的,这也是以太坊和比特币存在的基础。如果哪天计算机技术出现大飞跃,比如量子计算机普及,现有链上所有账户的私钥都会曝光。当然,区块链技术本身也会一定会持续演进的。

哈希

哈希,也可以形象的叫做“摘要”。就是无论消息有多大,都可以生成一个固定长度的“摘要”,这个“摘要”可以用来校验消息是否被篡改。只要消息被修改了一个字节,“摘要”的校验就会失败。

比特币的哈希算法使用的是SHA2-256。相对于SHA1,SHA2只是扩展了哈希的字节数而已。目前SHA1已经被攻破,SHA2被攻破只是时间问题。

以太坊的哈希算法采用的是全新的SHA3-256。和SHA1,SHA2不一样,SHA3并不是单纯扩展字节数,而是采用了新的Keccak算法。同样字节宽度的SHA3比SHA2更安全。

地址

以太坊的地址是公钥经过一系列哈希和变换,在经由Base58编码生成的字符串。过程不述。Base58编码和Base64差不多,都是使用“”可读符号“来表示二进制数据,Base58相对Base64移除了一些容易产生视觉混淆的字母和数字。

签名

签名其实就是用私钥对消息的哈希进行加密。当一个以太坊节点向另一个节点发送消息时,会用自己的私钥将消息的哈希做签名,然后吧签名和消息本身发送给对方。

过程如图:

image

校验签名

节点收到对方发来的消息和签名后,会先做一个“recover”的动作,用消息和签名推导出对方的公钥。再通过公钥,签名,消息的哈希值计算出一个叫“r”的值,这个r是签名的一部分,校验签名就是拿计算出来的r和签名中携带的r经行对比,如果一致就校验通过。

过程如图:

image

2 代码实现

以太坊项目geth有两套ECDSA-secp256p1的实现。一套是纯go的,一套是基于C库的。底层算法都不是以太坊开发人员写的,采用的是开源世界的拿来主义。

go实现

接口源码在crypto/signature_nocgo.go。这个文件只是一个wrapper,真实的实现调用了一个第三方的比特币的go项目,源码在vendor//github.com/bitcsuite/bitcd。

https://my.oschina.net/u/3782027/blog/1799425

API及其功能

signature_nocgo.go和signature_cgo.go的接口是一样的,具体如下:

//通过消息的哈希和签名恢复公钥
func Ecrecover(hash, sig []byte) ([]byte, error) {}

//通过哈希和私钥计算ECDSA签名
func Sign(hash []byte, prv *ecdsa.PrivateKey) {}

//通过公钥,哈希校验签名
func VerifySignature(pubkey, hash, signature []byte) bool {}

//将33字节的公钥解压成65字节公钥
func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {}

//将65字节非压缩公钥压缩称33字节压缩公钥
func CompressPubkey(pubkey *ecdsa.PublicKey) {}


作者:大洋一生
链接:https://www.jianshu.com/p/d622e1ec9470
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

免责声明:文章转载自《理解以太坊的椭圆曲线签名-校验签名》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇rocketmq学习(二) rocketmq集群部署与图形化控制台安装使用Kibana 分析Nginx 日志并在 Dashboard上展示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java Bean Validation 最佳实践

参数校验是我们程序开发中必不可少的过程。用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验。后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程...

SSH2连接原理

一,口令登录 (1)在A机使用命令<ssh|sftp user@host>连接B机 bash-4.2$ ssh user@www.xxx.net   这段话的意思是,无法确认host主机的真实性,只知道它的fingerprint,问你还想继续连接吗?很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在...

2.4奇偶校验

1、奇偶检验的基本原理   1)增加冗余码(校验位)        2)编码:根据有效信息计算校验信息位,使校验码(数据+1位校验信息)中1的个数满足奇/偶校验的要求         3)检错方法与电路 2、奇偶检验的特点   *编码与检错简单   *编码效率高   *不能检测偶数位错误,无错结论不可靠,是一种错误检验码   *不能定位错误,因...

白话数字签名(番外篇)——签名EXE文件(上)

摘要 人家微软的软件都有数字签名,感觉好酷哦,我们写的软件也要弄个签名炫一炫。带有签名的软件非常酷在QQ的安装文件上右击,选“属性”,就可以看到QQ的数字签名了。使用Process Explorer或SREng查看系统中正在运行的程序时,也可以验证程序是否有数字签名,如果我们的程序显示“Unable to verify”,那显得多不专业呀。给自己的程序加...

信息安全行业国家标准汇总,信息安全行业从业人员必看

1. GB/T 36618-2018 《信息安全技术 金融信息服务安全规范》 内容概述:该标准规定了金融信息服务提供商提供金融信息服务时的基本原则、服务过程要求、技术要求和管理要求。其中,技术要求部分主要涵盖基础设施安全、软件安全、网络安全、数据安全、运行安全、容灾和恢复六个方面。 2. GB/T 36619-2018 《信息安全技术 政务和公益机构域名命...

git查看日志

git查看日志 git log -n 显示前N条记录 git log -3 退出log命令 直接输入: q git log --stat -n 显示提交的文件的简要的修改统计 $ git log --stat -2 commit d0b9a20fac8abc7517c5a04c0fbb1d488f309bf5 Author: BeginMan <p...