#!/usr/bin/python
#編碼=gbk
導入數學
Def quick _ algorithm (a,b,c): # y = a b% c,a的b次方除以c。
a = a % c
ans = 1
#我們不需要考慮B
而b!= 0: #費馬定理
如果b & amp1:
ans = (ans * a) % c
b & gt& gt=1
a = (a * a) % c
返回答案
Def IsHaveMoSqrt(x,P):#是否有模平方根y*y=x mod p,給定x,P,判斷是否有y。
ret = quick_algorithm(x,(P-1)//2,P)
如果ret==1:
返回True
否則:
返回False
Def GetMoSqrt(x,P):#求模y*y=x mod p的平方根,其中x已知,P求y。
if(IsHaveMoSqrt(x,P)==1):
t=0
s = p-1 # p-1 =(2t)* s//s是奇數。
而s%2==0:
s=s//2
t=t+1
if(t==1):
ret = quick_algorithm(x,(s+1)//2,P)
返回(ret,P-ret)
elif(t & gt;=2):
x _ =快速算法(x,P-2,P)
n=1
while(IsHaveMoSqrt(n,P)==1):
n=n+1
b =快速算法(n,s,P)
打印(b)
ret = quick_algorithm(x,(s+1)//2,P)#t-1
t_=0
while(t-1 & gt;0):
if(quick_algorithm(x_*ret*ret,2**(t-2),P)==1):
ret =返回
否則:
ret = ret *(b * *(2 * * t _)% P
t=t-1
t_=t_+1
返回(ret,P-ret)
否則:
返回(-2,-2)
否則:
返回(-1,-1)
defsecp 256k 1 getybyx(x):# y ^ 2 = x ^ 3+7(mod p)根據x求y。
a =(x * x * x+7)% 0x fffffffffffffffffffffffffffffffffffffffffffffff 2f
ret = GetMoSqrt(a,0x fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 2f)
返回ret
if __name__ == "__main__ ":
如果為真:
x = 0x 79 be 667 ef 9 dcb ba 55 a 06295 ce 870 b 07029 bfc db 2 DCE 28d 959 f 2815B 1798 #私鑰是1,對應的公鑰x。
ret = secp 256k 1 getybyx(x)# secp 256k 1,根據x求y。
print("x=%x" % (x))
print("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
打印("")
X=1#x最小值
ret = secp 256k 1 getybyx(x)# secp 256k 1,根據x求y。
print("x=%x" % (x))
print("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
打印("")
x = 0x fffffffffffffffffffffffffffffffffffffffffffffffffffffff c2f-3 # x最大值。
ret = secp 256k 1 getybyx(x)# secp 256k 1,根據x求y。
print("x=%x" % (x))
print("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
打印("")
輸入()
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※