Algoritmo para encontrar raíces cuadradas modulares (agregaré más puntos después de completar la respuesta)
#!/usr/bin/python
#Encoding=gbk
Importar matemáticas
Def algoritmo _ rápido (a, b, c): # y = a b% c, dividido por la potencia b de a do.
a = a % c
ans = 1
#No necesitamos considerar B
¡Y b! = 0: #Teorema de Fermat
Si b & amp1:
ans = (ans * a) % c
b & gt& gt=1 p >
a = (a * a) % c
Devolver respuesta
Def IsHaveMoSqrt(x, P): #¿Existe una raíz cuadrada modular y*y=x mod? p, dado x, P, determine si existe y.
ret = quick_algorithm(x, (P-1)//2, P)
Si ret==1:
Devuelve Verdadero
De lo contrario:
Devuelve False
Def GetMoSqrt(x, P): #Encuentra la raíz cuadrada del módulo y*y=x mod p, donde se conoce x, y P encuentra y .
if(IsHaveMoSqrt(x, P)==1):
t=0
s = p-1 # p-1 =(2t) * s//s es un número impar.
Y s%2==0:
s=s//2
t=t+1
si(t ==1):
ret = quick_algorithm(x, (s+1)//2, P)
Retorno (ret, P-ret)
elif(t>=2):
x _ = algoritmo rápido (x, P-2, P)
n=1
mientras (IsHaveMoSqrt (n, P)==1):
n=n+1
b = Algoritmo rápido (n, s, P)
Imprimir (b )
ret = algoritmo_rápido(x, (s+1)//2, P)#t-1
t_=0
mientras( t- 1 & gt; 0):
if(quick_algorithm(x_*ret*ret, 2**(t-2), P)==1):
ret =return
En caso contrario:
ret = ret *(b * *(2 * * t _)% P
t=t-1
t_=t_+1
Devuelve (ret, P-ret)
En caso contrario:
Devuelve (-2, -2) p>
De lo contrario:
Devolver (-1,-1)
defsecp 256k 1 getybyx(x):# y ^ 2 = x ^ 3+7(mod p ) Buscar y basado en x
a = (x * x * x+7)% 0x ffffffffffffffffffffffffffffffffffff 2f
ret = GetMoSqrt(a, 0x ffffffffffffffffffffffffffffffffffffffffffffffff 2f)
Devolver ret
si __name__ == "__main__ ":
Si es verdadero:
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 # La clave privada es 1 y la clave pública correspondiente es x
ret = secp 256k 1 getybyx(x)# secp 256k 1, encuentre y basado. en x.
imprimir("x=%x" % (x))
imprimir("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
Imprimir("")
X=1#x valor mínimo
ret = secp 256k 1 getybyx(x)# secp 256k 1, encuentre y basándose en x.
imprimir("x=%x" % (x))
imprimir("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
Print("")
x = 0x ffffffffffffffffffffffffffffffffffffffffffffffffff c2f-3 # Valor máximo de x.
ret = secp 256k 1 getybyx(x)# secp 256k 1, encuentra y basado en x.
imprimir("x=%x" % (x))
imprimir("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
Imprimir("")
Entrada()
※※※※※ ※※※※※※※※※※※※※※※※※※※※※※※※※※※