本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理
上一节讲了Schnorr离散对数签名及素数阶群构造(Schnorr群),相对于结合椭圆曲线的算法,更简洁,更易理解。
之前有不少篇幅讲有限域上椭圆曲线的概念和运算规则【群,加解密,签名验签等】。
本节我们讲下特定的椭圆曲线上的有意思的一个知识点:公钥恢复。椭圆曲线算法常用的有几种实例,本节重点关注区块链领域应用最广的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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!