我正在尝试在 Google Go 的曲线 secp256k1 中实现 ECDSA。
Secp256k1 由 SECG 标准(SEC 2,第 2 部分,Recommended Elliptic Curve Domain Parameters over 𝔽p,第 15 页)根据参数 p、a、b、压缩的 G、未压缩的 G、n 和 h 定义。
在Go's crypto library ,曲线由参数 P、N、B、Gx、Gy 和 BitSize 定义。如何将 SECG 给出的参数转换为 Go 需要的参数?
最佳答案
在Go的elliptic
包中,
A
Curve
represents a short-form Weierstrass curve with a=-3.
因此,我们有 y² = x³ - 3·x + B
形式的曲线(其中 x
和 y
都取值𝔽P). P
和 B
因此是识别曲线的参数,其他仅用于对将用于密码学的曲线元素的操作。
SECG 标准 SEC 2 将 secp256k1 曲线定义为 y² = x³ + a·x + b
,其中 a = 0,即有效 y² = x³ + b
。
这些曲线并不相同,与这里选择的b和B无关。
您的转换无法使用 elliptic
包的 Curve
类,因为它只支持一些特殊的曲线类(这些带有 a = -3
),而 SEC 2 推荐来自其他类别的曲线(对于 ...k1
曲线,a = 0)。
另一方面,名称中带有...r1
的曲线似乎有a = -3
。实际上,secp256r1
似乎与 elliptic
中的 p256()
曲线相同。 (我没有证明这一点,但至少SEC 2中基点的未压缩形式的十六进制数字是椭圆中基点的坐标。)
关于cryptography - 如何将 ECDSA 曲线规范从 SEC2 形式转换为 Go 需要的形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478821/