Red de conocimiento del abogados - Respuesta a la Ley de patrimonio - Algoritmo para encontrar raíces cuadradas modulares (agregaré más puntos después de completar la respuesta)

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

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)

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()

※※※※※ ※※※※※※※※※※※※※※※※※※※※※※※※※※※