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 :

Problème Cryptage / Decryptage


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Problème Cryptage / Decryptage
    Bonjour je code un programme qui doit envoyer un fichier sur sur serveur tout en etant crypté. Sans le cryptage, j'arrive bien à envoyer et recevoir mais avec le cryptage j'ai un problème de donnée invalide...

    Il y un problème niveau de la fonction de decryptage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return tdes.CreateDecryptor(key, IV).TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
    --> Donnée invalide...

    Je suis bloqué depuis ce matin..Si qqun peut m'aider, ça serait bien cool Merci

    Fonction d'envoi

    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
    private bool sendBloc(long blocNumber, string filePath) {
                try {
                    FileStream fs = new FileStream(filePath, FileMode.Open);
                    BinaryReader br = new BinaryReader(fs);
                    fs.Position = blocNumber * settings.PacketSize;
                    byte[] byteToSend = encrypt(br.ReadBytes(settings.PacketSize));
                    //byte[] byteToSend = br.ReadBytes(settings.PacketSize);
                    Console.WriteLine(byteToSend.Length);
                    fs.Close();
     
                    TcpClient tcpC = new TcpClient(settings.DestinationAdress, settings.Port);
                    NetworkStream net = tcpC.GetStream();
                    net.Write(byteToSend, 0, byteToSend.Length);
                    net.Flush();
                    net.Close();
                    tcpC.Close();
                    return true;
                }
                catch (Exception exp) {
                    Console.WriteLine("Erreur à l'envoi du fichier " + filePath);
                    Console.WriteLine("Sur le bloc numéro " + blocNumber.ToString());
                    Console.WriteLine("Détails : " + exp.Message);
                    log("Erreur à l'envoi du bloc " + blocNumber.ToString() + " du fichier " + filePath + ". Détail : " + exp.Message, EventLogEntryType.Error); 
                    return false;
                }
            }

    Fonction de cryptage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            private byte[] encrypt(byte[] toCrypt) {
     
                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                tdes.IV = IV;
                tdes.Key = key;
                return tdes.CreateEncryptor(key, IV).TransformFinalBlock(toCrypt, 0, toCrypt.Length);
            }

    Fonction de reception :
    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
      private void receiveBloc(int blocNumber, string directoryToSave, int size) {
     
               try
               {
                   Console.WriteLine("Attente du paquet");
                   tcpL.Start();
                   TcpClient tcpC2 = tcpL.AcceptTcpClient();
                   Console.WriteLine("Reception du paquet");
                   byte[] bytes = new byte[size];
                   NetworkStream network = tcpC2.GetStream();
                   FileStream fs = new FileStream("C:\\temp\\filetoreceive" + "\\guide" + ".pdf", FileMode.OpenOrCreate);
                   BinaryReader br = new BinaryReader(network);
                   BinaryWriter bw = new BinaryWriter(fs);
                   int nByteRead = 0;
                   fs.Position = blocNumber * size;
                   byte[] bytetoreceive = null;
     
                   while ((nByteRead = network.Read(bytes, 0, size)) > 0)
                   {
                       bytetoreceive = decrypt(bytes);
                       bw.Write(bytetoreceive, 0, nByteRead);
     
     
                   }
                   network.Flush();
                   network.Close();
                   fs.Flush();
                   fs.Close();
                   br.Close();
                   bw.Close();
                   tcpC2.Close();
     
               }
               catch (Exception exp)
               {
                   Console.WriteLine("Erreur lors de la reception d'un paquet du client: " + exp.Message);
                   log("Erreur lors de la reception d'un paquet du client : " + exp.Message, EventLogEntryType.Error);
               }
           }
    Fonction de decryptage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
           private byte[] decrypt(byte[] toDecrypt) {
     
               TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
               tdes.IV = IV;
               tdes.Key = key;
               return tdes.CreateDecryptor(key, IV).TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
           }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je pense que c'est parce que tu passes toujours à la fonction decrypt un tableau de taille size, alors que quand tu arrives à la fin des données le tableau n'est pas forcément "plein" : il contient nByteRead octets et non size, mais comme tu passes le tableau entier et que tu utilises Length pour avoir le nombre d'octets, tu passes à TransformFinalBlock les derniers octets du tableau alors qu'il ne sont peut-être pas initialisés.

    2 solutions possibles :
    - tu passes nByteRead en paramètre de decrypt, et tu l'utilises à la place de toDecrypt.Length
    - tu passes une sous-partie de bytes à decrypt

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut, merci de ta réponse, j'ai essayé de passer bNyteRead ebn paramètre mais ça me fait une exception "CryptographicException" (Donnée invalide)

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'ai essayé avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                   while ((nByteRead = network.Read(bytes, 0, size)) > 0)
                   {
                       bytetoreceive = decrypt(br.ReadBytes(nByteRead));
                       bw.Write(bytetoreceive, 0, nByteRead);
    
                   }
    mais toujours la même erreur.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je pense que tu n'as pas bien compris ce que je voulais dire... modifie la fonction decrypt de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           private byte[] decrypt(byte[] toDecrypt, int length) {
               TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
               tdes.IV = IV;
               tdes.Key = key;
               return tdes.CreateDecryptor(key, IV).TransformFinalBlock(toDecrypt, 0, length);
           }
    Et utilise la comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                   while ((nByteRead = network.Read(bytes, 0, size)) > 0)
                   {
                       bytetoreceive = decrypt(bytes, nByteRead);
                       bw.Write(bytetoreceive, 0, nByteRead);
                   }

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est ce que j'avais fait...mais je me retrouve toujours avec la même erreur.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    je sais pas trop alors...
    je me demande si ce n'est pas lié à la façon d'utiliser le TripleDESCryptoServiceProvider. Tu le recrées pour chaque bloc, alors qu'à mon avis il faudrait utiliser toujours le même. Je pense que tu devrais créer le décrypteur une seule fois (pour chaque message complet à décrypter) et le réutiliser pour chaque bloc.

Discussions similaires

  1. cryptage/decryptage, comment faire?
    Par bossun dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 24/04/2008, 17h07
  2. Cryptage/Decryptage de String
    Par aswat dans le forum Sécurité
    Réponses: 12
    Dernier message: 27/08/2007, 16h05
  3. Cryptage Decryptage asymetrique
    Par bslota dans le forum Sécurité
    Réponses: 5
    Dernier message: 02/05/2007, 16h15
  4. [VB]Cryptage/decryptage
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 25/01/2006, 18h57

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