Erreur lors de mon décryptage

likemuz25 Messages postés 23 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 24 mars 2010 - 9 juin 2009 à 16:16
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010 - 10 juin 2009 à 16:07
Voila du code que je test et que j'ai changé un peu. Mon cryptage fonctionne, mais j'ai des problèmes dans mon décryptage et j'aurais besoin de votre aide pour m'aider a améliorer mon code.

J'espère que je pourrai mieux comprendre le cryptage et le décryptage par la suite.

Merci d'avance pour votre aide!

Le voici:
publicpartialclass_Default : System.Web.UI.Page<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

{

    // Tableau de cryptage contenant la clef de 16 octets sous forme héxadécimal.

    byte[] Clef = { 0xEF, 0xF0, 0xA3, 0xF2, 0xF3, 0xE4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xC4, 0xFE };

 

    // Un "vecteur d'initialisation" écrit en hexadécimal.

    byte[] Vect = { 0xEF, 0xC7, 0xF1, 0xF2, 0xF3, 0xB3, 0xF5, 0xF6, 0xF7, 0xC2, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE };

 

    RijndaelManaged objetCrypt = newRijndaelManaged();

 

    // string utiliser pour des tests seulement

    publicstring cypher;

 

    // Emplacement des fichiers.

    string cheminFichier = @"C:\emplacement\test.txt";

 

    // Longueur en byte a décrypter

    privateint longueur;

 

    protectedvoid btnEncrypter_Click(object sender, EventArgs e)

    {

        string texteFichier = getTexteFichier();

        Crypter(texteFichier);

    }

 

 

    protectedvoid btnDecrypter_Click(object sender, EventArgs e)

    {

        Decrypter(getMotCrypter()); // ici, il ne garde pas la valeur de 'cypher' la string a crypter et a décrypter

    }

 

    // ************************ CRYPTER(Textebrut)*******************************

    ///<summary>

    /// Fonction de cryptage : elle necessite en argument une chaîne de caractères,

    /// et renvoie une chaîne de caractères cryptée (CypherTexte).

    ///</summary>

    ///

    ///<returns name="string CypherTexte"></returns>

    // ***************************************************************************

 

    publicstring Crypter(string TexteBrut)

    {

        // Conteneur du texte crypter en mémoire tampon.

        MemoryStream CypherTexteMem = newMemoryStream();

 

        // optionel.. pas sûr a quoi ça sert

        //objetCrypt.Mode = CipherMode.CBC;

 

        // Flux de cryptage "CStream", nécessaire pour crypter.

        CryptoStream CStream = newCryptoStream(CypherTexteMem,

        objetCrypt.CreateEncryptor(Clef, Vect), CryptoStreamMode.Write);

       

        // Convertir d'abord le texte entré en argument (Textebrut)

        // en tableau d'octets (byte).

        byte[] TextebrutByte = newASCIIEncoding().GetBytes(TexteBrut);

 

        // Crypter du début jusqu'a la fin selon la grandeur du tableau d'octets.

        CStream.Write(TextebrutByte, 0, TextebrutByte.Length);

 

        // Fermer le flux de cryptage.

        CStream.Close();

 

        longueur = TexteBrut.Length;

 

        // Créer un tableau d'octets.

        byte[] CypherTexteByte = CypherTexteMem.ToArray();

 

        // Fermer le flux de mémoire tampon.

        CypherTexteMem.Close();

 

        // Convertir les données cryptées en chaîne de caractères cryptée,

        // et les copier dans CypherTexte.

        string CypherTexte = newASCIIEncoding().GetString(CypherTexteByte);

 

        // Afficher le texte crypté a l'écran.

        Response.Write(CypherTexte);

 

        // test pour decrypter

        Decrypter(CypherTexte);

 

        cypher = CypherTexte.ToString();

 

        return CypherTexte;

    }

 

 

    // ************************ DECRYPTER(Textebrut)*****************************

    ///<summary>

    /// Fonction de décryptage : elle necessite en argument une chaîne de

    /// caractères cryptés (CypherTexte) et renvoie une chaîne de caractères.

    ///</summary>

    ///

    ///<returns name="string Textebrut"></returns>

    // ***************************************************************************

 

    publicstring Decrypter(string CypherTexte)

    {

        MemoryStream CypherTexteMem = null;

        CryptoStream CStream = null;

        MemoryStream TextebrutMem = null;

        string erreur = "Erreur lors du décryptage!";

 

        //try

        //{ // en commentaire seulement pour les tests

 

            // Créer une mémoire tampon contenant le texte crypté.

            //CypherTexteMem = new MemoryStream(new UnicodeEncoding().GetBytes(CypherTexte)); (le 1er)

            CypherTexteMem = newMemoryStream(newASCIIEncoding().GetBytes(CypherTexte));

            longueur = CypherTexte.Length;

 

            // Flux de cryptage servant a lire.

            CStream = newCryptoStream(CypherTexteMem, objetCrypt.CreateDecryptor(Clef, Vect), CryptoStreamMode.Read);

 

            // Créer une deuxième mémoire tampon destinée cette fois ci au texte décrypté.

            TextebrutMem = newMemoryStream();

 

            // Créer un tableau d'octets dans lequel nous placeront le texte lu

            // en provenance du flux de cryptage.

            byte[] buf = newbyte[longueur]; //100 ou longueur

 

            int count;

            int compteur = 0;

 

            // Tant que le flux de cryptage est lisible.

            while ((count = CStream.Read(buf, 0, longueur)) > 0) // ici j'ai cette erreur ci souvent : 'Padding is invalid and cannot 
                                                                 //be removed.'

            {

                // Écrire le texte brut obtenu dans la mémoire tampon.

                TextebrutMem.Write(buf, 0, count); // j'ai de la misère a comprendrece que fait chaque argument

                compteur++;

            }

 

            // Fermer le flux de cryptage.

            CStream.Close(); //j'ai souvent des erreurs dans les closes

 

            // Fermer la mémoire tampon du texte crypté.

            CypherTexteMem.Close();

 

            // Placer les données de la mémoire tampon du texte brut dans un

            // tableau d'octets.

            byte[] TextebrutByte = TextebrutMem.ToArray();

 

            // Fermer la mémoire tampon du texte brut.

            TextebrutMem.Close();

 

            // Transformer les données octales en texte.

            //string Textebrut = new UnicodeEncoding().GetString(TextebrutByte); (le 1er)

            string Textebrut = newASCIIEncoding().GetString(TextebrutByte);

 

            // Afficher le texte décrypté a l'écran.

            Response.Write(Textebrut);

 

            return Textebrut;

        //}

        //catch

        //{

         //   Response.Write(erreur);

           // return erreur;

        //}

    }

 

    publicstring getMotCrypter()

    {

        return cypher;

    }

 

    publicstring getTexteFichier()

    {

        string texteFichier = "";

 

        try

        {

            using (StreamReader lecture = newStreamReader(cheminFichier))

            {

                //This is an arbitrary size for this example.

                char[] caractere = null;

 

                while (lecture.Peek() >= 0)

                {

                    caractere = newchar[2];

                    lecture.Read(caractere, 0, caractere.Length);

                    Console.WriteLine(caractere);

                    for (int i = 0; i < caractere.Length; i++)

                    {

                        texteFichier += caractere[i].ToString();

                    }

                }

            }

            return texteFichier;

        }

        catch (Exception e)

        {

            Console.WriteLine("The process failed: {0}", e.ToString());

            return"Fichier vide (erreur)!";

        }

    }

}

