COMMENT FAIRE : Crypter et décrypter un fichier à l'aide de Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 301070 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F301070
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article montre comment utiliser les classes de cryptographie fournies par Microsoft .NET Framework pour crypter un fichier texte afin de le rendre illisible, puis décrypter ces informations pour qu'elles reprennent leur format d'origine.

Configuration requise

La liste suivante indique le matériel, les logiciels, l'infrastructure réseau et les Service Packs dont vous avez besoin :
  • Microsoft Windows 2000 Professionnel, Windows 2000 Server, Windows 2000 Advanced Server ou Windows NT 4.0 Server
  • Microsoft Visual Studio .NET

Cryptage et décryptage

L'espace de noms System.Security.Cryptographic dans Microsoft .NET Framework propose un éventail d'outils pour aider au cryptage et au décryptage. La classe CryptoStream est l'une des nombreuses classes fournies et elle est conçue pour crypter ou décrypter le contenu pendant qu'il est transmis en flux dans un fichier.

Pour crypter un fichier, procédez comme suit :
  1. Ouvrez Visual Studio .NET.
  2. Créez une application console dans Microsoft Visual Basic .NET. Visual Basic .NET crée un Module ainsi qu'une procédure Main() vide.
  3. Utilisez l'instruction Imports sur les espaces de noms System, System.Security, System.Security.Cryptography, System.Text et System.IO afin de ne pas avoir à rédiger de déclaration à partir de ces espaces de noms ultérieurement dans votre code. Vous devez utiliser ces instructions avant toute autre déclaration.
    Imports System
    Imports System.IO
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Text
  4. Ajoutez une constante à votre classe ou module, qui représentera la clé secrète pour le cryptage/décryptage.
    'Doit correspondre à 64 bits, 8 octets.
    Private Const sSecretKey As String = "Password"
  5. Créez une méthode au sein de votre classe, nommée EncryptFile, avec trois paramètres : sInputFile, sOutputFile et sKey (la clé secrète utilisée pour crypter et décrypter le fichier).
        Sub EncryptFile(ByVal sInputFilename As String, _
                       ByVal sOutputFilename As String, _
                       ByVal sKey As String)
        End Sub
  6. Dans la procédure EncryptFile, créez des objets d'entrée et de sortie FileStream pour traiter la lecture et l'écriture des fichiers cibles.
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
  7. Déclarez une instance de la classe DESCryptoServiceProvider, laquelle représente la technologie de cryptage et de décryptage réelle à utiliser sur les fichiers. À ce stade, vous pouvez créer un fournisseur différent si vous préférez utiliser RSA ou une autre technique cryptographique.
    Dim DES As New DESCryptoServiceProvider()
  8. Le fournisseur cryptographique doit être fourni avec la clé secrète sous la forme d'un tableau d'octets. L'espace de noms System.Text fournit une fonction pratique, GetBytes(), qui prend une chaîne et renvoie un tableau d'octets, dans le cadre de ses fonctions de codage. La taille de la clé est différente pour chaque technique cryptographique ; DES prend une clé de 64 bits, ce qui équivaut à 8 octets ou 8 caractères.

    Si vous n'indiquez pas de clé, le fournisseur en génère une de façon aléatoire, ce qui permet de crypter un fichier sans fournir le moyen de le décrypter. Notez que vous devez également fournir le vecteur d'initialisation ; cette valeur est utilisée lors du cryptage et, comme la clé, elle est générée de façon aléatoire si vous ne fournissez pas ce vecteur. Étant donné qu'il doit s'agir du même pour le cryptage et le décryptage, il ne serait pas utile de le générer de façon aléatoire.
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
  9. Créez une instance de la classe CryptoStream, en utilisant le fournisseur cryptographique pour obtenir un objet de cryptage (CreateEncryptor) et l'objet de sortie existant FileStream comme partie intégrante du constructeur.
    Dim cryptostream As New CryptoStream(fsEncrypted, _
                                         desencrypt, _
                                         CryptoStreamMode.Write)
  10. Pour finir, lisez le fichier d'entrée et écrivez-le dans le fichier de sortie qui passe par l'intermédiaire de l'objet CryptoStream, où il est crypté à l'aide de la clé que vous avez fournie.
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
  11. Créez une méthode nommée DecryptFile. Le processus de décryptage est très proche du processus de cryptage, si ce n'est que DecryptFile présente deux différences principales par rapport à la procédure EncryptFile. Pour commencer, CreateDecryptor est utilisé à la place de CreateEncryptor lors de la création de l'objet CryptoStream, spécifiant la façon dont l'objet sera utilisé. Ensuite, lors de l'écriture du texte décrypté dans le fichier de destination, l'objet CryptoStream est désormais le flux source et non plus le flux de destination.
    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)
    
        Dim DES As New DESCryptoServiceProvider()
        'Une clé de 64 bits et un vecteur d'initialisation sont requis pour ce fournisseur.
        'Définit la clé secrète pour l'algorithme DES.
        DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
        'Définit le vecteur d'initialisation.
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    
        'crée un flux de fichier pour lire le fichier crypté de retour
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'crée un décrypteur DES à partir de l'instance DES
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        'crée un flux de cryptage, défini pour lire et effectuer une transformation 
        de décryptage DES sur les octets entrants
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        'imprime le contenu du fichier décrypté
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub
  12. Ajoutez des lignes à la procédure Main() pour appeler EncryptFile et DecryptFile.
    Public Sub Main()
        EncryptFile("c:\temp\test.txt", _
                        "c:\temp\Encrypted.txt", _
                        sSecretKey)
        DecryptFile("c:\temp\Encrypted.txt", _
                    "c:\temp\Decrypted.txt", _
                    sSecretKey)
    End Sub
  13. Enregistrez l'application, puis exécutez-la en vous assurant que le chemin utilisé pour le nom du fichier d'entrée pointe vers un fichier existant (et pas trop important).

