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 :

cryptage assez lent


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut cryptage assez lent
    Bonjour.

    Je réalise une sécurisation de fichier (principalement des fichiers Word).
    Pour ce faire je les crypt avec la méthode Triple des.

    J'ai fait mes tests, tout va bien, ça tourne.

    Par contre, lorsque j'ai commencé à tester avec des fichiers un peu plus gros
    , le cryptage est d'une lenteur incroyable. (près de 1 min pour un fichier de 750 ko).

    Je change de méthode en prenant Rijndael, qui est aparement plus rapide.
    Avec une clef de 24 caractere j'arrive à 34 sec (ce qui est à mon gout beaucoup trop long).

    Il me reste encore l'option du Rijndael avec une clef à 16 char, mais bon ... vu que la durée semble augmenté de façon exponentiel, je me dit que ça ne vas pas changer grand chose (surtout si je dois manipuler des fichier 5Mo par exemple).

    Je me demande donc si je n'ai pas loupé quelque chose.
    Le temps me semble vraiment beaucoup trop long pour un cryptage.

    je vous link quand meme une des méthodes utilisé.
    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
    public void EncryptData(String FileIn, String FileOut, byte[] Key, byte[] IV)
            {
     
                //Create the file streams to handle the input and output files.
     
                FileStream ofsi = new FileStream(FileIn, FileMode.Open, FileAccess.Read);
     
                FileStream ofso = new FileStream(FileOut, FileMode.Create, FileAccess.Write);
                ofso.SetLength(0);
     
                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                CryptoStream encStream = new CryptoStream(ofso, tdes.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
                RijndaelManaged tdes2 = new RijndaelManaged();
                CryptoStream encStream2 = new CryptoStream(ofso, tdes.CreateEncryptor(Key,IV), CryptoStreamMode.Write);
     
                try
                {
                    //Create variables to help with read and write.
                    byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
                    long rdlen = 0;              //This is the total number of bytes written.
                    long totlen = ofsi.Length;    //This is the total length of the input file.
                    int len;                     //This is the number of bytes to be written at a time.
                   Console.WriteLine("Encrypting...");
     
                    while (rdlen < totlen)
                    {
                        len = ofsi.Read(bin, 0, 100);
                        encStream.Write(bin, 0, len);
                        rdlen = rdlen + len;
                        Console.WriteLine("{0} bytes processed", rdlen);
                    }
                }
    Le probleme ne pourrait il pas venir du fait que je fais du cryptage de fichier en fichier, alors que de passer par des tableau de byte par exemple serait plus rapide ?.. enfin je sais pas :/ mais j'aimerai bien avoir un élément de réponse car je pense que cela est vraiment beaucoup trop lent, et je me demande si le probleme vient de la méthode de crypto oubien d'ailleur :/

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Utilise un buffer plus grand (4096 ou 8192 par exemple)
    100 c'est beaucoup trop petit, et c'est pas une valeur ronde (enfin, pour un humain oui, mais pas pour un processeur )

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    Salut.

    Merci pour ta réponse je vais tester, mais ...


    Je me suis déjà posé la question de savoir si le pb ne venais pas de là, et je faisait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int data;
     
                    while ((data = ofsi.ReadByte()) != -1)
                    {
                        encStream.WriteByte((byte)data);
                    }
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (rdlen < totlen)
                    {
                        len = ofsi.Read(bin, 0, 100);
                        encStream.Write(bin, 0, len);
                        rdlen = rdlen + len;
                        Console.WriteLine("{0} bytes processed", rdlen);
                    }
    Et le résultat était le meme.

    Enfin je vais test quand meme, je te tiens au courant.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    bon bah j'ai mis 4096. Le temps que cela prend est exactement le meme (34 sec à peu près) ...

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Bizarre... pourtant il n'y a rien qui me choque dans ton code (à part le RijndaelManaged et le 2e CryptoStream qui ne servent à rien).

    Ce qui est bizarre, c'est que si je fais le test chez moi avec un code similaire, c'est quasiment instantané... Voilà 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
    TripleDES tdes = TripleDES.Create();
    Console.WriteLine("Taille de la clé : {0}", tdes.KeySize);
    Stopwatch sw = new Stopwatch();
    sw.Start();
    using(FileStream fsin = File.OpenRead(inputFile))
    using(FileStream fsout = File.OpenWrite(outputFile))
    {
        Console.WriteLine("Taille du fichier d'entrée : {0}", fsin.Length);
        CryptoStream cstream = new CryptoStream(fsout, tdes.CreateEncryptor(), CryptoStreamMode.Write);
        byte[] buffer = new byte[4096];
        int nRead = 0;
        while ((nRead = fsin.Read(buffer, 0, buffer.Length)) > 0)
        {
            cstream.Write(buffer, 0, nRead);
        }
    }
    sw.Stop();
    Console.WriteLine("Temps de traitement : {0}", sw.Elapsed);
    Résultat :
    Taille de la clé : 192
    Taille du fichier d'entrée : 621981
    Temps de traitement : 00:00:00.0330157
    Soit 33ms pour un fichier de 600ko
    J'ai aussi fait le test avec un fichier de 5Mo, ça a pris 250ms

    Essaie d'ajouter un Stopwatch dans ta méthode pour voir si c'est vraiment ça qui prend du temps...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    33 ms O.O


    Heu je sais pas à quoi ça sert le stopwatch, mais je vais essayer parceque c'est la seule vrai différence :o

    Je test ça desuiste !

    Merci beaucoup.

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Citation Envoyé par rours Voir le message
    Heu je sais pas à quoi ça sert le stopwatch, mais je vais essayer parceque c'est la seule vrai différence :o
    Le Stopwatch est un chronomètre, pour mesurer le temps d'exécution du code. Ca ne changera rien aux performances...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    En effet ça change rien au performance :/

    Je ne sais pas pourquoi, mais j'ai une erreur sur le vecteur (IV) si j'essai de faire exactement comme toi.

  9. #9
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Tu as quelle version de Windows au fait ? Les implémentations *CryptoServiceProvider utilisent un service du système pour le cryptage, si ça se trouve le problème est lié à ton OS (mais ce serait bizarre...)

    J'ai testé avec ton code, à une différence près : je n'ai pas spécifié la clé et l'IV, j'ai laissé le TripleDESCryptoServiceProvider les générer.

    Résultat des courses : entre 50 et 100ms. Si je prends un buffer de 4096 je retombe sur le même temps qu'avec mon code.

    Donc ça semble lié à ta machine... elle est peut-être très lente

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    re.

    En fait le probleme est corrigé, j'ai à peu pres les mème temps que toi.

    Le petit soucis est que j'ai plusieurs actions qui sont assez longues, et l'une d'entre elle m'a induit en erreur.

    Cela dit, un buffer plus gros 4092 c'est plus éfficace :p

    j'ai mis résolu.

    J'ai un autre pb à gérer maintenant

    Merci pour le coup de main.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/01/2013, 21h06
  2. Réseau mixte XP - 7 assez lent
    Par sebaaas dans le forum Windows 7
    Réponses: 1
    Dernier message: 15/10/2011, 16h52
  3. Requête assez lente, besoin d'optimisation
    Par Marco94 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/02/2011, 15h48
  4. Réponses: 39
    Dernier message: 01/11/2010, 15h42
  5. rs.next() + rs.getString assez lent
    Par vain_mich dans le forum JDBC
    Réponses: 4
    Dernier message: 30/07/2008, 17h59

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