本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理

## 写在前面

上一节讲了[Schnorr离散对数签名及素数阶群构造(Schnorr群)](https://learnblockchain.cn/article/1527),相对于结合椭圆曲线的算法,更简洁,更易理解。

之前有不少篇幅讲有限域上椭圆曲线的概念和运算规则【群,加解密,签名验签等】。

本节我们讲下特定的椭圆曲线上的有意思的一个知识点:公钥恢复。椭圆曲线算法常用的有几种实例,本节重点关注区块链领域应用最广的secp256k1曲线。

## secp256k1

secp256k1 是区块链项目中应用最多的椭圆曲线算法,源于比特币中的应用,后来的大多数区块链项目如以太坊等都在用。

名称中的前三个字母sec代表Standards for Efficient Cryptography (SEC)

后面的p256K1指的是参数256位素数域。

定义一条具体有限域上的椭圆曲线,有一些选择的参数。下面看一下secp256k1曲线的参数:

```

p = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F

a=0000000000000000000000000000000000000000000000000000000000000000

b=0000000000000000000000000000000000000000000000000000000000000007

G=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

n=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

h = 01

```

以上参数是十六进制的表示形式。理解以上参数的含义,我们再来回顾下secp256k1曲线方程:

$y^2 \equiv x^3+ax +b\ (mod\ p)$

方程中a,b, p就是参数,p的值怎么来的?就是下式的计算结果

$ 2^{256}-2^{32}-2^{9}-2^{8}-2^{7}-2^{6}-2^{4}-1$

参数G 是椭圆曲线点群中的生成元,是选定的一个点,上面给出的值是**非压缩格式**。

n是以G为生成元群的阶。【这些基本概念,参考之前二,三,四等文章】

还有一个协因子,h = 01【这个后续文章中用到在详细说明】

既然说到了压缩格式,下面就详细说一下。

## 压缩格式与非压缩格式

这是椭圆曲线上点的坐标(x,y)在计算机中表示问题。

最简单的表示方法就是x 拼上y,这也就是非压缩格式:

04 + x + y

前缀04标志位,表示采用未压缩表示法。这样程序可以按照未压缩格式解析后面的坐标值

压缩格式:

根据椭圆曲线方程,如果我们只保存x, 那么y的值可以计算出来,这样就不用同时保存x,y的值,减少了储存和带宽。何乐而不为呢?

但是如果只知道x, 代入方程会求出两个y,一正一负。分别表示两个不同点,所以光有x还不行。必须加一个标志区别实际使用的是哪个。压缩格式如下;

02 + x (y偶数)

03 + x (y是奇数)

为什么y一定是一奇一偶?

假设y是方程的一个解,则-y也是方程的一个解,在模运算规则下,-y ≡ p - y (mod p) ,所以p-y 是方程的解。两个解的和是p

y + (p - y) = p

p是素数,自然也是奇数,所以两个解肯定是一奇数,一偶数。

secp256k1中G的完整表示:

未压缩格式:G=04 79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

压缩格式:

G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798

压缩格式中标志位是02,可知G点y坐标是偶数。

至于为什么选择02,03,04作为标志呢?工程实现习惯而已,不必纠结。由于椭圆曲线中公钥是一个点,所以一般公钥表示使用压缩格式

这里引申出来一个问题:如果已知压缩格式的值,如何还原为未压缩的状态?这个问题可以归结如下:

1. 已知方程:$y^2 \equiv x^3+ax+b\ (mod\ p)$

2. 已知x 和所求y的奇偶性 求y的值。

暂时搁置一下,看一下公钥恢复原理之后再继续。

## 公钥恢复原理

这里是指仅通过签名结果来和消息摘要,来计算出签名私钥对应的公钥。

这里需要借助椭圆曲线的[签名&验证过程](https://learnblockchain.cn/article/1551) 。下面用到的符号,与[签名&验证过程](https://learnblockchain.cn/article/1551)一文相同,不再赘述。

由 $R = (HG - rQ)s^{-1 } \Rightarrow Q = (sR - HG)r^{-1}$

Q是公钥。

到这一步,我们知道是有办法计算出公钥的。再看一下对于验证者已知变量s,r,G,H, 唯独R点不知道,即R点(x,y)坐标未知。

但是有一层关系:r是R点的x坐标。

我们想到能不能通过这种关系求出R点完整信息即解出y值?

答案是可行的。

利用曲线方程式:

$y^2 \equiv x^3+ax+b\ (mod\ p)$

我们可以解出两个符合条件的, 几何上的解释是该曲线关于x轴对称【当然,正如之前所说,并不是所有的椭圆曲线都是关于x轴对称的。这里我们说的是secp256k1曲线】

原理说明白了,到这里可以发现核心是:已知方程式和x坐标求y。

这个和压缩格式还原非压缩格式问题是一类问题。只不过前者还多了y的奇偶性的额外条件。

## 小结

本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理。最后聚焦了一个核心问题:

**已知方程式和x坐标,求y**

这个问题直觉不难求出,但是方程是在模运算的有限域上,这一次要反直觉了。

好了,[下一篇](https://learnblockchain.cn/article/1524)就讲这个核心问题。

欢迎关注公众号:blocksight

写在前面

之前有不少篇幅讲有限域上椭圆曲线的概念和运算规则【群,加解密,签名验签等】。

本节我们讲下特定的椭圆曲线上的有意思的一个知识点:公钥恢复。椭圆曲线算法常用的有几种实例,本节重点关注区块链领域应用最广的secp256k1曲线。

secp256k1

secp256k1 是区块链项目中应用最多的椭圆曲线算法,源于比特币中的应用,后来的大多数区块链项目如以太坊等都在用。

名称中的前三个字母sec代表Standards for Efficient Cryptography (SEC)

后面的p256K1指的是参数256位素数域。

定义一条具体有限域上的椭圆曲线,有一些选择的参数。下面看一下secp256k1曲线的参数:

p = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F

a=0000000000000000000000000000000000000000000000000000000000000000

b=0000000000000000000000000000000000000000000000000000000000000007

G=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

n=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

h = 01

以上参数是十六进制的表示形式。理解以上参数的含义,我们再来回顾下secp256k1曲线方程:

$y^2 \equiv x^3+ax +b\ (mod\ p)$

方程中a,b, p就是参数,p的值怎么来的?就是下式的计算结果

$ 2^{256}-2^{32}-2^{9}-2^{8}-2^{7}-2^{6}-2^{4}-1$

参数G 是椭圆曲线点群中的生成元,是选定的一个点,上面给出的值是非压缩格式。

n是以G为生成元群的阶。【这些基本概念,参考之前二,三,四等文章】

还有一个协因子,h = 01【这个后续文章中用到在详细说明】

既然说到了压缩格式,下面就详细说一下。

压缩格式与非压缩格式

这是椭圆曲线上点的坐标(x,y)在计算机中表示问题。

最简单的表示方法就是x 拼上y,这也就是非压缩格式:

04 + x + y

前缀04标志位,表示采用未压缩表示法。这样程序可以按照未压缩格式解析后面的坐标值

压缩格式:

根据椭圆曲线方程,如果我们只保存x, 那么y的值可以计算出来,这样就不用同时保存x,y的值,减少了储存和带宽。何乐而不为呢?

但是如果只知道x, 代入方程会求出两个y,一正一负。分别表示两个不同点,所以光有x还不行。必须加一个标志区别实际使用的是哪个。压缩格式如下;

02 + x (y偶数)

03 + x (y是奇数)

为什么y一定是一奇一偶?

假设y是方程的一个解,则-y也是方程的一个解,在模运算规则下,-y ≡ p - y (mod p) ,所以p-y 是方程的解。两个解的和是p

y + (p - y) = p

p是素数,自然也是奇数,所以两个解肯定是一奇数,一偶数。

secp256k1中G的完整表示:

未压缩格式:G=04 79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

压缩格式:

G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798

压缩格式中标志位是02,可知G点y坐标是偶数。

至于为什么选择02,03,04作为标志呢?工程实现习惯而已,不必纠结。由于椭圆曲线中公钥是一个点,所以一般公钥表示使用压缩格式

这里引申出来一个问题:如果已知压缩格式的值,如何还原为未压缩的状态?这个问题可以归结如下:

已知方程:$y^2 \equiv x^3+ax+b\ (mod\ p)$

已知x 和所求y的奇偶性 求y的值。

暂时搁置一下,看一下公钥恢复原理之后再继续。

公钥恢复原理

这里是指仅通过签名结果来和消息摘要,来计算出签名私钥对应的公钥。

这里需要借助椭圆曲线的签名&验证过程 。下面用到的符号,与签名&验证过程一文相同,不再赘述。

由 $R = (HG - rQ)s^{-1 } \Rightarrow Q = (sR - HG)r^{-1}$

Q是公钥。

到这一步,我们知道是有办法计算出公钥的。再看一下对于验证者已知变量s,r,G,H, 唯独R点不知道,即R点(x,y)坐标未知。

但是有一层关系:r是R点的x坐标。

我们想到能不能通过这种关系求出R点完整信息即解出y值?

答案是可行的。

利用曲线方程式:

$y^2 \equiv x^3+ax+b\ (mod\ p)$

我们可以解出两个符合条件的, 几何上的解释是该曲线关于x轴对称【当然,正如之前所说,并不是所有的椭圆曲线都是关于x轴对称的。这里我们说的是secp256k1曲线】

原理说明白了,到这里可以发现核心是:已知方程式和x坐标求y。

这个和压缩格式还原非压缩格式问题是一类问题。只不过前者还多了y的奇偶性的额外条件。

小结

本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理。最后聚焦了一个核心问题:

已知方程式和x坐标,求y

这个问题直觉不难求出,但是方程是在模运算的有限域上,这一次要反直觉了。

好了,下一篇就讲这个核心问题。

欢迎关注公众号:blocksight

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

发表于 2020-07-25 20:27

阅读 ( 1367 )

学分 ( 18 )

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

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

    本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性. ## 写在前面 上一节说了[从凭证角度详细说明了Miller Rabin算法思路和实现](https://learnblockchain. ...

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

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

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

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

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

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

  5. 零知识证明在区块链中的应用

    零知识证明在区块链中的应用 一.引言 二.相关理论 1. 区块链 2.零知识证明 三.区块链中零知识证明的应用 1.zk-SNARK 2.ZeroCash 四.总结 参考文献 一.引言 在国家重视和政 ...

  6. 区块链中哈希算法c语言代码,解析区块链中的核心技术哈希(Hash)算法

    原标题:解析区块链中的核心技术哈希(Hash)算法 作者:崔利民 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.区块链的关键技术组成主要为:P2P网络协议.共识机制 ...

  7. 基于Java语言构建区块链(四)—— 交易(UTXO)

    基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...

  8. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  9. Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)

    交易(二) 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库&quo ...

最新文章

  1. android adb root方法
  2. 教你简单解决过拟合问题(附公式)
  3. python 技术篇-使用logging日志模块自定义时间格式
  4. GRE核心词汇助记与精练-List8倒、流
  5. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)
  6. Dubbo 3.0 前瞻之对接 Kubernetes 原生服务
  7. .Net高级技术——IDisposable
  8. ways to talk with girls
  9. 不用数学讲清马尔可夫链蒙特卡洛方法?
  10. linux-使用基础-自动补全-快捷键-历史命令-别名
  11. Python核心编程第二版 第十三章课后答案
  12. 从零开始搭二维激光SLAM --- Karto的前端实现与解读
  13. 安装python的numpy模块教程
  14. tp ajax 多图上传,TP5 Ajax上传图片
  15. 利用浏览器保存和下载视频
  16. 小菜的Scala学习笔记,主要部分更新完成
  17. 快速美化封面用word就可以
  18. bim oracle,IBMS和BIM的融合之路
  19. 漫画:什么是MD5算法?
  20. Linux管道初步了解

热门文章

  1. 康博(COMPUWARE)软件公司简介
  2. 买房子需要注意什么?最佳答案
  3. 查看磁盘I/O操作信息
  4. OpenGL调用GPU(七)
  5. Fuchsia之GN与Ninja构建hello world
  6. Linux简单调用so库及Makefile用法
  7. Ubuntu设置静态IP/网关
  8. 新手入门概览(一):机器学习
  9. Android逆向基础笔记—初识逆向
  10. MATLAB语言初步学习(三)