/** Methode de TranspositionInverse : Methode permettant de Transposer le Message lors du Dechiffrement
         * @param message : Le message à Transposer
         * @param cle : La clé de transposition à respecter lors de la transposition du message
         *
         * @return string
         */
        public static string TranspositionInverse(string message, string cle)
        {
            // @see FillMatriceTransInverse() : Methode permettant de Remplir une matrice
            // lors de l'opération de Dechiffrement
            Matrice uneMatrice = FillMatriceTransInverse(message, cle);

            return(uneMatrice.ToString());
        }
        /** Methode FillMatriceTransInvers : Remplissage de la Matrice à partir du message
         *  Methode Utilisé pour remplir le tableau lors du DECHIFFREMENT
         *  @param message : Le message à remplir dans la Matrice
         *  @param cle : la cle de Transposition, Utile pour determiner le nombre de colonne de la Matrice
         *
         *  @return Matrice
         */
        private static Matrice FillMatriceTransInverse(string message, string cle)
        {
            // Supprimer le '\0' accompagnant le message lors de l'encodage par l'espace vide
            string messageSansUnicode = message.Replace("\0", string.Empty);

            string[] cleSansEspace = cle.Split(' ');// on recupere la cle sans espace
            // longueur de la cle = nombre colonne de la Matrice
            int nbreColonne = cleSansEspace.Length;
            int sizeMessage = messageSansUnicode.Length;

            // il s'agit du nbLigne que notre Matrice de transposition comporte
            int     nbreLigne  = sizeMessage % nbreColonne == 0 ? (sizeMessage / nbreColonne) : ((sizeMessage / nbreColonne) + 1);
            Matrice uneMatrice = new Matrice(nbreLigne, nbreColonne);

            // Associer chaque colonne de la Matrice avec son numero de la clé
            SortedList listeTransposition = new SortedList();

            // On remplit la Liste de correspondance de Colonne de la Matrice à la Clé de Transposition
            for (int i = 0; i < cleSansEspace.Length; i++)
            {
                listeTransposition.Add(int.Parse(cleSansEspace[i]), i);
            }

            // Constituer la Matrice avec le message à dechiffrer, tout en respectant l'ordre de la clé
            int curseur = 0; // Element courant sur le message

            for (int j = 0; j <= 9; j++)
            {
                if (listeTransposition[j] == null)
                {
                    continue;
                }
                else
                {
                    int positionDansCle = (int)listeTransposition[j]; // Position de la Colonne à remplir

                    for (int k = 0; k < uneMatrice.RowSize; k++)
                    {
                        if (uneMatrice[k, positionDansCle] == null && curseur < sizeMessage)
                        {
                            uneMatrice[k, positionDansCle] = messageSansUnicode.Substring(curseur, 1);
                            curseur++;
                        }
                        else if (uneMatrice[k, positionDansCle] == null && curseur >= sizeMessage)
                        {
                            uneMatrice[k, positionDansCle] = " ";
                        }
                    }
                }
            }

            return(uneMatrice);
        }
        /**********************************************************************************************/
        /**************                   TRANSPOSITION DES MESSAGES                    ***************/
        /**********************************************************************************************/

        /** Methode de Transposition : Methode permettant de Transposer le Message lors du Chiffrement
         * @param message : Le message à Transposer
         * @param cle : La clé de transposition à respecter lors de la transposition du message
         *
         * @return string
         */
        public static string Transposition(string message, string cle)
        {
            // on remplit la Matrice des caractères constituant le message
            // @see FillMatrice() : permet de remplir le atrice lors du Chiffrement
            Matrice uneMatrice = FillMatrice(message, cle);

            string[] cleSansEspace    = cle.Split(' ');
            string   messageTranspose = ""; //varible qui capture le message qu'on transpose

            //on associe a chaque chiffre de la cle sa position dans la cle
            SortedList listeTransposition = new SortedList();

            try
            {
                for (int i = 0; i < cleSansEspace.Length; i++)
                {
                    listeTransposition.Add(int.Parse(cleSansEspace[i]), i);
                }
            }
            catch (Exception)
            {
                Console.WriteLine("1. Assurez-vous de ne pas avoir du blanc ' ' après avoir entrer la clé !\n" +
                                  "2. Veuillez entrer des chiffres !");
                Environment.Exit(-1);
            }

            for (int j = 0; j <= 9; j++)
            {
                if (listeTransposition[j] == null)
                {
                    continue;
                }
                else
                {
                    int positionDansCle = (int)listeTransposition[j];
                    for (int k = 0; k < uneMatrice.RowSize; k++)
                    {
                        if (uneMatrice[k, positionDansCle] != null)
                        {
                            messageTranspose += uneMatrice[k, positionDansCle];
                        }
                    }
                }
            }

            return(messageTranspose);
        }
        /**********************************************************************************************/
        /******************             REMPLISSAGE DE LA MATRICE                    ******************/
        /**********************************************************************************************/

        /** Methode FillMatrice : Remplissage de la Matrice à partir du message
         *  Methode Utilisé pour remplir le tableau lors du CHIFFREMENT
         *  @param message : Le message à remplir dans la Matrice
         *  @param cle : la cle de Transposition, Utile pour determiner le nombre de colonne de la Matrice
         *
         *  @return Matrice
         */
        private static Matrice FillMatrice(string message, string cle)
        {
            // Supprimer le '\0' accompagnant le message lors de l'encodage par l'espace vide
            string messageSansUnicode = message.Replace("\0", string.Empty);

            string[] cleSansEspace = cle.Split(' ');// on recupere la cle sans espace
            // longueur de la cle = nombre colonne de la Matrice
            int nbreColonne = cleSansEspace.Length;
            int sizeMessage = messageSansUnicode.Length;

            //il s'agit du nbreLigne que notre Matrice de transposition comporte
            int     nbreLigne  = sizeMessage % nbreColonne == 0 ? (sizeMessage / nbreColonne) : ((sizeMessage / nbreColonne) + 1);
            Matrice uneMatrice = new Matrice(nbreLigne, nbreColonne);

            // Remplissage de la Matrice
            int curseur = 0; // curseur de deplacement dans la matrice qui designe le caractere courant

            for (int i = 0; i < nbreLigne; i++)
            {
                for (int j = 0; j < nbreColonne; j++)
                {
                    if (curseur <= (nbreLigne * nbreColonne))
                    {
                        if (curseur >= messageSansUnicode.Length)
                        {
                            uneMatrice[i, j] = " ";
                        }
                        else
                        {
                            uneMatrice[i, j] = messageSansUnicode.ToCharArray()[curseur].ToString();
                        }
                    }
                    curseur++;
                }
            }

            return(uneMatrice);
        }