【问题标题】:How to determine whether base point of secp256k1 (G) lies on curve?如何判断secp256k1(G)的基点是否在曲线上?
【发布时间】:2021-12-27 21:12:11
【问题描述】:

我正在对椭圆曲线进行一些研究。如果我理解正确的话,有一个 G 基点被设置为曲线上的一个大素点。举个例子,我用 G 选择了臭名昭著的 secp256k1 曲线。

G = (0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798, 
     0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8)

我想测试 G 是否位于曲线上。于是我写了一小段python代码。

# y^2 = x^3 + 7
def curveEq(G):
    x, y = G
    left = (y * y)
    right = (x * x * x) + 7
    print("L:  " + str(left))
    print("R:  " + str(right))

但我左!=右。我错过了什么?

【问题讨论】:

  • 嗯......你忘了整个模数的事情。
  • 哦,我不确定这个模组,因为它是基点。在那种情况下,我的代码应该是这样的吗? left = (y * y) + (r * int(P)) 其中 r 是某个订单号?和 P = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2f ? (如果我认为 x 坐标没有修改)
  • y*y = x*x*x + 7 是椭圆曲线,但不是 secpk1 椭圆曲线。 y*y = x*x*x + 7 mod p 其中 p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2f 是 secpk1 椭圆曲线。
  • 啊!所以这就是我所缺少的!十分感谢!如果您将其发布为答案,我可以关闭它:)

标签: cryptography elliptic-curve


【解决方案1】:

对我来说,正如波尔克先生在评论中所说的那样 - secpk1 曲线包含在定义 mod p 中。我完全误解了这条曲线是用 mod p 定义的(我认为曲线只是一个没有 mod 的方程,而 mod 只用于点倍增和加法)。用模数更正我的代码后,一切正常,我能够验证这一点。

# y^2 = x^3 + 7 mod P  for secp256k1
P =  0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
def curveEqMod(p):
    x, y = p
    x = int(x)
    y = int(y)
    left = (y * y) % P
    right = ((x * x * x) + 7) % P
    print("L:  " + str(left))
    print("R:  " + str(right))

正如kelalaka先生所说,还有一个类似的例子:Proof that user public key corresponds the curve equation (secp256r1)

【讨论】:

  • 我们在密码学中使用的所有 EC 都是在有限域 GF(p^m) 上定义的。它们也被称为伽罗瓦域。如果m=1 那么它是一个素数域,而当m >1 它是有限域扩展。所有的操作都必须按照这个来进行。另一方面,点加法从曲线上的点形成一个阿贝尔群。
  • 感谢您提供更多信息 :)
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多