本节主要讲了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为生成元群的阶。【这些基本概念,参考之前二,三,四等文章】
还有一个协因子&