发布于 2020-06-11 10:37:23
是。为了使公钥有效(不只是32个随机字节),点必须在曲线上。你可以通过将x和y值插入曲线的方程中,并求解方程“超越场”来测试点是否在曲线上,以查看方程是否正确。
例如,secp256k1曲线的方程是:
y^2 = x^3 + 7其场特征(p)是:
p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f因此,要检查一个点是否在曲线上,您可以将点的x和y值插入下面的方程,并测试它是否检查:
(y^2 - x^3 - 7) % p == 0以下是secp256k1曲线上的一点:
(0x5633454c810b6e3c881e35f904a6215f1825e46429a54061d1b7448be1b4285e, 0xd1016a4e4b8c6d3a2220e76c8cd66d0ad8e42c1ea84109fef12fa601b5dd09b8)但是,以下一点并不是:
(0x2d09f894eff47eba35ae4eda6ecfe71fb8263b84c092249e820ba5e6e73c0da3, 0x19ece9e391ce286cbb1907c38359dd4c086e5540fc82593731a2f893ef1bedef)下面是一个简短的Python脚本,可以用来测试点是否在曲线上。
def isoncurve(x, y):
# For secp256k1
p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
return (y * y - x * x * x - 7) % p == 0
#returns True
x=0x5633454c810b6e3c881e35f904a6215f1825e46429a54061d1b7448be1b4285e
y=0xd1016a4e4b8c6d3a2220e76c8cd66d0ad8e42c1ea84109fef12fa601b5dd09b8
print (hex(x) + ',' + hex(y) + ' is on secp256k1 curve: ' + str(isoncurve(x, y)))
# Returns False
x=0x2d09f894eff47eba35ae4eda6ecfe71fb8263b84c092249e820ba5e6e73c0da3
y=0x19ece9e391ce286cbb1907c38359dd4c086e5540fc82593731a2f893ef1bedef
print (hex(x) + ',' + hex(y) + ' is on secp256k1 curve: ' + str(isoncurve(x, y)))https://security.stackexchange.com/questions/233099
复制相似问题