def sqrt_mod(a,p): """ Calcula la raiz cuadrada modular de a módulo p Args: a(int): Entero p(int): Entero primo Returns: r(int): Raiz de a modulo p Examples: sqrt_mod(319,353) 242 """ if jacobi(a,p) == -1: return -1 n=1 while jacobi(n,p) != -1: n+=1 u=0 s=p-1 while s%2==0: u=u+1 s=s//2 print(u,s); if u == 1: r=exp_mod(a,(p+1)/4,p) elif u >= 2: r=exp_mod(a,(s+1)/2,p) b=exp_mod(n,s,p) j=0 while j<= u-2: base = (inverso_mod(a,p)*r*r)%p exp = exp_mod(2,u-2-j,p) if exp_mod(base,exp,p) == (-1%p): r=(r*b)%p b=(b*b)%p j+=1 return r
def is_prime_Miller_Rabin(n, t=1): # n - 1 = t * 2^s s = 0 t = n - 1 while t % 2 == 0: s = s + 1 t = t // 2 # print("s = %d, t = %d"%(s, t)) flag = True for _ in range(t): b = random.randint(2, n - 1) r = exp_mod(b, t, n) if r == 1: break i = 1 while r != (n - 1): if i == s: flag = False break else: r = (r * r) % n i += 1 if flag: # print("根据Miller-Rabin素性检验,%d为素数"%n) return 1 else: # print("根据Miller-Rabin素性检验,%d为合数"%n) return 0
def es_primo(p,k=7): """ Esta función comprueba si el número dado es primo o no mediante el algoritmo de Miller-Rabin. Args: p(int): Número el cual comprobaremos si es primo. k(int): Número de iteraciones del algoritmo. Por defecto se incializa a 7. Returns: bool: True si es primo, False si no lo es. Example: >>es_primo(123456789101119) True """ fin_bucle=True if(p in [2,3,5,7,11]): return True elif(p<11): return False#Si no esta contenido en la lista anterior y es menor que el último, no es primo if(p%2 != 0): s=0 d=p-1 while d%2==0: s=s+1 d=d//2 for i in range(0,k): a = random.randint(2,p-1) x = exp_mod(a,d,p) if(x!=1 and x!=p-1): for r in range(1,s): x = exp_mod(x,2,p) if(x%p==1): return False #Es par elif(x%p==p-1): fin_bucle=False break if fin_bucle: return False#No encuentra un -1 return True #Probablemente primo else: return False #Porque es par
def ord_of_am(a, m): # a,m需互素 if ext_gcd(a, m)[0] == 1: euler_ = euler(m) for _ in range(1, euler(m)): # 指数整除euler(m) if euler_ % _ == 0: mod = exp_mod(a, _, m) if mod == 1: return _ return euler(m)
def is_prime_Fermat(n, t=1): flag = True for _ in range(t): b = 2 while ext_gcd(b, n)[0] != 1: b = random.randint(3, n - 1) r = exp_mod(b, n - 1, n) if r != 1: flag = False if flag: # print("根据Fermat素性检验,%d为素数"%n) return 1 else: # print("根据Fermat素性检验,%d为合数"%n) return 0
def is_prime_Solovay_Stassen(n, t=1): flag = True for _ in range(t): b = random.randint(2, n - 1) r = exp_mod(b, (n - 1)//2, n) # print("b = %d,r = %d"%(b, r)) if r == 1 or r == (n - 1): s = Jacob(b, n) # print("s = %d", s) if r != s and r != (s + n): flag = False else: flag = False if flag: # print("根据Soloway-Strassen素性检验,%d为素数"%n) return 1 else: # print("根据Soloway-Strassen素性检验,%d为合数"%n) return 0
def legendre(a,p): a = a % p exponent = 0 if (a == 0): return 0 if (p == 2): return 1 if (a == 1): return 1 if (a == -1): exponent = (p - 1) // 2 if(exponent % 2 == 0): return 1 else: return -1 exponent = (p - 1) // 2 flag = exp_mod(a, exponent, p) if (flag == 1): return 1 else: return -1
import socket import exp_mod puerto = raw_input("puerto: ") n = raw_input("n: ") g = raw_input("g: ") x = raw_input("x: ") tempa = exp_mod.exp_mod(long(g),long(x),long(n) ) cat1= n+','+g+','+str(tempa) miSocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) miSocket.connect( ("", int(puerto) ) ) print "[ enviando: " + cat1 + "]" miSocket.send(cat1) data, server = miSocket.recvfrom( 100 ) print data clave = exp_mod.exp_mod(long(data),long(x),long(n)) print clave #miSocket.close()
b=244 print("Ejercicio 2. Inverso modular") print("Parámetros: a=",a," b=",b) print("Solucion: ",inverso_mod(a,b)) t = timeit.Timer(lambda: inverso_mod(a,b)) print("Tiempo de ejecución medio(",n_ejec,"ejecuciones): ",t.timeit(n_ejec)/n_ejec) print("---------------------------------------------------------") a=5 b=596 n=1234 print("Ejercicio 3. Exponenciación modular") print("Parámetros: a=",a," b=",b,"n=",n) print("Solucion: ",exp_mod(a,b,n)) t = timeit.Timer(lambda: exp_mod(a,b,n)) print("Tiempo de ejecución medio(",n_ejec,"ejecuciones): ",t.timeit(n_ejec)/n_ejec) print("---------------------------------------------------------") a=123456789101119 print("Ejercicio 4. Miller-Rabbin") print("Parámetros: a=",a) print("Solucion: ",es_primo(a)) t = timeit.Timer(lambda: es_primo(a)) print("Tiempo de ejecución medio(",n_ejec,"ejecuciones): ",t.timeit(n_ejec)/n_ejec) print("---------------------------------------------------------") n=113 a=3
import socket import exp_mod puerto = raw_input("puerto: ") y = raw_input("y: ") print "[ Escuchando::::: ]" miSocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) miSocket.bind( ("", int(puerto) ) ) miSocket.listen( 1 ) while 1: channel, details = miSocket.accept() recibido=channel.recv(1024) print "Se\ ha conectado %s" % (str(details)) #0,1,2 #n,g,g^x mod n val= recibido.split(",") print val env=exp_mod.exp_mod(long(val[1]),long(y),long(val[0]) ) print str(env) channel.send(str(env)) clave = exp_mod.exp_mod(long(val[2]),long(y),long(val[0])) print clave #channel.close()