import string

def generer_matrice():
    alphabet = string.ascii_uppercase
    matrice = []
    for i in range(len(alphabet)):
        ligne = alphabet[i:] + alphabet[:i]
        matrice.append(list(ligne))
    return matrice

def afficher_matrice(matrice):
    print("\nMatrice de Vigenère :")
    print("   " + " ".join(string.ascii_uppercase))
    for i, ligne in enumerate(matrice):
        print(f"{string.ascii_uppercase[i]}: {' '.join(ligne)}")
    print()

def normaliser_texte(texte):
    return "".join([c.upper() for c in texte if c.isalpha() or c == " "])

def etendre_clef(clef, texte):
    clef = clef.replace(" ", "").upper()
    resultat = ""
    index_clef = 0
    for c in texte:
        if c == " ":
            resultat += " "
        else:
            resultat += clef[index_clef % len(clef)]
            index_clef += 1
    return resultat

def chiffrer(message, clef, matrice):
    message = normaliser_texte(message)
    clef_etendue = etendre_clef(clef, message)
    alphabet = string.ascii_uppercase
    message_chiffre = ""

    for m, k in zip(message, clef_etendue):
        if m == " ":
            message_chiffre += " "
        else:
            ligne = alphabet.index(k)
            colonne = alphabet.index(m)
            message_chiffre += matrice[ligne][colonne]
    return message_chiffre

def dechiffrer(message_chiffre, clef, matrice):
    clef_etendue = etendre_clef(clef, message_chiffre)
    alphabet = string.ascii_uppercase
    message_clair = ""

    for c, k in zip(message_chiffre, clef_etendue):
        if c == " ":
            message_clair += " "
        else:
            ligne = alphabet.index(k)
            colonne = matrice[ligne].index(c)
            message_clair += alphabet[colonne]
    return message_clair

def main():
    matrice = generer_matrice()
    afficher_matrice(matrice)

    while True:
        choix = input("Choisissez une opération ([C]hiffrer / [D]échiffrer / [Q]uitter) : ").upper()
        if choix == "Q":
            print("Au revoir !")
            break
        elif choix not in ["C", "D"]:
            print("Choix invalide, réessayez.")
            continue

        message = input("Entrez le message : ")
        clef = input("Entrez la clé (4 à 16 caractères) : ")
        if not (4 <= len(clef) <= 16):
            print("La clé doit contenir entre 4 et 16 caractères.")
            continue

        if choix == "C":
            resultat = chiffrer(message, clef, matrice)
            print("\nMessage chiffré :", resultat, "\n")
        else:
            resultat = dechiffrer(message, clef, matrice)
            print("\nMessage déchiffré :", resultat, "\n")

if __name__ == "__main__":
    main()
