区块链中的数学-secp256k1点压缩和公钥恢复原理

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

写在前面

上一节讲了Schnorr离散对数签名及素数阶群构造(Schnorr群),相对于结合椭圆曲线的算法,更简洁,更易理解。

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

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

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

公钥恢复原理

这里是指仅通过签名结果来和消息摘要,来计算出签名私钥对应的公钥。 这里需要借助椭圆曲线的签名&验证过程 。下面用到的符号,与签名&验证过程一文相同,不再赘述。

由 $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
  • 阅读 ( 561 )
  • 学分 ( 18 )
  • 分类:入门/理论

0 条评论

请先 登录 后评论
blocksight
blocksight

58 篇文章, 1373 学分