def chiffrement(mode, cle, texte):       # chiffrement de CéŽsar

    k = ord(cle) - 65    # traduction de la cléŽ en un nombre compris entre 0 et 25
    if mode == "D":
    	k *= -1          # si le mode choisi est "déŽchiffrer", effectuer une soustraction plut™ôt qu'une addition
        
    nouveau_texte = ""
    for lettre in texte:
        nouvelle_lettre = lettre
        
        if 65 <= ord(lettre) <= 90:    # si la lettre est une majuscule, transformer celle-ci
            l = ord(lettre) - 65
            nl = (l + k) % 26
            nouvelle_lettre = chr(nl + 65)
        
        nouveau_texte += nouvelle_lettre
    return(nouveau_texte)


def cryptanalyse(texte):
    
    # frŽéquences théŽoriques d'apparition des lettres dans un texte français
    f_theoriques = [8.4, 1.06, 3.03, 4.18, 17.26, 1.12, 1.27, 0.92, 7.34, 0.31, 0.05, 6.01, 2.96, 7.13, 5.26, 3.01,0.99, 6.55, 8.08, 7.07, 5.74, 1.32, 0.04, 0.45, 0.3, 0.12]

    texte_sans_espaces = texte.replace(" ","")
    n=len(texte_sans_espaces)

    # nombrew thŽéoriquew d'apparitions de chaque lettre dans un texte français de longueur n
    n_theoriques = [n*i/100 for i in f_theoriques] 

    difference = 100000      # difféŽrence initialiséŽe àˆ un très grand nombre arbitraire
    k = 0                 		# valeur (numŽérique) de la cléŽ recherchŽe
    
    for i in range(26):   	# boucle effectuŽée sur toutes les valeurs possibles

        # calcul, avec un déŽcalage i, du nombre d'apparitions de chaque lettre
        # dans le texte, suivi du calcul de la difféŽrence, avec ce même dŽécalage
        n_empiriques = [0]*26
        for l in range(n):
            n_empiriques[(ord(texte_sans_espaces[l]) - 65 - i) % 26] += 1
        nouvelle_difference = sum([abs(n_empiriques[j] - n_theoriques[j]) for j in range(26)])

        # si la nouvelle difféŽrence trouvŽée est plus petite que la préŽcéŽdente,
        # mettre ˆ jour sa valeur, ainsi que la clŽ correspondante
        if nouvelle_difference < difference:
            difference = nouvelle_difference
            k = i
            
    return(chr(k+65))     # retour de la clŽé trouvéŽe


# file = open("texte_court.txt","r")
# texte = file.read()
texte = input("Texte d'origine:")
cle = input("CléŽ (entre A et Z):")

texte_chiffre = chiffrement("C",cle,texte)
print("Texte chiffréŽ:",texte_chiffre,"\n")

cle_decryptee = cryptanalyse(texte_chiffre)
texte_decrypte = chiffrement("D",cle_decryptee,texte_chiffre)
print("ClŽé dŽécryptéŽe:",cle_decryptee)
print("Texte dŽécryptŽé:",texte_decrypte)