def gen_safeprime(a, b):
    p=random.randint(a, b)
    q=(p-1)//2
    while (not am.es_primo(p, 30) or not am.es_primo(q, 30)):
        p=random.randint(a, b)
        q=(p-1)//2
    return p
def descomposicion_ejer3_v2(n):
    if am.es_primo(n, 500):
        return(n ,1)
    if n%2==0:
        return(n//2, 2)
    a,b=raices_iguales(n)
    if type(a)==str:
        return "ERROR: No existen a!=b tal que f(a)==f(b)"
    #print("a=", a, "fa=", fa, "b=", b, "fb=", fb)
    return descomposicion_ejer3(n, a, b)
def descomposicion_ejer3(n, f1, f2):
    r1=f1+f2
    r2=abs(f1-f2)
    mcd1=am.euclides_extendido(r1, n)[0]
    if mcd1!=1:
        return (mcd1, n//mcd1)
    else:
        mcd2=am.euclides_extendido(r2, n)[0]
        if mcd2!=1:
            return (mcd2, n//mcd2)
    if am.es_primo(n, 50):
        return (n, 1)
def funcion_ax(p):
    if am.es_primo(p, 30):
        q=(p-1)//2
        alfa=random.randint(1, q)
        temp=am.potencia_modular(alfa, q, p)
        while(temp==1):
            alfa=random.randint(2, p-1)
            temp=am.potencia_modular(alfa, q, p)
        temp=random.randint(1, q)
        while am.euclides_extendido(temp, p-1)[0]!=1:
            temp+=1
        alfa=am.potencia_modular(alfa, temp, p)
        x=random.randint(2, p-2)
        global clave_x
        clave_x=x
        y=am.potencia_modular(alfa, x, p)
        #Clave publica: (p, alfa, y)
        res=(p, alfa, y)
        return res
    else:
        return("P: ", p, " no es primo")
def gen_primo(a, b):
    x=random.randint(a, b)
    while am.es_primo(x, 30)==False:
        x=random.randint(a, b)
    return x
    #q=gen_primo(1000, 10000)
    #n=p*q
    #print("n=", n)
    #tini=time.time()
    #pq=descomposicion_ejer3_v2(n)
    #print("Tiempo= %.3f" % (time.time()-tini))
    #print("p= ", pq[0], "q=", pq[1])
    #print("p, q = ", pq)

    #Ejercicio 5
    print('\nEjercicio 5 - RSA')
    p=20078699
    q=19920608
    m=1234567890

    while(not am.es_primo(p, 30)):
        p+=1
    while (not am.es_primo(q, 30)):
        q+=1
    n=p*q
    print("N=", n)
    e=calculo_e(p, q)
    d=calculo_d(p, q, e)
    print ("e=", e, " d=", d)
    cif=cifrado_RSA(m, e, n)
    descif=descifrado_RSA(cif, d, n)
    print("Cifrado RSA para : ", m, "=", cif)
    print("Descifrado RSA: ", descif)

    #Ejercicio 6
    print('\nEjercicio 6')