继续学习签名部分

in #cn-programming7 years ago

在前一篇文章

诸位大神的回复给予我很大的帮助,尤其 @ripplerm 对我关心的几个问题给予了解答很阐述,万分感激。

这篇文章继续学习签名部分。

关于验证过程的摘要

首先继续那我摘出来的这段话
a signature consists of two numbers, R and S, and you use a private key to generate R and S, and if a mathematical equation using the public key and S gives you R, then the signature is valid.

结合steem,我对此的理解
签名逻辑上分为两部分,R和S,用私钥(和摘要)生成 校验的时候,用(公钥,S)带入数学公式,得到R,证明签名合法性。(摘要用不?)
对于我自己备注的摘要用不?我想了一晚上,技术上没想明白,但是从逻辑上,如果摘要不要,岂不是这个签名可以用在任何信息上了,这不科学,哈哈哈。所以一定是要的。

关于验证签名的合法性

想明白上述问题以后,那么对验证签名的合法性的流程有了更详细的了解。
结合xeroc的文章以及steem的实例
我理解验证签名的过程和生成签名的过程有些类似。

  • 拿到带签名的Transaction
  • 去掉签名部分,用剩余部分按照生成签名的流程来生成摘要(序列化,生成头部,生成摘要)
  • 取出签名的(S、R)以及Transaction 用户对应的public keys(公钥 steemd上查询或者用API获取)
  • 通过公钥和S算出R则签名合法,否则异常

代码以及测试

python-graphenelib 以及 python-steem 对签名验证部分进行了很好的封装
xeroc的文末提供一段验证签名的合法性的代码

from steembase import transactions
tx2 = transactions.Signed_Transaction(**tx)
tx2.deriveDigest("STEEM")
pubkeys = [PrivateKey(p).pubkey for p in wifs]
tx2.verify(pubkeys, "STEEM")

为此我特意从steemd取了个最新的 transactions

{'expiration': '2017-02-21T13:33:30',
                   'extensions': [],
                   'operations': [['vote',
                                   {'author': 'austrin16',
                                    'permlink': 'phobias',
                                    'voter': 'robin.hood',
                                    'weight': 10000}]],
                   'ref_block_num': 60790,
                   'ref_block_prefix': 2747450036,
                   'signatures': ['205520a31db2012ba14e78b8864819a2fd87de34314a10134b8d9ee83b8b4f879104cbfea79e65a814ad1f56a24b9a837e5b78872ec33ba7494eae17b240a4a9e5']}

分别用我的公钥以及robin.hood 的公钥去验证
然后,结果如我所料,我的公钥用来验证失败,robin.hood(voter) 的公钥验证通过

Sort:  
Loading...

老了,学点东西好吃力。:(

看了一下python-graphenelib代码
大致明白了S、R都是啥
S: signature
R: recover parameter

而校验的过程和文中理解有些区别
是用R和S以及摘要(还是全部文本)算出公钥
然后和用户公钥比对 😄

不知道理解是否有误,还得多学习和测试

Coin Marketplace

STEEM 0.20
TRX 0.13
JST 0.029
BTC 62871.45
ETH 3479.64
USDT 1.00
SBD 2.53