Vérification du bon fonctionnement

Testez ce code avec un fichier texte (.txt) pour confirmer qu'il a correctement crypté et décrypté le fichier. Vérifiez que vous décryptez le fichier dans un nouveau fichier (comme dans la procédure Sub Main() de cet article) plutôt que dans le fichier d'origine. Examinez le fichier décrypté et comparez-le au fichier d'origine.

Liste de code complète

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text

Module Module1
    'Doit correspondre à 64 bits, 8 octets.
    Private Const sSecretKey As String = "Password"

    Public Sub Main()
        EncryptFile("c:\temp\test.txt", _
                        "c:\temp\Encrypted.txt", _
                        sSecretKey)
        DecryptFile("c:\temp\Encrypted.txt", _
                    "c:\temp\Decrypted.txt", _
                    sSecretKey)
    End Sub

    Sub EncryptFile(ByVal sInputFilename As String, _
                   ByVal sOutputFilename As String, _
                   ByVal sKey As String)

        Dim fsInput As New FileStream(sInputFilename, _
                                    FileMode.Open, FileAccess.Read)
        Dim fsEncrypted As New FileStream(sOutputFilename, _
                                    FileMode.Create, FileAccess.Write)

        Dim DES As New DESCryptoServiceProvider()

        'Définit la clé secrète pour l'algorithme DES.
        'Une clé de 64 bits et un vecteur d'initialisation sont requis pour ce fournisseur
        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

        'Définit le vecteur d'initialisation.
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

        'crée un crypteur DES à partir de cette instance
        Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
        'Crée un flux de cryptage qui transforme le flux de fichier à l'aide du cryptage DES
        Dim cryptostream As New CryptoStream(fsEncrypted, _
                                            desencrypt, _
                                            CryptoStreamMode.Write)

        'Lit le texte du fichier dans le tableau d'octets
        Dim bytearrayinput(fsInput.Length - 1) As Byte
        fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
        'écrit le fichier crypté à l'aide de DES
        cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
        cryptostream.Close()
    End Sub

    Sub DecryptFile(ByVal sInputFilename As String, _
        ByVal sOutputFilename As String, _
        ByVal sKey As String)

        Dim DES As New DESCryptoServiceProvider()
        'Une clé de 64 bits et un vecteur d'initialisation sont requis pour ce fournisseur.
        'Définit la clé secrète pour l'algorithme DES.
        DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
        'Définit le vecteur d'initialisation.
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

        'crée un flux de fichier pour lire le fichier crypté de retour
        Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
        'crée un décrypteur DES à partir de l'instance DES
        Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
        'crée un flux de cryptage, défini pour lire et effectuer une transformation
        de décryptage DES sur les octets entrants
        Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
        'imprime le contenu du fichier décrypté
        Dim fsDecrypted As New StreamWriter(sOutputFilename)
        fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
        fsDecrypted.Flush()
        fsDecrypted.Close()
    End Sub

End Module

RÉFÉRENCES

Pour plus d'informations sur l'utilisation des fonctions cryptographiques de .NET et sur la cryptographie en général, consultez les sites Web (en anglais) aux adresses suivantes :

Propriétés

Numéro d'article: 301070 - Dernière mise à jour: lundi 13 octobre 2003 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic .NET 2002 Initiation
Mots-clés : 
kbhowto kbhowtomaster KB301070
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com