区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

栏目: 编程工具 · 发布时间: 5年前

内容简介:来源:

2018-12-26 14:43

来源: ccidbc

我们知道整个比特币,以太坊的基石就是椭圆曲线加密算法。所有的数据均需要发起者通过私匙签发,其它人通过非对称的公匙验证确实消息的真实性。下面我们就一起来了解一下椭圆曲线加密算法,并使用以太坊提供的 工具 对要发送的数据进行数字签名,以及使用Solidity区块链编程语言的ecrecover()校验数字签名的合法性。

椭圆曲线DSA(ECDSA)简介

假如Alice要对消息m加上数字签名,而Bob需要验证该签名。

生成数字签名

  1. Alice根据随机数r和基点G求出点rG = (x, y);

  2. Alicce根据随机数r、消息m的散列值h、和私匙a计算

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

最后,Alice将消息m、点rG = (x, y)和s发送给Bob,其中点rG和s就是数字签名。

验证数字签名

  1. Bob接收到消息m、点rG = (x, y)和s。

  2. Bob根据消息求出散列值h。

  3. 最后,Bob根据上述信息,用Alice的公匙进行以下计算。

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

最后让上述计算结果与rG进行比较看是否相等。

如果签名结果正确,则计算结果应如下所示。

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

原书[1]中关于这部分看了三四遍,也没看明白。但觉得做程序的明白他大概要干个什么就好。大体上来说,对于要签名的数据m,使用它的哈希后的结果h,会生成签名。签名结果分为r,s,v三段值。其中r,s为32字节。v为一个字节,如果要用ecrecover()算法来验签,需对v值加27来组成27,28这两个值中的一个[2]。

实践

使用web3.js进行数据签名

以太坊提供了web3.eth.sign方法来对数据生成数字签名。

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

在上面的代码中,我们先将要签名的数据abc生成哈希串,使用web3.sha3("abc)。接着我们使用当前连接节点的第一个默认帐户进行签名。

由于我使用的是EtherumJS TestRPC,它默认打开了帐户。否则,你还需要web3.personal.unlockAccount("0x..", " ", 1000)[3]来打开数据签名所使用帐户。需要注意的是,当你打开你的帐户时,可能有安全风险。因为其它程序也可以通过访问节点进行类似的sign,这意味着,他们可以伪造你的数据[4],包括以你的名义发起交易,转走你的钱。

运行的结果:

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

使用ecrecover()对签名数据进行校验

ecrecover[5]函数是由以太坊提供的一个全局函数,用于签名数据的校验。与上面所陈述的方式略有不同的是,这个函数返回的是签名者的公匙地址。如果返回结果是签名者的公匙地址,那么说明数据是正确的。

ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)

ecrecover函数需要四个参数,需要被签名数据的哈希结果值,r,s,v三个值。通过前面的说明,我们知道r,s,v是分别来自签名结果串。

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

其中v取出来的值或者是00或01。要使用时,我们先要将其转为整型,再加上27,所以我们将得到27或28。在调用函数时v将填入27或28。

如果要在以太坊中验证比特币的签名,可能有几处不同的地方[6]。

使用Solidity的ecrecoverDecode验证签名的完整例子。

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

上述代码使用临时写的slice()函数把数据签名中的r,s,v切割出来;由于返回的仍是一个bytes类型,所以我们使用bytesToBytes32()进行一下类型转换[7];另外需要注意的是ecrecoverDecode()根据前面的说明,我们需要对v值,加上27后再进行调用。最后调用decode()函数,我们将会得到公匙0x60320b8a71bc314404ef7d194ad8cac0bee1e331。

区块链语言Solidity校验椭圆曲线加密数字签名(附实例)

版权申明:本内容来自于互联网,属第三方汇集推荐平台。本文的版权归原作者所有,文章言论不代表链门户的观点,链门户不承担任何法律责任。如有侵权请联系QQ:3341927519进行反馈。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算理论导引

计算理论导引

[美]Michael Sipser / 张立昂、王捍贫、黄雄 / 机械工业出版社 / 2000-2 / 30.00元

本书由计算理论领域的知名权威Michael Sipser撰写。他以独特的视角,综合地描述了计算机科学理论,并以清新的笔触、生动的语言给出了宽泛的数学理论,而并非拘泥于某些低层次的技术细节。在证明之前,均有“证明思路”,帮助读者理解数学形式下蕴涵的概念。同样,对于算法描述,均以直观的文字,而非伪代码给出,从而将注意力集中于算法本身,而不是某些模型。本书的内容包括三个部分:自动机与语言、可计算性理论和一起来看看 《计算理论导引》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具