区块链语言Solidity校验椭圆曲线加密数字签名(附实例)
你知道区块链语言Solidity校验椭圆曲线加密数字签名(附实例)吗?今天小编就给大家整理一些相关信息,希望对大家有所帮助哦!
我们知道整个比特币,以太坊的基石就是椭圆曲线加密算法。
所有的数据均需要发起者通过私匙签发,其它人通过非对称的公匙验证确实消息的真实性。
下面我们就一起来了解一下椭圆曲线加密算法,并使用以太坊提供的工具对要发送的数据进行数字签名,以及使用Solidity区块链编程语言的ecrecover()校验数字签名的合法性。
椭圆曲线DSA(ECDSA)简介假如Alice要对消息m加上数字签名,而Bob需要验证该签名。
生成数字签名Alice根据随机数r和基点G求出点rG = (x, y):Alicce根据随机数r、消息m的散列值h、和私匙a计算最后,Alice将消息m、点rG = (x, y)和s发送给Bob,其中点rG和s就是数字签名。
验证数字签名Bob接收到消息m、点rG = (x, y)和s。
Bob根据消息求出散列值h。
最后,Bob根据上述信息,用Alice的公匙进行以下计算。
最后让上述计算结果与rG进行比较看是否相等。
如果签名结果正确,则计算结果应如下所示。
原书[1]中关于这部分看了三四遍,也没看明白。
但觉得做程序的明白他大概要干个什么就好。
大体上来说,对于要签名的数据m,使用它的哈希后的结果h,会生成签名。
签名结果分为r,s,v三段值。
其中r,s为32字节。
v为一个字节,如果要用ecrecover()算法来验签,需对v值加27来组成27,28这两个值中的一个[2]。
实践使用web3.js进行数据签名以太坊提供了web3.eth.sign方法来对数据生成数字签名。
在上面的代码中,我们先将要签名的数据abc生成哈希串,使用web3.sha3("abc)。
接着我们使用当前连接节点的第一个默认帐户进行签名。
由于我使用的是EtherumJS TestRPC,它默认打开了帐户。
否则,你还需要web3.personal.unlockAccount("0x..", "", 1000)[3]来打开数据签名所使用帐户。
需要注意的是,当你打开你的帐户时,可能有安全风险。
因为其它程序也可以通过访问节点进行类似的sign,这意味着,他们可以伪造你的数据[4],包括以你的名义发起交易,转走你的钱。
运行的结果:使用ecrecover()对签名数据进行校验ecrecover[5]函数是由以太坊提供的一个全局函数,用于签名数据的校验。
与上面所陈述的方式略有不同的是,这个函数返回的是签名者的公匙地址。
如果返回结果是签名者的公匙地址,那么说明数据是正确的。
ecrecover(bytes32hash,uint8v,bytes32r,bytes32s)returns(address)ecrecover函数需要四个参数,需要被签名数据的哈希结果值,r,s,v三个值。
通过前面的说明,我们知道r,s,v是分别来自签名结果串。
其中v取出来的值或者是00或01。
要使用时,我们先要将其转为整型,再加上27,所以我们将得到27或28。
在调用函数时v将填入27或28。
如果要在以太坊中验证比特币的签名,可能有几处不同的地方[6]。
使用Solidity的ecrecoverDecode验证签名的完整例子。
上述代码使用临时写的slice()函数把数据签名中的r,s,v切割出来:由于返回的仍是一个bytes类型,所以我们使用bytesToBytes32()进行一下类型转换[7]:另外需要注意的是ecrecoverDecode()根据前面的说明,我们需要对v值,加上27后再进行调用。
最后调用decode()函数,我们将会得到公匙0x60320b8a71bc314404ef7d194ad8cac0bee1e331。
本文到此结束,希望对大家有所帮助。相关文章
- 全球数字货币市场潜力与风险并存(全球数字货币交易市场)
- 全球数字加密货币行业最新发展动向【2018年12月15日】
- 对央行数字货币的思考(关于央行数字货币的思考)
- 央行穆长春:深圳数字人民币试点领取红包人数占总中签人员的95.15%
- 稳定币:让投资数字货币更容易(数字货币,代币,稳定币)
- 各国央行计划推出国家数字货币(各国央行政策)
- 数字藏品交易市场已经构建和健全(数字收藏品投资指南)
- 中央财经大学数字财经研究中心陈波主任: 金融监管与创新如何相辅相成
- 周小川最新演讲重点,谈央行数字货币、Libra、区块链试点
- 苏宁金融研究院高级研究员:超主权的数字货币的诞生势必将会收到全局范围内极其谨慎的审视与监控