Né pour apprendre ...

4 réponses

likemuz25 Messages postés 23 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 24 mars 2010
9 juin 2009 à 16:18
Aussi si quelqu'un peut m'aider pour bien poster mon code... je ne comprend pas... il était super beau, bien indenté et avec de la couleur avant que je le poste et la il n'est vraiment pas beau :(

Né pour apprendre ...
0
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
10 juin 2009 à 09:02
et c est quoi l'erreur?
0
likemuz25 Messages postés 23 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 24 mars 2010
10 juin 2009 à 14:53
J'ai 2 erreurs qui subviennent fréquemment, et on dirait que cela dépend de la chaîne passée en paramètres, comme s'il me disait que sa longueur était invalide. Comment je fais pour être sûr qu'elle soit valide?

En fait, mon cryptage-décryptage c'est pour des fichiers. Je voulais aussi savoir si les saut de lignes pouvaient poser un problème dans le cryptage ou le décryptage, et si oui, comment je peux faire pour les gérer.

Je voulais aussi savoir si mon while était utile dans cette séquence:

while((count = CStream.Read(buf, 0, longueur)) > 0) // ici erreur : 'Padding is invalid and cannot be removed'
{
         // Écrire le texte brut obtenu dans la mémoire tampon.
         TextebrutMem.Write(buf, 0, count);
}

voici les 2 erreurs:

1- Length of the data to decrypt is invalid. --> (toujours dans le décryptage) ligne : while ((count = CStream.Read(buf, 0, longueur)) > 0) .. donc quand il fait le read
2- a la ligne: CStream.Close(); (mais je ne me rappel pu exactement du message d'erreur)

Merci beaucoup d'avance!

Né pour apprendre ...
0
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
10 juin 2009 à 16:07
Bonjour.

En fait, mon cryptage-décryptage c'est pour des fichiers. Je voulais aussi savoir si les saut de lignes pouvaient poser un problème dans le cryptage ou le décryptage, et si oui, comment je peux faire pour les gérer.

non.

voici les 2 erreurs:

1- Length of the data to decrypt is invalid. --> (toujours dans le décryptage) ligne : while ((count = CStream.Read(buf, 0, longueur)) > 0) .. donc quand il fait le read

Pour cette erreur, c'est que ton fichier à décrypté n'a pas le meme nombre de caractere à décrypter que l'original. donc il plante.

2- a la ligne: CStream.Close(); (mais je ne me rappel pu exactement du message d'erreur)

Bah ça doit etre que tu as une erreur avant, alors il n'arrive pas à le fermer.

Je te conseil de jeter un oeil la dessus , ça m'avait bien aidé :

http://support.microsoft.com/kb/307010/fr

par contre la méthode de crypto utilisé ici est triple des (TDES), en gros tu aura 2 lignes à changer
0
Rejoignez-nous