我正在尝试在 Google Go 的曲线 secp256k1 中实现 ECDSA。
Secp256k1 由 SECG 标准(SEC 2,第 2 部分,p上的推荐椭圆曲线域参数,第 15 页)根据参数 p、a、b、G 压缩、G 未压缩、n 和 h 定义。
在Go 的加密库中,曲线由参数 P、N、B、Gx、Gy 和 BitSize 定义。如何将 SECG 给定的参数转换为 Go 需要的参数?
我正在尝试在 Google Go 的曲线 secp256k1 中实现 ECDSA。
Secp256k1 由 SECG 标准(SEC 2,第 2 部分,p上的推荐椭圆曲线域参数,第 15 页)根据参数 p、a、b、G 压缩、G 未压缩、n 和 h 定义。
在Go 的加密库中,曲线由参数 P、N、B、Gx、Gy 和 BitSize 定义。如何将 SECG 给定的参数转换为 Go 需要的参数?
在elliptic
Go 的包中,
A
Curve
表示 a=-3 的简式 Weierstrass 曲线。
所以,我们有形式的曲线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
class无法进行转换,因为它仅支持某些特殊的曲线类别(这些带有a = -3
),而 SEC 2 推荐其他类别的...k1
曲线(曲线的 a = 0)。
另一方面,...r1
名称中带有的曲线似乎具有a = -3
. 实际上,secp256r1
似乎与 as 中可用的曲线elliptic
相同p256()
。(我没有证明这一点,但至少 SEC 2 中基点的未压缩形式的一些十六进制数字是椭圆基点的坐标。)