Golang的椭圆曲线库可以在给定具有X和Y值的公共坐标(未压缩坐标)的情况下导出密钥。
但是,当给定的点是具有给定y位的X9.62压缩形式的单个值时,如何解压缩它?
OpenSSL使用以下方法处理此场景:
https://github.com/openssl/openssl/blob/4e9b720e90ec154c9708139e96ec0ff8e2796c82/include/openssl/ec.h#L494
似乎也有一个类似的问题涉及到数学,但不是Go的最佳实践,具体来说:
https://crypto.stackexchange.com/questions/8914/ecdsa-compressed-public-key-point-back-to-uncompressed-public-key-point
在Go中应该如何做到这一点?
2条答案
按热度按时间jdzmm42g1#
据我所知,Go标准库(或“x”包)中没有点解压缩函数,所以你必须自己做(或找到现有的实现)。
实现并不太困难,尽管有几件事需要注意。
基本上,你需要将
X
的值插入曲线方程Y2 = X3 + aX + b
,然后使用符号位确定你想要的两个根中的哪一个。棘手的是要记住,所有这些都需要对群的域素数取模。我发现Go’s big integer package有时使用起来有点奇怪,因为它使用可变值,但它确实有一个模平方根函数,这使我们更容易。曲线参数在
crypto/elliptic
package中可用,尽管你需要知道这些曲线的a
参数始终是-3
。假设你有一个
[]byte
的压缩点(前面是0x02
或0x03
)在compressed_bytes
中,即following should work。这是等式的一个非常直接的实现,我用注解和大量的命名变量来试图解释发生了什么。(和更短的)实现。它基本上是相同的,直到模平方根。rmbxnbpk2#
在Go的后续版本中,这方面已经有所改进。现在可以使用UnmarshalCompressed方法。这是Go 1.15引入的。
示例: