import os

def euclide_etendu(e, phi_n):
  global d 
  d = 1 
  temp = (e*d)%phiden
  while temp != 1 :
  	d = d + 1
  	temp = (e*d)%phiden
  return d
def pgcd(a,b):
        # L'algo PGCD
        while a != b:
            if a > b:
                a = a - b
            else:
                b = b - a
            
        return a
def factoriser(n):
    b=2
    while b:
        while n%b!=0 :
            b=b+1
        if n/b==1 :
            print("p = ", b,)
            # On créé une variable globale p pour la réutiliser hors de la fonction et p=b
            global p
            p = b
            break
        print("\nq = ", b,)
        # On créé une variable globale q pour la réutiliser hors de la fonction et q=b
        global q
        q=b
        n=n/b;
pqconnu = 0
pqconnu = input("Si vous êtes en possession de p et q, entrez 1 sinon 0 : ")
pqconnu = int(pqconnu)
if pqconnu == 0 :
    # On récupère n.
    n = input("Entrez le nombre n : ")
    n=int(n)
    # On appelle la fonction pour le factoriser.
    factoriser(n)
    # On calcule phi(n)
    phiden = (p-1)*(q-1)
    # La fonction PGCD avec ses 2 arguments a et b.
    
    # Variable pour notre boucle while
    compteur = 0
    PGCD1 = 0
    
    # Notre e qui s'incrémentera
    e = 0
    
    # Tant que PGCD de e et phi(n) différent de 1
    while PGCD1 != 1 :
        # Tant que compteur=0
        while compteur == 0 :   
            # Si p inférieur à e et si q inférieur à e et si e inférieur à n
           if((p < e) and(q < e) and(e < phiden)) : 
               # La boucle se coupe (on peut aussi mettre le mot-clé : break
                compteur = 1
                break     
            # Tant que rien n'est trouvé, e s'incrémente
           e = e + 1
        # On récupère le résultat du pgcd    
        PGCD1 = pgcd(e,phiden)
    # On calcule d
    d = 0
    compteur = 0
    while compteur == 0:
        # Les conditions vues ci-dessus :
        if((e * d % phiden == 1) and(p < d) and(q < d) and(d < phiden)):
            compteur = 1
        d = d + 1
    d = d - 1

    # On affiche la clé privée
    print("\nCle privee (",d,",",n,")")
if pqconnu == 1 :
    p = input("Entrez le nombre p : ")
    p= int(p)
    q = input("Entrez le nombre q : ")
    q= int(q)

    # On calcule n
    n = p*q
    # On calcule phiden
    phiden = (p-1)*(q-1)
    e=input("veuillez saisir e : ")
    e = int(e)
    euclide_etendu(e, phiden)
   

liste = input("si vous utilisez notre encodeur merci de mettre le bloc sortit par l'encodeur : ") 
liste = liste.split('.')
i=len(liste)-1
 
#i = input("Combien il y a de bloc :")

compteur = 0
count = 0
# Tant que r inférieur au nombre de lettres
while compteur < i :
    # L'utilisateur entre le premier bloc à déchiffrer
    #lettre_crypt = input("\nEntrez le bloc a déchiffrer :")
    lettre_crypt = liste[compteur]
    lettre_crypt = int(lettre_crypt)
    count = count+1
    print(count)
    # On trouve le ASCII de chaque lettre par le calcul de décodage
    ascii1 = (pow(lettre_crypt,d)%n)

    # Avec la fonction chr(ASCII), on trouve le caractère correspondant.
    print( "lettre :",chr(ascii1),)
    compteur = compteur + 1
    bloc = bloc+str(lettre_crypt)
print(bloc)
os.system("pause")