Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme ne pouvant executer 2 fois la meme fonction

Algorythme de cryptage en cause ?

    19 août 2011 à 8:28:20

    Bonjour à tous

    Voilà, je désire faire une application servant d'interface aux employés afin de les aider à partager leurs connaissances. Ayant déjà commencé, je vous explique grossièrement le principe. Il y a tout d'abord la fenêtre principale où tout se déroule et où les différents onglets permettent de naviguer selon les 3 sujets et la fenêtre secondaire n'apparaissant qu'au début. Je nommerai cette fenêtre pour vous LoginWindow, parce que son utilité c'est justement de permettre aux gens de se connecter, selon un nom et un mdp. J'ouvre cette fenêtre dès le load en modal afin de ne pas permettre à l'utilisateur de se promener sans être connecté.

    Je pensais (et c'est ainsi que j'ai développé cette application, mais je suis ouvert aux autres méthodes) utiliser des fichiers .xml cryptés afin de conserver mes données. Par exemple, j'ai un fichier "DataEmployes.xml" qui contient une liste d'objets de ma classe Employe. Cette classe a 3 attributs ayant des properties get/set:
    - _Nom as String
    - _Mdp as String
    - _Status as Integer

    Ma classe marche parfaitement, pas de problème là-dessus. Tout est déjà compilé (avec mes autres classes n'ayant pas d'importance pour ce sujet) dans un dll qui est reliée à mon projet (et je peux utiliser ma dll sans problème aussi :p).

    Toutefois, afin d'éviter que des petits malins changent à leur guise le status ou les mdp du fichier "DataEmployes.xml" (puisque le programme, auquel le fichier est associé, donc celui-ci, se situe sur un serveur partagé), j'avais décidé de crypter mes fichiers .xml. J'ai cherché une fonction déjà toute-préfaite sur le web (je sais, c'est pas super, mais je voulais prendre ce temps pour d'autres choses :-° ) et j'en ai trouvé une marchant parfaitement (cryptage, décryptage). Toutefois, c'est assez lourd, puisque je dois en permanence, pour chaque action (sauf les saisies de donnée uniquement), aller décrypter mon fichier, puis le décrypter.

    Je trouve que ma méthode est vraiment lourde. Néanmoins, le problème se situe (du moins pour le moment :p ) dans ma LoginWindow. En effet, lorsque j'exécute une première fois le code (oui, il s'en vient :D ), tout marche, si j'avais rentré des mauvais identifiants, on m'affiche (toutefois après un délai me semblant un peu long, environ 1.5sec) un message disant que c'est mauvais, tout est parfait jusque là. Toutefois, la seconde fois que je clique sur le bouton confirmer, gardant les mêmes identifiants erronés, le programme fige pendant 2-3 secondes, puis la LoginWindow ferme et je rentre sans pour autant avoir de droits :S (bon, après plus aucune action ne marche, mais c'est pour le principe).

    Voici donc les fameux codes tant attendus !

    Fonctions Encrypt() et Decrypt(), prises sur le net
    Sub Encrypt1(ByVal inName As String, ByVal outName As String)
            Try
                Dim storage(4096) As Byte   'create buffer 
                Dim totalBytesWritten As Long = 8  'Keeps track of bytes written. 
    
                Dim packageSize As Integer   'Specifies the number of bytes written at one time. 
    
                'Declare the file streams. 
                Dim fin As New FileStream(inName, FileMode.Open, FileAccess.Read)
                Dim fout As New FileStream(outName, FileMode.OpenOrCreate, _
                  FileAccess.Write)
                fout.SetLength(0)
    
                Dim totalFileLength As Long = fin.Length  'Specifies the size of the source file. 
    
                'create the Crypto object 
                Dim des As New DESCryptoServiceProvider()
    
                Dim crStream As New CryptoStream(fout, _
                       des.CreateEncryptor(TheKey, Vector), CryptoStreamMode.Write)
    
                'flow the streams 
                While totalBytesWritten < totalFileLength
                    packageSize = fin.Read(storage, 0, 4096)
                    crStream.Write(storage, 0, packageSize)
                    totalBytesWritten = Convert.ToInt32(totalBytesWritten + packageSize / des.BlockSize * des.BlockSize)
                End While
    
                crStream.Close()
                fin.Close()
                fin.Dispose()
                fout.Close()
                fout.Dispose()
    
            Catch e As Exception
                MsgBox(e.Message)
            End Try
    
        End Sub
    
    
        '//////// DECRYPTION PROCEDURE 
        ' This procedure differs from the encryption procedure only in the substitution of 
        'des.CreateDecryptor for des.CreateEncryptor. Also, the error message is different. 
        Sub Decrypt1(ByVal inName As String, ByVal outName As String)
    
            Try
    
                Dim storage(4096) As Byte
                Dim totalBytesWritten As Long = 8
                Dim packageSize As Integer
                Dim fin As New FileStream(inName, FileMode.Open, FileAccess.Read)
                Dim fout As New FileStream(outName, FileMode.OpenOrCreate, _
                  FileAccess.Write)
                fout.SetLength(0)
                Dim totalFileLength As Long = fin.Length
    
    
                Dim des As New DESCryptoServiceProvider()
                Dim crStream As New CryptoStream(fout, _
                  des.CreateDecryptor(TheKey, Vector), CryptoStreamMode.Write)
    
                Dim ex As Exception
    
                While totalBytesWritten < totalFileLength
                    packageSize = fin.Read(storage, 0, 4096)
                    crStream.Write(storage, 0, packageSize)
                    totalBytesWritten = Convert.ToInt32(totalBytesWritten + packageSize / des.BlockSize * des.BlockSize)
                End While
    
                crStream.Close()
                fin.Close()
                fin.Dispose()
                fout.Close()
                fout.Dispose()
    
            Catch e As Exception
                MsgBox(e.Message & "Please ensure that you are using the correct password")
            End Try
    
        End Sub
    



    Classe FormLogin (LoginWindow pour les intimes ^^ )
    Imports System.IO
    Imports System.Xml.Serialization
    
    Public Class FormLogin
    
        Dim loginAccepte As Boolean = False
    
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If loginAccepte = False Then
                Dim reponse As Integer = MsgBox("Vous ne pouvez entrer sans identifiant. Désirez-vous quitter l'application ?", 36)
                If reponse = 6 Then
                    FormMain.Close()
                Else
                    e.Cancel = True
                End If
            Else
                Me.Dispose()
            End If
        End Sub
    
    
        Private Sub bt_envoyer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_envoyer.Click
    
            Dim username As String = Me.txtbox_identifiant.Text
            Dim mdp As String = Me.txtbox_mdp.Text
    
    
    
    
            If File.Exists("DataEmployes.xml") Then
                FormMain.decrypter("DataEmployes.xml")
                Dim FluxDeFichier2 As Stream = File.OpenRead("DataEmployes.xml")
                Dim Deserialiseur As New XmlSerializer(GetType(List(Of WillcleanDLL.WillcleanDLL.Employe)))
                'Désérialisation et convertion de ce qu'on récupère dans le type "Employe"
                FormMain._ListeEmployes = Deserialiseur.Deserialize(FluxDeFichier2)
                'Fermeture du flux
                FluxDeFichier2.Close()
            Else
                'Erreur Critique !
                MsgBox("Fichier de données manquant !", MsgBoxStyle.Critical, "Erreur critique")
                Application.Exit()
            End If
    
            Dim correct As Boolean = False
    
            For Each employeTemp In FormMain._ListeEmployes
                If employeTemp.Nom = username And employeTemp.Mdp = mdp Then
                    correct = True
                    InfosAccepter(employeTemp.Status)
                End If
            Next
    
            If correct = False Then
                MsgBox("L'identifiant entré et/ou le mot de passe sont erronés !", 48, "Erreur")
            End If
    
        End Sub
    
    
        Sub InfosAccepter(ByVal status As Integer)
    
            loginAccepte = True
            FormMain.EmployeCourant.Nom = Me.lbl_identifiant.Text ' Assigne le nom
            FormMain.EmployeCourant.Mdp = Me.lbl_mdp.Text ' Assigne le mdp
    
            FormMain.EmployeCourant.Status = status ' Assigne le status
    
            Me.Close() ' On ferme la fenetre de login
        End Sub
    


    Classe FormMain (pas au complet, seulement les bouts pouvant changer quelque chose dans cette péripétie épique :lol: )
    Public Class FormMain
    
    
        Public _ListeEmployes As List(Of WillcleanDLL.WillcleanDLL.Employe)
        Public _ListeClients As List(Of WillcleanDLL.WillcleanDLL.Client)
        Public _ListeAppels As List(Of WillcleanDLL.WillcleanDLL.Appel)
        Public _ListeQuestions As List(Of WillcleanDLL.WillcleanDLL.Question)
    
        Public EmployeCourant As New WillcleanDLL.WillcleanDLL.Employe
    
        ' Status employe
        ' 000   Ne peut rien faire, par défaut
        ' 050   Employe normal, tous les droits sauf admin
        ' 090   Admin ne pouvant créer d'autre admins
        ' 100   Root Admin, peut tout faire
    
    
        Public TheKey(7) As Byte
        Private Vector() As Byte = {&H87, &H42, &HF6, &H51, &H4A, &H50, &H24, &H81}
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Me.Show() ' Affiche 
    
            _ListeEmployes = New List(Of WillcleanDLL.WillcleanDLL.Employe)
    
            TheKey(0) = 124
            TheKey(1) = 54
            TheKey(2) = 92
            TheKey(3) = 127
            TheKey(4) = 83
            TheKey(5) = 60
            TheKey(6) = 7
            TheKey(7) = 54
    
    
    
            Dim tabPageSave As TabPage = Nothing
            Dim index As Integer = 5
            tabPageSave = Me.MainTabControl.TabPages(index)
            Me.MainTabControl.TabPages.Remove(tabPageSave)
    
    
            SeConnecter() ' Demande login + mdp afin de connaitre le status de l'employe
            MsgBox(EmployeCourant.Status)
            If EmployeCourant.Status > 90 Then ' Si l'employe est un admin
                MainTabControl.TabPages.Insert(index, tabPageSave) ' On donne accès à l'onglet admin
            End If
        End Sub
    
        Private Sub SeConnecter()
            Dim FenetreLogin As New FormLogin
            FenetreLogin.ShowDialog()
        End Sub
    
    End Class
    



    Crypter et Decrypter :euh:
    Public Sub crypter(ByVal fichier As String)
            Encrypt1(fichier, "temp.xml")
            Thread.Sleep(1000)
            File.Delete(fichier)
            File.Copy("temp.xml", fichier)
            File.Delete("temp.xml")
        End Sub
    
    
    
        Public Sub decrypter(ByVal fichier As String)
            Decrypt1(fichier, "temp.xml")
            Thread.Sleep(1000)
            File.Delete(fichier)
            File.Copy("temp.xml", fichier)
            File.Delete("temp.xml")
    
        End Sub
    


    Merci à tous de votre aide :)

    PS Désolé du pavé, je désirais être concis :D

    Edit: Je rajoute les fonctions crypter et decrypter, servant à crypter le fichier et afficher l'output dans le fichier lui-même au lieu d'une sortie dans un autre fichier, je présume que ça aide pas trop la vitesse d'exécution ^^
    • Partager sur Facebook
    • Partager sur Twitter
      19 août 2011 à 10:55:34

      Bonjour lolown :)

      J'ai regardé en diagonale ton problème, certaines choses me choquent, mais bon ce n'est que mon point de vue :) .


      Tout d'abord, le stockage.

      Citation

      puisque le programme, auquel le fichier est associé, donc celui-ci, se situe sur un serveur partagé


      Citation

      (toutefois après un délai me semblant un peu long, environ 1.5sec



      Je pense que tu devrais t'orienter vers la base de données. D'une part parce que c'est situé sur un serveur partagé, et d'autre part, pour le temps d'exécution. Imagine tu as 2000 Employés, tu va faire 2000 itérations avec ton fichier XML, et 1 requête avec ta BDD, le choix est vite fait je trouve :p .

      Ensuite, une partie de l'algo.

      For Each employeTemp In FormMain._ListeEmployes
                  If employeTemp.Nom = username And employeTemp.Mdp = mdp Then
                      correct = True
                      InfosAccepter(employeTemp.Status)
                  End If
              Next
      
              If correct = False Then
                  MsgBox("L'identifiant entré et/ou le mot de passe sont erronés !", 48, "Erreur")
              End If
      


      Personnellement j'aurais pas fait comme ça. J'aurais plutôt utilisé un While, avec deux conditions d'arrêt : la fin des employés et la variable correct. Car le code part dans tout les sens (il va dans une procédure et ferme le formulaire alors que la boucle n'est pas terminée) et ça me choque, même si ça fonctionne.

      Ensuite, ton souci.

      Je n'ai pas trop regardé donc je ne sais pas la raison qui fait que le formulaire se ferme au deuxième, mais regarde :

      SeConnecter() ' Demande login + mdp afin de connaitre le status de l'employe
              MsgBox(EmployeCourant.Status)
              If EmployeCourant.Status > 90 Then ' Si l'employe est un admin
                  MainTabControl.TabPages.Insert(index, tabPageSave) ' On donne accès à l'onglet admin
              End If
      


      Tu ne fais pas de test pour savoir s'il est connecté ou non, non? Donc cela est normal de pouvoir naviguer dans l'appli sans être connecté.

      Voilà :)
      • Partager sur Facebook
      • Partager sur Twitter
        20 août 2011 à 2:01:53

        Tout d'abord, merci de ta réponse

        Effectivement, je crois que le stockage est pitoyable. J'aimerais me diriger vers une base de donnée si possible. Quel imports me conseilles-tu pour cela ?

        Ensuite, lorsque tu dis une partie de l'algo, ce n'est pas vraiment celui dont je parlais, le vrai algorythme, c'est encrypt() et decrypt() ( utilisés par crypter() et decrypter() . Toutefois, tu as effectivement raison, je devrais rajouter la condition qui regarde si correct = true... Sinon je continue mes itérations même après avoir trouvé l'identifiant...

        Puis, pour la vérification de si la personne est connectée ou non. Je ne compte pas faire de vérification outre-mesure pour l'instant, puisque lors de l'ouverture du programme, il est déconnecté et lorsqu'il quitte celui-ci, il devient nécessairement déconnecté. De plus, il n'existera pas de fonction déconnexion. Donc, la LoginWindow ne sera utilisée qu'une fois. D'où l'inutilité de demander si l'utilisateur est déjà connecté.

        Lorsque tu dis qu'il peut naviguer sans être connecté. Non, puisque la fonction SeConnecter() crée la FormLogin de façon modale, empêchant ainsi l'utilisateur d'utiliser la fenêtre principale tant que la FormLogin ne s'est pas fermée.

        Bref:

        - J'aimerais savoir si quelqu'un a des suggestions de base de donnée et les imports qui vont avec
        - Mon problème reste toujours non-résolu pour l'instant :S

        Merci beaucoup de ta réponse :D
        • Partager sur Facebook
        • Partager sur Twitter
          23 août 2011 à 9:50:44

          Bonjour,

          En faisant du débogage pas à pas, est-ce qu'une exception est levée lorsque tu clique une seconde fois sur le bouton "Confirmer"

          Tu peux utilisée n'importe quel base de données après l'important étant de crypter les informations tel que le mot de passe dans ta base. Ensuite tu peux stocké ces informations dans une variables dite de "session".






          • Partager sur Facebook
          • Partager sur Twitter
          Ceci est une signature
            23 août 2011 à 18:04:45

            Merci de ta réponse. Finalement, un seul clic sur le bouton confirmer (si on laisse 2-3 secondes au programme) suffit pour faire "bogguer" l'application et fermer (par erreur du programme) la FormLogin. Ainsi, voici les deux exceptions générées lors du clic sur le bouton "Confirmer". Si on pouvait juste me préciser comment régler les problèmes reliés à ceux-ci, ce serait parfait :)

            Une exception de première chance de type 'System.Security.Cryptography.CryptographicException' s'est produite dans mscorlib.dll
            Une exception de première chance de type 'System.IO.IOException' s'est produite dans mscorlib.dll


            Sinon, je crois que je vais me lancer dans SQL, ai-je besoin de télécharger quelque chose pour pouvoir créer la base de donnée vide avec les champs ?
            • Partager sur Facebook
            • Partager sur Twitter
              25 août 2011 à 22:21:21

              Est-ce que quelqu'un a une idée de la provenance du bug grâce à ces deux exceptions levées ?
              Ou peut encore répondre à mon autre question sur SQL
              • Partager sur Facebook
              • Partager sur Twitter
                26 août 2011 à 10:53:01

                Je n'ai pas lu le pavé du premier post, je me base sur les exceptions indiquées ici, le titre du fil et une portion de code survolée vite fait.

                Citation : lolown

                Une exception de première chance de type 'System.Security.Cryptography.CryptographicException' s'est produite dans mscorlib.dll
                Une exception de première chance de type 'System.IO.IOException' s'est produite dans mscorlib.dll


                Sous les systèmes Windows, par défaut, quand tu ouvre un fichier, le système place un verrou qui associe le fichier en question au nom du processus qui l'a ouvert. C'est notamment pour ça que, dans la plupart des cas, quand tu ouvre un document avec un logiciel, ledit document ne peut plus être supprimé tant qu'on a pas explicitement fermé le document et/ou le logiciel qui l'a ouvert.

                Ceci est volontairement fait pour éviter les accès concurrentiels à un fichier (un soft A ouvre le fichier X, un soft B ouvre le fichier X. Soft A modifie le fichier X, soft B (si développé sans tenir compte de ce cas) ne sait pas que fichier X à été modifié. Si soft B modifie fichier X et que soft B sauvegarde fichier X, les modifications apportées par soft A sont perdues)

                Si, lors de ta conception logicielle, tu estime qu'un accès concurrentiel à ton fichier n'est pas gênant, tu peux configurer les droits de partage d'accès au fichier :
                FileStream tonFlux = new FileStream("C:\TonFichier.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                // ..... Ou alors
                FileStream tonFlux = File.Open("C:\TonFichier.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                


                Les documentations :
                -FileMode
                -FileAccess
                -FileShare

                Citation : lolown

                Sinon, je crois que je vais me lancer dans SQL, ai-je besoin de télécharger quelque chose pour pouvoir créer la base de donnée vide avec les champs ?


                En dehors de la base de données en question et d'un éventuel connecteur, non.

                Niveau base de données, si tu as le choix :
                -Prend une SQL Server 2008 Express (Gratuit) si tu peux avoir une limite de données stockées de 4Go (+ les restrictions imposées niveau multi-core et fonctionnalités avancées de SQL Server)
                -Prend une SQL Server 2008 R2 si ton entreprise en a les moyens (plus de limite de stockage + fonctionnalités avancées...Le problème, c'est qu'une licence coute un bras)
                Dans ces deux cas, tu peux designer ta base de données grâce au designer ADO.NET Entity Framework 4 intégré dans Visual Studio 2010 en ayant accès à (presque) toutes les fonctionnalités de BdD offerte par la base.

                Tu peux utiliser d'autres base de données (MySQL, Oracle...) mais il te faudra alors trouver un connecteur adapté (ODBC, OLE DB ou connecteur .NET directement) et pour ma part, je ne saurais pas te dire si les fonctionnalités offerte par la base de données seront disponibles dans ADO.NET EF4.

                Tout ça, c'est si tu veux utiliser ADO.NET EF4 bien sur ^^ . Cette technologie fait du mappage objet relationnel sur une base de données : Elle te crée automatiquement les classes reflétant le contenu de ta base de données. Grâce à ça, tu ne fais plus de SQL.

                Si tu ne veux pas utiliser ADO.NET EF4, toutes les problématique énoncées ci-dessus ne s'appliquent plus ^^ => N'importe quelle BdD fera l'affaire et les fonctionnalités disponibles en C# dépendront un peu du connecteur mais surtout de tes connaissances en SQL.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 août 2011 à 20:05:03

                  Merci beaucoup de ta réponse.
                  J'ai essayé de changer mes arguments, spécialement l'argument FileShare, mais le problème persiste. Ainsi, j'aurais une question à ce propos. Dois-je changer mes FileRead pour des File.Open afin de pouvoir utiliser ces arguments ou FileRead peut y accéder n'importe quand aux fichiers ?

                  Ensuite, après déboggage maison à coup de MsgBox("DEBUG XX"), j'ai trouvé d'où venaient mes exceptions. La première (puisque le programme, pour le moment à cause de ses erreurs prématurées, ne permet pas encore d'accéder à la fonction crypt() ) est dans la fonction decrypt(). La voici donc, j'y indique l'erreur

                  Sub Decrypt1(ByVal inName As String, ByVal outName As String)
                  
                          Try
                  
                              Dim storage(4096) As Byte
                              Dim totalBytesWritten As Long = 8
                              Dim packageSize As Integer
                              Dim fin As New FileStream(inName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
                              Dim fout As New FileStream(outName, FileMode.OpenOrCreate, _
                                FileAccess.Write, FileShare.ReadWrite)
                              fout.SetLength(0)
                              Dim totalFileLength As Long = fin.Length
                  
                              Dim des As New DESCryptoServiceProvider()
                              Dim crStream As New CryptoStream(fout, _
                                des.CreateDecryptor(TheKey, Vector), CryptoStreamMode.Write)
                  
                              While totalBytesWritten < totalFileLength
                                  packageSize = fin.Read(storage, 0, 4096)
                                  crStream.Write(storage, 0, packageSize)
                                  totalBytesWritten = Convert.ToInt32(totalBytesWritten + packageSize / des.BlockSize * des.BlockSize)
                              End While
                  
                              MsgBox("DEBUG 36") ' On voit ceci apparaître à l'écran
                              crStream.Close() ' Erreur provient sûrement d'ici
                              MsgBox("DEBUG 37") ' On ne voit pas le DEBUG 37 apparaître
                              fin.Close()
                              fin.Dispose()
                              fout.Close()
                              fout.Dispose()
                  
                  
                          Catch e As Exception
                              'MsgBox(e.Message & "   / error....") ' Ceci nous sort: Données incorrectes.
                          End Try
                  
                      End Sub
                  


                  Deuxième exception lever dans la fonction decrypter. Ici, on voit clairement que c'est comme tu l'as dit, à cause d'un accès concurrentiel, comme l'indique le message de mon catch. Celui-ci indique qu'on ne peut accéder au fichier blablabla.xml car il est présentement utilisé par un autre processus.

                  Public Sub decrypter(ByVal fichier As String)
                          Decrypt1(fichier, "temp.xml")
                          Thread.Sleep(1000)
                          Try
                              File.Delete(fichier) ' Erreur ici, trouvée avec les MsgBox("Debug XX")
                          Catch e As Exception
                              MsgBox(e.Message & "  / Error2")
                          End Try
                          File.Copy("temp.xml", fichier)
                          File.Delete("temp.xml")
                      End Sub
                  


                  Merci pour votre aide future

                  Ps: Merci beaucoup pour tes réponses sur le SQL, j'irai approfondir cela, toutefois, il faut que tu saches que je programme en Vb.Net, donc je ne sais pas si j'ai accès aux mêmes fonctionnalités puisque même si j'ai Visual Studio 2010 .Net, celui-ci diffère un peu de celui ajusté au C#
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 août 2011 à 1:00:21

                    Citation : lolown

                    Deuxième exception lever dans la fonction decrypter. Ici, on voit clairement que c'est comme tu l'as dit, à cause d'un accès concurrentiel, comme l'indique le message de mon catch. Celui-ci indique qu'on ne peut accéder au fichier blablabla.xml car il est présentement utilisé par un autre processus.


                    J'suis pas expert en cryptographie... Du coup, je pourrais pas te donner d'aide précise.

                    Je peux juste te dire que certaines des méthodes de chiffrement fonctionnent par bloc, c'est-à-dire que pour pouvoir chiffrer des données, il te faut un minimum d'octet avant de pouvoir appliquer les fonctions mathématique permettant de chiffrer lesdites données. Par exemple, si ta méthode de chiffrement est configurée pour travailler avec des blocs de 128octets, il te faudra obligatoirement un minimum de 128octets avant que la méthode ne puisse chiffrer correctement tes données.

                    Évidemment, toutes les données à chiffrer ne sont pas au nombre d'un multiple de l'une des tailles de blocs supportée par ta méthode de chiffrement...C'est pour ça que les implémentations proposées en .NET te proposent également une méthode de remplissage (tu as le choix entre des 0 ou des données aléatoire il me semble). Par exemple, si tu as configuré l'outil de chiffrement pour travailler avec des blocs de 128octets et que tu n'as que 90octets à chiffrer, en activant le remplissage de 0, tu auras tes 90octets suivis de 38 0 avant que le chiffrement ne soit appliqué. Pareil, si tu as 250octets, tu auras donc 2 blocs : Le premier de 128octets et le second de 122octets + 6 0.

                    Ceci est valable lors du chiffrement...Mais aussi lors du déchiffrement des données. L'erreur que tu obtiens peut donc provenir:
                    -D'une méthode de remplissage des blocs mal configurée
                    -D'une clé de déchiffrement (Key) invalide (la clé de déchiffrement doit être la même que celle qui a servi à chiffrer les données...Assures-toi de ce point)
                    -D'un vecteur d'initialisation (IV) invalide (le vecteur d'initialisation de déchiffrement doit être le même que celui qui a servi à chiffrer les données...Assures-toi de ce point également)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 août 2011 à 1:39:31

                      Merci de ta réponse.

                      Pour le moins, je suis sûr que ma key et que mon vector d'initialisation sont les mêmes pour le cryptage et le décryptage :D. Selon ton explication, l'erreur lors de crStream.Close() serait due à un bloc de données non-termine ? Si c'est bien le cas, je ne sais malheureusement pas comment résoudre cela, je vais peut-être aller faire un tour du côté de la doc de CryptoStream. Suivant ce cours logique, la cause de l'erreur de monFile.Delete(fichier) serait le résultat de la faute précédante, puisqu'en effet, la fonction Decrypt, ayant eu une erreur avant de pouvoir exécuter les close(), n'a pas pu fermer adéquatement le fichier et libérer les ressources, m'autorisant donc à détruire le fichier.

                      Donc, si quelqu'un pouvait confirmer tout cela, et en même temps préciser comment réparer l'erreur de ma fonction decrypt, ce serait fantastique.

                      Merci encore de ta réponse Nisnor :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 août 2011 à 13:04:53

                        Citation : lolown

                        Selon ton explication, l'erreur lors de crStream.Close() serait due à un bloc de données non-termine ?


                        J'crois que j'ai un peu halluciné dans mon explication précédente. Je fais référence au mode de chiffrement...Mais je n'ai pas vu dans les documentations de quelconque allusion au remplissage des blocs finaux. Oubli ce que j'ai dis donc.

                        Citation : lolown

                        Suivant ce cours logique, la cause de l'erreur de monFile.Delete(fichier) serait le résultat de la faute précédante, puisqu'en effet, la fonction Decrypt, ayant eu une erreur avant de pouvoir exécuter les close(), n'a pas pu fermer adéquatement le fichier et libérer les ressources, m'autorisant donc à détruire le fichier.


                        C'est exactement ça :D. Quand tu as un code qui peut planter avant la fin normale de celui-ci et que tu dois quand même exécuter d'autres morceaux de code, tu peux rajouter un bloc finally après le dernier bloc catch. Le bloc finally sera exécuté quoiqu'il arrive (exception ou pas)...Utile pour contrer ces cas de figure ou pour faire une méthode qui retourne des données, le bloc finally étant quand même exécuté, même en cas d'atteinte d'une ligne "return monResult;".

                        Pour l'erreur de chiffrement...Les données déchiffrées sont-elles non-vide? Si tu tente d'appliquer un couplé Key/IV sur un bloc de donnée vide, le problème reste le même que si tu tentais d'appliquer le mauvais couple Key/IV sur un bloc de données non-vide.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Programme ne pouvant executer 2 fois la meme fonction

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown