IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Décryptage d'un fichier avec Rijndael


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Par défaut Décryptage d'un fichier avec Rijndael
    Bonjour,

    Je souhaiterai décrypter des fichiers zip via une appli C# un utilisant Rijndael.
    Pour ça, j'ai bien une clé de décryptage 32 octets ainsi que l'IV qui va bien en 32 octets également.

    Le décryptage se déroule bien en utilisant OpenSSL via l'invit' de commandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openssl enc -d -aes-128-cbc -K clé -iv IV -in C:\insertion\monfichier.zip -out C:\insertion\resultat.zip
    J'ai donc créé une méthode me permettant de décrypter un fichier, en C#. Le problème, c'est qu'elle me retourne l'exception suivante : "Longueur des données à déchiffrer non valide."
    Je dois avouer que j'ai du mal à voir d'où ça peut venir, je ne suis pas encore très à l'aise avec le cryptage/décryptage.

    Voici ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public static void decryptFile(string sKey, string sIv, string sPathCypheredFile, string sPathFile)
            {
                // -- Place la clé de déchiffrement dans un tableau d'octets
                // ---------------------------------------------------------
                byte[] key = Encoding.UTF8.GetBytes(sKey);
     
                // -- Place le vecteur d'initialisation dans un tableau d'octets
                // -------------------------------------------------------------
                byte[] iv = Encoding.UTF8.GetBytes(sIv);
     
                try
                {
                    // -- Filestream du nouveau fichier décrypté
                    // -----------------------------------------
                    FileStream fsCrypt = new FileStream(sPathFile, FileMode.Create);
     
                    RijndaelManaged rijndael = new RijndaelManaged();
                    rijndael.Padding = PaddingMode.Zeros;
                    rijndael.BlockSize = 256;
                    rijndael.Mode = CipherMode.CBC;
                    rijndael.Key = key;
                    rijndael.IV = iv;
     
                    ICryptoTransform aesDecryptor = rijndael.CreateDecryptor(key, iv);
     
                    CryptoStream cs = new CryptoStream(fsCrypt, aesDecryptor, CryptoStreamMode.Write);
     
                    // -- FileStream du fichier crypté
                    // -------------------------------
                    FileStream fsIn = new FileStream(sPathCypheredFile, FileMode.Open);
     
                    int data;
     
                    while ((data = fsIn.ReadByte()) != -1)
                        cs.WriteByte((byte)data);
     
                    cs.Close();
                    fsIn.Close();
                    fsCrypt.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception("GTMCrypto.decryptFile : " + ex.Message + "\n", ex);
                }
            }
    Vous pouvez me donner un petit coup de main ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    L'erreur peut venir de ton paramètrage du manager.

    est-ce que tu as essayé sans les padding/blocksize/mode?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RijndaelManaged rijndael = new RijndaelManaged();
    rijndael.Key = key;
    rijndael.IV = iv;

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Par défaut
    Merci de ta réponse.
    Lorsque je laisse le padding par défaut, j'ai l'exception suivante : "Le remplissage n'est pas valide et ne peut pas être supprimé."

    En ce qui concerne le blockSize, je suis obligé de l'avoir à 256 afin que mon manager puisse géré l'IV de 32 octets. Bon, j'ai quand même testé, mais... Exception également
    "Le vecteur d'initialisation (IV) spécifié ne correspond pas à la taille du bloc pour cet algorithme."

    Enfin, si j'enlève le mode, toujours exception : "Longueur des données à déchiffrer non valide."

    J'ai aussi testé en utilisant la librairie .NET de OpenSSL, je n'ai pas non plus réussi à décrypter mon fichier, c'est à n'y rien comprendre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public static void decryptFileOpenSSL(string sKey, string sIv, string sPathCypheredFile, string sPathFile)
            {
                int iTemp;                     
                byte[] data = new byte[0];      
                byte[] dec;   
     
                // -- Place la clé de déchiffrement dans un tableau d'octets
                // ---------------------------------------------------------
                byte[] key = Encoding.ASCII.GetBytes(sKey);
     
                // -- Place le vecteur d'initialisation dans un tableau d'octets
                // -------------------------------------------------------------
                byte[] iv = Encoding.ASCII.GetBytes(sIv);
     
                try
                {
                    // -- Création du fichier décrypté et ouverture du
                    // -- fichier crypté -----------------------------
                    // -----------------------------------------------
                    FileStream fsOut = new FileStream(sPathFile, FileMode.OpenOrCreate);
                    FileStream fsIn = new FileStream(sPathCypheredFile, FileMode.Open);
     
                    fsOut.Close();
     
                    while ((iTemp = fsIn.ReadByte()) != -1)
                    {
                        Array.Resize(ref data, data.Length + 1);
                        data[data.Length - 1] = (byte)iTemp;
                    }
     
                    fsIn.Close();
     
                    CipherContext cc = new CipherContext(Cipher.AES_128_CBC);
                    dec = cc.Encrypt(data, key, iv);
     
                    File.WriteAllBytes(fsOut.Name, dec);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message + "\n", ex);
                }
            }

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    tu devrais essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public static void decryptFile(string sKey, string sIv, string sPathCypheredFile, string sPathFile)
            {
                // -- Place la clé de déchiffrement dans un tableau d'octets
                // ---------------------------------------------------------
                byte[] key = StringToByteArray(sKey);
     
                // -- Place le vecteur d'initialisation dans un tableau d'octets
                // -------------------------------------------------------------
                byte[] iv = StringToByteArray(sIv);
     
                try
                {
                    // -- Filestream du nouveau fichier décrypté
                    // -----------------------------------------
                    FileStream fsCrypt = new FileStream(sPathFile, FileMode.Create);
     
                    RijndaelManaged rijndael = new RijndaelManaged();
                    rijndael.BlockSize = 128;
                    rijndael.KeySize = 128;
                    rijndael.Key = key;
                    rijndael.IV = iv;
                    rijndael.Mode = CipherMode.CBC;
                    rijndael.Padding = PaddingMode.Zeros;
     
                    ICryptoTransform aesDecryptor = rijndael.CreateDecryptor(key, iv);
     
                    CryptoStream cs = new CryptoStream(fsCrypt, aesDecryptor, CryptoStreamMode.Write);
     
                    // -- FileStream du fichier crypté
                    // -------------------------------
                    FileStream fsIn = new FileStream(sPathCypheredFile, FileMode.Open);
     
                    int data;
     
                    while ((data = fsIn.ReadByte()) != -1)
                        cs.WriteByte((byte)data);
     
                    cs.Close();
                    fsIn.Close();
                    fsCrypt.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception("GTMCrypto.decryptFile : " + ex.Message + "\n", ex);
                }
            }
    		public static byte[] StringToByteArray(String hex)
    		{
    			int NumberChars = hex.Length;
    			byte[] bytes = new byte[NumberChars / 2];
    			for (int i = 0; i < NumberChars; i += 2)
    				bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    			return bytes;
    		}

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Par défaut
    Cool, ça fonctionne !
    Merci de ton aide !

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 63
    Par défaut
    Bonjour,

    Je viens de lire votre article. dans mon fichier de validation il y a une erreur qui arriver quand je me connecte voila mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public void EncryptFile(string text)
            {
                FileStream fsEcrypted = new FileStream(FileLoc, 
                    FileMode.Create, 
                    FileAccess.Write);
                DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                DES.Key = ASCIIEncoding.ASCII.GetBytes("Eus@123"); 
                DES.IV = ASCIIEncoding.ASCII.GetBytes("Eus@123");
                ICryptoTransform descencrypt = DES.CreateDecryptor();
                CryptoStream DA = new CryptoStream(fsEcrypted,
                    descencrypt,
                    CryptoStreamMode.Write);
     
                byte[] bytearrawinput = Encoding.ASCII.GetBytes(text);
     
                DA.Write(bytearrawinput, 0, bytearrawinput.Length);
                DA.Close();
     
                fsEcrypted.Close();
            }
    l'erreur est la suivante "Informations supplémentaires : La clé spécifiée n'est pas d'une taille valide pour cet algorithme." au niveau de ce code "DES.Key = ASCIIEncoding.ASCII.GetBytes("Eus@123");" le mot de passe que j'ai utilisé pour la connexion est 12314.
    Pourrais tu regarder?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de décryptage avec Rijndael
    Par kaderscream dans le forum C#
    Réponses: 4
    Dernier message: 02/06/2008, 19h56
  2. Réponses: 8
    Dernier message: 14/11/2003, 22h51
  3. Dossier ou Fichier avec ShellListView
    Par MoussDiouf dans le forum Langage
    Réponses: 6
    Dernier message: 14/06/2003, 12h33
  4. [VB6] [Réseau] Récupérer la taille d'un fichier avec inet
    Par pcpunch dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 20/02/2003, 21h38
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo