Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Crypter Fichier

    17 avril 2011 à 22:38:21

    Bonjour,

    J'ai une fonction Serialisation et Deserialisation d'un flux XML mais je voudrais les crypter pour quel sécurisé et qu'on puisse pas les lires et comprendre les informations a l'intérieur.
    J'ai cherché sur le forum mais je n'ai pas trouvé de réponses approprié a mon code . Je voudrais pas quelque chose de compliqué ,juste un fonction qui existe déjà . J'ai déjà un bout de code mais ce code me marque cette erreur quand j'esssaye :

    Le processus ne peut pas accéder au fichier 'bin\Debug\Bibliotheque.xml', car il est en cours d'utilisation par un autre processus.
    


    Pour ce code :
    Dim fStream As FileStream = File.OpenRead(FileName)
    




    Voila les fonctions :

    Sérialisation :
    Private Sub Serialisation()
     'On crée le fichier et récupère son flux
            Dim FluxDeFichier As FileStream = File.Create("Bibliotheque.xml")
            Dim Serialiseur As New XmlSerializer(GetType(List(Of Info)))
            'Serialisation et écriture
            Serialiseur.Serialize(FluxDeFichier, Liste)
            'FerMeture du fichier
            Dim objConfig As New ccinfo
            objConfig = XmlManager.XmlToObject(Of info)("Bibliotheque.xml", GetType(info))
            FluxDeFichier.Close()
        End Sub
    


    Deserialisation :
    Private Sub Deserialisation()
                 If File.Exists("Bibliotheque.bin") Then
                'On ouvre le fichier et recupere son flux
                Dim FluxDeFichier As Stream = File.OpenRead("Bibliotheque.xml")
                Dim Deserialiseur As New XmlSerializer(GetType(List(Of Info)))
                'Désérialisation et convertion de ce qu'on récupère dans le type
                Liste = Deserialiseur.Deserialize(FluxDeFichier)
                'FerMeture du flux
                FluxDeFichier.Close()
            End If
        End Sub
    


    Crypter.vb :

    Imports System
    Imports System.IO
    Imports System.Xml.Serialization
    Imports System.Collections.Generic
    Imports System.Security.Cryptography
    Imports System.Text
     
    Public Class XmlManager
        Private Const myKey As String = "Password"
     
        Public Shared Sub ObjectToXml(Of T)(ByVal objGen As T, ByVal FileName As String)
            Dim fStream As FileStream = File.Open(FileName, FileMode.OpenOrCreate)
     
            Dim DES As New DESCryptoServiceProvider()
            DES.Key = ASCIIEncoding.ASCII.GetBytes(myKey)
            DES.IV = ASCIIEncoding.ASCII.GetBytes(myKey)
     
            Dim cStream As New CryptoStream(fStream, _
                                           DES.CreateEncryptor(), _
                                           CryptoStreamMode.Write)
     
            Dim objStreamWriter As New StreamWriter(cStream)
            Dim x As New XmlSerializer(objGen.GetType)
            x.Serialize(objStreamWriter, objGen)
     
            objStreamWriter.Close()
            cStream.Close()
            fStream.Close()
        End Sub
     
        Public Shared Function XmlToObject(Of T)(ByVal FileName As String, ByVal oType As Type) As T
            Dim fStream As FileStream = File.OpenRead(FileName)
     
            Dim DES As New DESCryptoServiceProvider()
            DES.Key = ASCIIEncoding.ASCII.GetBytes(myKey)
            DES.IV = ASCIIEncoding.ASCII.GetBytes(myKey)
     
            Dim cStream As New CryptoStream(fStream, _
                                           DES.CreateDecryptor(), _
                                           CryptoStreamMode.Read)
     
            Dim objGen As T
            objGen = Activator.CreateInstance(oType)
            Dim x As New XmlSerializer(oType)
            objGen = x.Deserialize(cStream)
            cStream.Close()
            fStream.Close()
            Return objGen
        End Function
    End Class
    



    Voila merci de m'aider :)
    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2011 à 0:14:15

      L'erreur est explicite : Un fichier est ouvert dans ton application...Et tu cherche à le ré-ouvrir; opération interdite si elle n'est pas explicitement spécifiée dans les options de partage du verrou de fichier.

      Dans ta méthode Serialisation, tu ouvre un flux vers ledit fichier...Et dans cette même méthode, avant l'appel à la fermeture du flux, tu appelles ta méthode XmlToObject qui tente, elle aussi d'accéder au fichier ouvert précédemment...

      Edit : Comme solution, plutôt que de passer le nom du fichier à ouvrir dans ta méthode XmlToObject, passe directement l'objet FileStream. Vu que ta méthode XmlToObject se placera désormais dans un contexte de "méthode d'altération" (c'est à dire une méthode qui travaille avec des outils déjà ouvert et non une méthode qui travaille sur des éléments qu'elle va ouvrir elle-même), je supprimerais également les appels aux méthodes close à l'intérieur de XmlToObject. Le contrôle des données (ici, l'ouverture et la fermeture du flux vers le fichier) devra se faire en dehors de cette méthode.
      • Partager sur Facebook
      • Partager sur Twitter
        18 avril 2011 à 12:23:40

        Penser à appeler la méthode Dispose() sur un objet quand elle est disponible et que l'objet n'est plus utilisé.
        Cela permet de libérer par la suite la mémoire allouée

        Dans ton cas :
        cStream.Dispose() avant de quitter les 2 fonctions (après le Close()).
        Idem avec fStream.Dispose()

        Ca ne résoudra surement pas ton problème mais bon ... c'est une chose à faire :)
        • Partager sur Facebook
        • Partager sur Twitter
          18 avril 2011 à 12:35:24

          Merci de votre aide , mais pour le problème initial , je ne sais pas trop comment m'y prendre finalement . Je dois changer le XmlToObject en FileStream ? Et je ne sais pas comment changer le code ^^ Merci
          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2011 à 17:58:34

            Private Sub Serialisation()
               'On crée le fichier et récupère son flux
               Dim FluxDeFichier As FileStream = File.Create("Bibliotheque.xml")
               Dim Serialiseur As New XmlSerializer(GetType(List(Of Info)))
               'Serialisation et écriture
               Serialiseur.Serialize(FluxDeFichier, Liste)
               'FerMeture du fichier
               Dim objConfig As New ccinfo
               objConfig = XmlManager.XmlToObject(Of info)(FluxDeFichier, GetType(info))
               FluxDeFichier.Close()
            End Sub
            


            Public Shared Function XmlToObject(Of T)(ByVal fStream As FileStream, ByVal oType As Type) As T
                fStream.Seek(0, SeekOrigin.Begin)
                Dim DES As New DESCryptoServiceProvider()
                DES.Key = ASCIIEncoding.ASCII.GetBytes(myKey)
                DES.IV = ASCIIEncoding.ASCII.GetBytes(myKey)
             
                Dim cStream As New CryptoStream(fStream, _
                                                DES.CreateDecryptor(), _
                                                CryptoStreamMode.Read)
             
                Dim objGen As T
                objGen = Activator.CreateInstance(oType)
                Dim x As New XmlSerializer(oType)
                objGen = x.Deserialize(cStream)
                Return objGen
            End Function
            


            Ce code est juste la traduction de ce que je voulais dire.

            A mon avis, sur ces codes, tu t'es un peu mélangé les pinceaux, mais je ne m'avancerais pas sur la chose.

            Par contre, je pense dire juste en disant que tu auras d'autres exception.
            • Partager sur Facebook
            • Partager sur Twitter
              18 avril 2011 à 21:41:03

              Ah oui je comprends mieux ^^ mais j'obtiens cette erreur :

              Longueur des données à déchiffrer non valide.

              Sur cette ligne :

              objGen = x.Deserialize(cStream)'14 em ligne de la fonction XmlToObject
              


              Je ne comprends pas trop l'erreur , j'ai essayé de la résoudre mais je n'y arrive pas .
              • Partager sur Facebook
              • Partager sur Twitter
                19 avril 2011 à 11:35:07

                Un indice? Un flux de données en .NET est un objet qui peut se déplacer de manière uni-directionnelle. C'est a dire que si tu fais une lecture de 4 octets en partant de 0, ton flux avant la lecture sera à la position 0....Et ton flux après la lecture sera à la position 4.

                Si tu lis (ou écrit...Tout opération modifiant la position du flux ne pourra faire qu'avancer la position) ton flux jusqu'à la fin...Et que tu tente de lire quelque chose de plus alors qu'il n'y a plus rien, tu auras une exception.

                Le seul moyen de lire un flux déjà ouvert, c'est de le "rembobiner" grâce à la méthode Seek. Seek prend 2 arguments : Le premier, c'est la nouvelle position du flux et le deuxième, c'est l'endroit par rapport auquel je veux établir ma nouvelle position.

                Dans mon code un peu plus haut, j'ai utilisé Seek(0, SeekOrigin.Begin). Ca veut dire que je me place à la position 0 en partant du début du flux (autrement dit, j'ai rembobiné tout le flux en entier).

                Edit : Deuxième indice : J'ai oublié de rembobiner le flux dans les codes du haut.
                • Partager sur Facebook
                • Partager sur Twitter

                Problème Crypter Fichier

                × 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