EOS簽名R值過大致使報錯"is_canonical( c ): signature is not canonical"

簡要

EOS中規定簽名的R和S必須同時小於N/2纔是合法的簽名。git

詳細

EOS簽名交易相對BTC和ETH來講,對簽名的要求更加嚴格了。github

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:code

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.blog

而這產生了一個問題,對於一個規範的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纔是合法的簽名ip

EOS的簽名代碼在:https://github.com/EOSIO/eosjs-ecc/commit/09c823ac4c4fb4f7257d8ed2df45a34215a8c537#diff-e8c843fd1f732a963ec41decb2e69133R241get

em _20181227154010

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

相關文章
相關標籤/搜索