区块链中的数学-secp256k1 签名可锻性以及解决方案

本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性。

## 写在前面 上一节说了[从凭证角度详细说明了Miller Rabin算法思路和实现](https://learnblockchain.cn/article/1499), 并加以实例说明。 本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性。 ## 比特币交易可锻性攻击 今天偶尔看到了以太坊早期一条的EIP记录: https://eips.ethereum.org/EIPS/eip-2 里面提及到了secp256k1算法的一个小问题:可锻性担忧(malleability concern),有时也被称为可锻性攻击。 ### 什么是可锻性? 现在说这个问题比较合适,因为前面已经有很多篇幅描述椭圆曲线算法知识,包括签名算法。具体文章可参考文末**相关阅读** 这里说的可锻性是指secp256k1实例算法中签名产生的结果(r, s)两个大整数,如果把s改成 n - s, 即(r,n-s)依然是个合法的签名,n是椭圆曲线参数中的阶。这一点从签名过程可以得出。 即EIP02中提到的: > Allowing transactions with any s value with 0 < s < secp256k1n, as is currently the case, opens a transaction malleability concern, as one can take any transaction, flip the s value from s to secp256k1n - s, flip the v value (27 -> 28, 28 -> 27), and the resulting signature would still be valid. 这样貌似也没什么问题?但是在比特币早期版本(隔离见证之前)中会有一个小问题:交易ID可能发生变化。 ### 可锻性有什么影响? 比特币交易ID计算引入了签名作为输入的一部分,当交易被创建时,有一个确定的ID,当交易被广播到其他节点时,不能排除有些不诚实节点不做手脚,即修改签名。改s后的签名依然是有效的,可以校验通过。这时同一笔交易就会有两个不同ID,之所以说这是一个小问题,严格也不能算bug。 是因为这种情况并不会造成双花。比特币采用UTXO模型,检验时会严格检查inputs部分,上述产生的两个交易,inputs部分是一样的,所以只会有一笔最终打包入块得到确认,另一笔视为无效。 之所以说又是一个小问题,是因为在一些场合会造成困扰(concern)。 例如用户向商家支付比特币购买商品时,用户会提供给商家一个交易ID证明自己已经支付,商家拿到交易ID后等待确认, 如果这过程中发生了交易可锻性, 最终商家得到交易ID一直不确认或者无效,就会给用户和商家同时造成困扰。 这就是称为“小问题“原因。 ## 如何解决交易可锻性? 正如大家所知道的比特币采用隔离见证(segregation witness)方法。将交易签名部分不再作为交易ID计算输入,并且签名数据不计入区块大小,也同时提高了区块的容量。 以太坊也使用secp256k1算法,是如何避免这个问题的? 答案在EIP2中提到,很简单,大家可以自己查阅。 还是那句话: **真要学习,就不要懒!** ## 小结 本节本来计划讲VRF相关的内容,既然看到了这个”小问题“,干脆说一说吧, 正好作为椭圆曲线算法的一个补充。 最近在看一些defi项目,下一节说下[uniswap中的做市商算法](https://learnblockchain.cn/article/1494)! 欢迎关注公众号:blocksight ### 相关阅读: [区块链中的数学-Miller Rabin算法”凭证“解读与实现](https://learnblockchain.cn/article/1499) [区块链中的数学-sm2的密钥协商过程](https://learnblockchain.cn/article/1506) [区块链中的数学-secp256k1行签名和验证过程](https://learnblockchain.cn/article/1551) [区块链中的数学-椭圆曲线加密原理和实例演练](https://learnblockchain.cn/article/1550) [区块链中的数学-二次剩余和欧拉准则](https://learnblockchain.cn/article/1524)

写在前面

上一节说了从凭证角度详细说明了Miller Rabin算法思路和实现, 并加以实例说明。

本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性。

比特币交易可锻性攻击

今天偶尔看到了以太坊早期一条的EIP记录: https://eips.ethereum.org/EIPS/eip-2

里面提及到了secp256k1算法的一个小问题:可锻性担忧(malleability concern),有时也被称为可锻性攻击。

什么是可锻性?

现在说这个问题比较合适,因为前面已经有很多篇幅描述椭圆曲线算法知识,包括签名算法。具体文章可参考文末相关阅读

这里说的可锻性是指secp256k1实例算法中签名产生的结果(r, s)两个大整数,如果把s改成 n - s, 即(r,n-s)依然是个合法的签名,n是椭圆曲线参数中的阶。这一点从签名过程可以得出。 即EIP02中提到的:

Allowing transactions with any s value with 0 < s < secp256k1n, as is currently the case, opens a transaction malleability concern, as one can take any transaction, flip the s value from s to secp256k1n - s, flip the v value (27 -> 28, 28 -> 27), and the resulting signature would still be valid.

这样貌似也没什么问题?但是在比特币早期版本(隔离见证之前)中会有一个小问题:交易ID可能发生变化。

可锻性有什么影响?

比特币交易ID计算引入了签名作为输入的一部分,当交易被创建时,有一个确定的ID,当交易被广播到其他节点时,不能排除有些不诚实节点不做手脚,即修改签名。改s后的签名依然是有效的,可以校验通过。这时同一笔交易就会有两个不同ID,之所以说这是一个小问题,严格也不能算bug。

是因为这种情况并不会造成双花。比特币采用UTXO模型,检验时会严格检查inputs部分,上述产生的两个交易,inputs部分是一样的,所以只会有一笔最终打包入块得到确认,另一笔视为无效。

之所以说又是一个小问题,是因为在一些场合会造成困扰(concern)。 例如用户向商家支付比特币购买商品时,用户会提供给商家一个交易ID证明自己已经支付,商家拿到交易ID后等待确认, 如果这过程中发生了交易可锻性, 最终商家得到交易ID一直不确认或者无效,就会给用户和商家同时造成困扰。 这就是称为“小问题“原因。

如何解决交易可锻性?

正如大家所知道的比特币采用隔离见证(segregation witness)方法。将交易签名部分不再作为交易ID计算输入,并且签名数据不计入区块大小,也同时提高了区块的容量。

以太坊也使用secp256k1算法,是如何避免这个问题的? 答案在EIP2中提到,很简单,大家可以自己查阅。 还是那句话:

真要学习,就不要懒!

小结

本节本来计划讲VRF相关的内容,既然看到了这个”小问题“,干脆说一说吧, 正好作为椭圆曲线算法的一个补充。

最近在看一些defi项目,下一节说下uniswap中的做市商算法!

欢迎关注公众号:blocksight

相关阅读:

区块链中的数学-Miller Rabin算法”凭证“解读与实现

区块链中的数学-sm2的密钥协商过程

区块链中的数学-secp256k1行签名和验证过程

区块链中的数学-椭圆曲线加密原理和实例演练

区块链中的数学-二次剩余和欧拉准则

区块链技术网。

  • 发表于 2020-09-18 15:46
  • 阅读 ( 1970 )
  • 学分 ( 34 )
  • 分类:入门/理论

评论