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

## 写在前面

上一节说了[从凭证角度详细说明了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)

写在前面

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

比特币交易可锻性攻击

里面提及到了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

相关阅读:

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

发表于 2020-09-18 15:46

阅读 ( 676 )

学分 ( 34 )

secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案相关推荐

  1. secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理

    本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理 ## 写在前面 上一节讲了[Schnorr离散对数签名及素数阶群构造(Schnorr群)](https://learnblo ...

  2. 区块链中的数学 - EdDSA签名机制

    Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp256k1, sm2 都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结 ...

  3. 区块链中的数学(四十二)---基于RSA的VRF(随机可验证函数)

    文章来源区块链技术公众号"blocksight",原文欢迎关注! 写在前面 上一节说了VRF(随机可验证函数)概述,由于VRF是与公钥密码学相结合的,自然少不了最常见的公钥密码学体 ...

  4. C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数

    本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...

  5. rsa签名算法实现_国密算法在链化未来区块链中的运用

    密码学是区块链的基础,区块链中大量采用了密码学算法,包括对称加密,非对称加密,单向散列算法,数字签名等技术. 为了实现密码学技术的自主可控,中国也定义了自己的国密标准,2020年央行颁布的<金融 ...

  6. 区块链中的基本概念整理

    区块链中的基本概念整理 区块链本身是由多种技术集合而成,涉及了多方面的内容,而在其组合应用的过程中,同时也产生了很多新的概念.对于这些概念的整理和理解,有助于更加深刻的理解区块链的本质,也可以指导我们 ...

  7. 区块链中的密码学应用

    区块链中应用到的密码学主要包括以下几方面: 数字摘要 区块链本质上是一种分布式数据存储方式,每一个数据区块之间靠数字摘要建立起联系,比如比特币中每一个区块都包含了它前一个区块的摘要值.因此数字摘要是区 ...

  8. 区块链中的基础数据结构

    区块 区块/Block 区块是在区块链网络上承载交易数据的数据包,是一种被标记上时间戳和之前一个区块哈希值的数据结构,区块经过网络的共识机制验证并确认区块中的交易. 父块/Parent Block 父 ...

  9. 区块链中的密码学(五)-零知识证明简述

    本篇是这个系列的最后一篇,尽管在区块链中还有很多的密码学应用,将来会必然会更多,然而笔者认为,就今天我们有限的学习时间来讲的话,任何人都应该对信息的获取做减法.思来想去,选择了"零知识证明& ...

最新文章

  1. LeetCode简单题之数组异或操作
  2. 深入理解分布式技术 - 消息队列知识点回顾总结
  3. Objective-C NSFileManager 文件管理总结
  4. WordPress简洁大气自适应博客杂志类网站主题CX-MULTI
  5. Apache 中 .htaccess 文件设置技巧16则
  6. 特斯拉员工入职3天就“偷”代码,悄悄备份6300多 Python 脚本
  7. jQuery easyui中combox 自定义样式 去掉下拉框的空白
  8. Json转化的三种方式
  9. BAT面试问题--算法工程师(机器学习)
  10. My97 DatePicker 选择时间后弹出选择的时间
  11. 如何成为合格的企业邮箱管理员
  12. kail linux镜像文件,KaLi Linux iso下载_KaLi Linux官方镜像文件下载 2018.3 官网最新版(32位/64位)_当载软件站...
  13. 模型笔记1---3d max 导入obj模型设置
  14. Java 发送短信工具类
  15. 国内使用bing国际版(非国内国际切换版本)
  16. javase学习——面向对象(下)
  17. idea中设置EcmaScript6
  18. (七)设定目标:原理与方法
  19. 世界的物质性及其发展规律
  20. 【离散数学】数理逻辑 第一章 命题逻辑(7) 命题逻辑的推理理论

热门文章

  1. opengl 实时波形显示_OpenGL1------OpenGL概述
  2. android在线root,KingRoot全球率先实现Android 7.0一键 Root
  3. mysql5.6解压版 1067_MySQL5.6解压版服务无法启动—系统错误1067
  4. viper4android 魅族6,手机资讯导报:魅族自曝新旗舰PRO6摄像头不凸起
  5. android 360自动更新,解决Android百度自动更新SDK和360自动更新SDK兼容
  6. Hibernate中的sql的所有的查询
  7. Apache httpd 安装
  8. springboot项目启动rabbitmq报错org.springframework.amqp.AmqpIOException: java.io.IOException
  9. Docker与虚拟机技术
  10. 枚举类 enum,结构体类 struct