secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理
本节主要讲了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点压缩和公钥恢复原理相关推荐
- secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案
本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性. ## 写在前面 上一节说了[从凭证角度详细说明了Miller Rabin算法思路和实现](https://learnblockchain. ...
- 区块链中的数学(四十二)---基于RSA的VRF(随机可验证函数)
文章来源区块链技术公众号"blocksight",原文欢迎关注! 写在前面 上一节说了VRF(随机可验证函数)概述,由于VRF是与公钥密码学相结合的,自然少不了最常见的公钥密码学体 ...
- 区块链中的数学 - EdDSA签名机制
Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp256k1, sm2 都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结 ...
- C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数
本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...
- 零知识证明在区块链中的应用
零知识证明在区块链中的应用 一.引言 二.相关理论 1. 区块链 2.零知识证明 三.区块链中零知识证明的应用 1.zk-SNARK 2.ZeroCash 四.总结 参考文献 一.引言 在国家重视和政 ...
- 区块链中哈希算法c语言代码,解析区块链中的核心技术哈希(Hash)算法
原标题:解析区块链中的核心技术哈希(Hash)算法 作者:崔利民 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.区块链的关键技术组成主要为:P2P网络协议.共识机制 ...
- 基于Java语言构建区块链(四)—— 交易(UTXO)
基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...
- 基于Java语言构建区块链(五)—— 地址(钱包)
基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...
- Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)
交易(二) 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库&quo ...
最新文章
- android adb root方法
- 教你简单解决过拟合问题(附公式)
- python 技术篇-使用logging日志模块自定义时间格式
- GRE核心词汇助记与精练-List8倒、流
- python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)
- Dubbo 3.0 前瞻之对接 Kubernetes 原生服务
- .Net高级技术——IDisposable
- ways to talk with girls
- 不用数学讲清马尔可夫链蒙特卡洛方法?
- linux-使用基础-自动补全-快捷键-历史命令-别名
- Python核心编程第二版 第十三章课后答案
- 从零开始搭二维激光SLAM --- Karto的前端实现与解读
- 安装python的numpy模块教程
- tp ajax 多图上传,TP5 Ajax上传图片
- 利用浏览器保存和下载视频
- 小菜的Scala学习笔记,主要部分更新完成
- 快速美化封面用word就可以
- bim oracle,IBMS和BIM的融合之路
- 漫画:什么是MD5算法?
- Linux管道初步了解