EOS签名R值过大导致报错"is_canonical( c ): signature is not canonical"

简要

EOS中规定签名的R和S必须同时小于N/2才是合法的签名。

详细

EOS签名交易相对BTC和ETH来说,对签名的要求更加严格了。

BTC中bip62规定了((Low S values in signatures)[https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#Low_S_values_in_signatures])签名中的S值不能大于N/2:

The value S in signatures must be between 0x1 and 0x7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 5D576E73 57A4501D DFE92F46 681B20A0 (inclusive). If S is too high, simply replace it by S' = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141 - S.

而这产生了一个问题,对于一个规范的R值和S值,(R, S)(N-R, S)(R, N-S)(N-R, N-S)都是合法的签名值,而比特币只是规避了S值过大的情况,R值过大的情况它不管,所以可能会造成只要把R值改成N-R就可以发布一笔合法的、交易hash不同的交易。EOS要规避这个问题,规定R和S值必须同时小于N/2才是合法的签名

EOS的签名代码在:https://github.com/EOSIO/eosjs-ecc/commit/09c823ac4c4fb4f7257d8ed2df45a34215a8c537#diff-e8c843fd1f732a963ec41decb2e69133R241

em _20181227154010

论述签名的博客: (Steem & BitShares Cryptographic Security Update)[https://steemit.com/steem/@dantheman/steem-and-bitshares-cryptographic-security-update]

posted @ 2019-02-22 16:52  itlgl  阅读(518)  评论(0编辑  收藏  举报