You are viewing a single comment's thread from:

RE: 求大神给讲讲签名部分

in #cn-programming7 years ago

有些搞不懂什么是规范签名(canonical signatures)?

对 canonical-signature 的需求,主要是因为 ecdsa 的一个特性: 同样的一个讯息,可以有一个以上的有效签名。这就引发了一个所谓 Txn Malleability (不懂中文怎么译)的问题。 MT Gox 的倒闭就与此有关。

对此,不同的区块链圈技术,有不同的对应方式。
参阅: https://steemit.com/cryptocurrency/@dmitry.meshkov/transaction-malleability-in-cryptocurrencies

对于采用 “规范签名”,一般来说,会要求 ecdsa 签名其 s 取小值(小于 n / 2)。

Sort:  

lenR和lenS 都等于32就是规范签名?

这与 DER encoding 有关。

r, s 都是 unsigned 256-bit-integer,一般来说会以 32-byte 表示。而根据 DER 的要求,数字的首 bit 是用于表示正负号。因此若签名的 r, s 大于 2^255,则必须前缀一个 byte 0x00,否则会被当负数处理。

steem 的签名采用的是 Secp256k1,其 n 值取 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141。

因此,若 s 小于 n 的一半,则经 DER 编码后 s 的长度只会是 32 或更小。

顺便一提:
严格来说,32 byte 的 s,数值还是有可能会大于 n/2。
但几率极小(约 1/2^127),现实中不可能发生。

至于为什么规定 r 只能取 32 byte (以及 s 不能小于 32),则不得而知。
但 steem 所采用的标准是直接承续于 Bitshares,也许 @abit 会清楚其由来。

1024个 赞也不能表达我的谢意和敬意
您回答的这部分内容正是我想学习和了解的
万分感激:)

历害了,看不出来,老牛潜水都挺深 :)

Coin Marketplace

STEEM 0.17
TRX 0.14
JST 0.028
BTC 58316.34
ETH 2583.46
USDT 1.00
SBD 2.43