Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么比特币椭圆曲线上的这个特殊的点反转看起来不属于那个椭圆曲线?_Python_Bitcoin_Elliptic Curve - Fatal编程技术网

Python 为什么比特币椭圆曲线上的这个特殊的点反转看起来不属于那个椭圆曲线?

Python 为什么比特币椭圆曲线上的这个特殊的点反转看起来不属于那个椭圆曲线?,python,bitcoin,elliptic-curve,Python,Bitcoin,Elliptic Curve,这一点属于Secp256k1曲线: P(x,y) = (0xeac136e97ce6bf3e2bceb65d906742f7317b6518c54c64353c43dcc36688c47, 0x477bc56ad656f92ce7ad2e832ced54eb923ee3ca6b35938da81eb91b926e9075) 我有点p的倒数: P(x,-y) = (0xeac136e97ce6bf3e2bceb65d906742f7317b6518c54c64353c43dc

这一点属于Secp256k1曲线:

P(x,y) = (0xeac136e97ce6bf3e2bceb65d906742f7317b6518c54c64353c43dcc36688c47,
          0x477bc56ad656f92ce7ad2e832ced54eb923ee3ca6b35938da81eb91b926e9075)
我有点p的倒数:

P(x,-y) = (0xeac136e97ce6bf3e2bceb65d906742f7317b6518c54c64353c43dcc36688c47,
           0xcac32ca278717b5313c1a919437275f5d4aacaa2cdf0fa65c6a1bbff59603a8f)
下面是我在Python中的测试

x = 0xeac136e97ce6bf3e2bceb65d906742f7317b6518c54c64353c43dcc36688c47

y = 0x477bc56ad656f92ce7ad2e832ced54eb923ee3ca6b35938da81eb91b926e9075

_y = 0xcac32ca278717b5313c1a919437275f5d4aacaa2cdf0fa65c6a1bbff59603a8f

F = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
检查点X,y是否真的位于比特币的椭圆曲线上:

>>> pow(y, 2, F) ==  ((pow(x, 3) + 7) % F)
True
>>> pow(_y, 2, F) ==  ((pow(x, 3) + 7) % F)
False
检查点x,-y是否真的是点x,y的逆模F:

>>> (y*_y) % F
1
检查点X,-y是否位于比特币的椭圆曲线上:

>>> pow(y, 2, F) ==  ((pow(x, 3) + 7) % F)
True
>>> pow(_y, 2, F) ==  ((pow(x, 3) + 7) % F)
False
谁能告诉我我做错了什么?因为椭圆曲线上的点逆也应该属于该曲线。

您对-y的计算是错误的。你计算了y的乘法逆。使用_y的定义,可以检查y*_y%F的计算结果是否为1

相反,在此上下文中,-y=F-y:

>>> _y = F-y
>>> hex(_y)
'0xb8843a9529a906d31852d17cd312ab146dc11c3594ca6c7257e146e36d916bba'
>>> pow(_y, 2, F) ==  ((pow(x, 3) + 7) % F)
True
你对-y的计算是错误的。你计算了y的乘法逆。使用_y的定义,可以检查y*_y%F的计算结果是否为1

相反,在此上下文中,-y=F-y:

>>> _y = F-y
>>> hex(_y)
'0xb8843a9529a906d31852d17cd312ab146dc11c3594ca6c7257e146e36d916bba'
>>> pow(_y, 2, F) ==  ((pow(x, 3) + 7) % F)
True

是的,为发现这一点干杯。我实际上从GMP库的mpz_反转方法中取了点反转,将调查为什么它给了我错误的值不能给你任何分数,因为我是这个门户的新手,没有足够的声誉@JohnTamed一开始我认为可能有一些奇怪的endian类型的问题,但问题是你使用的方法计算了一个你不需要的逆。查看编辑。@JohnTamed:mpz_invert给你的值是错误的,因为它是错误的方法。是的,为发现这一点干杯。我实际上从GMP库的mpz_反转方法中取了点反转,将调查为什么它给了我错误的值不能给你任何分数,因为我是这个门户的新手,没有足够的声誉@JohnTamed一开始我认为可能有一些奇怪的endian类型的问题,但问题是你使用的方法计算了一个你不需要的逆。请参见编辑。@JohnTamed:mpz_invert给您的值错误,因为它是错误的方法。