Share via


Procédure pas à pas : chiffrement et déchiffrement de chaînes en Visual Basic

Cette procédure pas à pas vous explique comment utiliser la classe DESCryptoServiceProvider pour chiffrer et déchiffrer des chaînes à l'aide de la version du fournisseur de services de chiffrement (CSP) de l'algorithme Triple Data Encryption Standard (TripleDES). La première étape consiste à créer une classe wrapper simple qui encapsule l'algorithme 3DES et stocke les données chiffrées sous forme de chaîne encodée en base 64. Ensuite, ce wrapper est utilisé pour stocker en toute sécurité les données utilisateur privées dans un fichier texte accessible publiquement.

Vous pouvez utiliser le chiffrement pour protéger des données utilisateur confidentielles (par exemple, des mots de passe) et rendre les informations d'identification illisibles par les utilisateurs non autorisés. Cela peut empêcher le vol de l'identité d'un utilisateur autorisé ce qui protège les ressources de l'utilisateur et garantit la non-répudiabilité. Le chiffrement empêche également l'accès aux données d'un utilisateur par des utilisateurs non autorisés.

Pour plus d'informations, consultez Services de chiffrement.

Note de sécuritéNote de sécurité

Les algorithmes Rijndael (maintenant appelé Advanced Ecryption Standard [AES]) et Triple Data Encryption Standard (3DES) offrent une plus grande sécurité que DES parce qu'ils sollicitent beaucoup de ressources informatiques. Pour plus d'informations, consultez DES et Rijndael.

Pour créer le wrapper de chiffrement

  1. Ajoutez une instruction import de l'espace de noms de chiffrement au début du fichier.

    Imports System.Security.Cryptography
    
  2. Créez une classe pour encapsuler les méthodes de chiffrement et de déchiffrement.

    Public NotInheritable Class Simple3Des
    End Class
    
  3. Ajoutez un champ privé pour stocker le fournisseur de services de chiffrement 3DES.

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. Ajoutez une méthode privée qui crée un tableau d'octets d'une longueur spécifiée à partir du hachage de la clé spécifiée.

    Private Function TruncateHash( 
        ByVal key As String, 
        ByVal length As Integer) As Byte()
    
        Dim sha1 As New SHA1CryptoServiceProvider
    
        ' Hash the key.
        Dim keyBytes() As Byte = 
            System.Text.Encoding.Unicode.GetBytes(key)
        Dim hash() As Byte = sha1.ComputeHash(keyBytes)
    
        ' Truncate or pad the hash.
        ReDim Preserve hash(length - 1)
        Return hash
    End Function
    
  5. Ajoutez un constructeur pour initialiser le fournisseur de services de chiffrement 3DES.

    Le paramètre key contrôle les méthodes EncryptData et DecryptData.

    Sub New(ByVal key As String)
        ' Initialize the crypto provider.
        TripleDes.Key = TruncateHash(key, TripleDes.KeySize \ 8)
        TripleDes.IV = TruncateHash("", TripleDes.BlockSize \ 8)
    End Sub
    
  6. Ajoutez une méthode publique qui chiffre une chaîne.

    Public Function EncryptData( 
        ByVal plaintext As String) As String
    
        ' Convert the plaintext string to a byte array.
        Dim plaintextBytes() As Byte = 
            System.Text.Encoding.Unicode.GetBytes(plaintext)
    
        ' Create the stream.
        Dim ms As New System.IO.MemoryStream
        ' Create the encoder to write to the stream.
        Dim encStream As New CryptoStream(ms, 
            TripleDes.CreateEncryptor(), 
            System.Security.Cryptography.CryptoStreamMode.Write)
    
        ' Use the crypto stream to write the byte array to the stream.
        encStream.Write(plaintextBytes, 0, plaintextBytes.Length)
        encStream.FlushFinalBlock()
    
        ' Convert the encrypted stream to a printable string.
        Return Convert.ToBase64String(ms.ToArray)
    End Function
    
  7. Ajoutez une méthode publique qui déchiffre une chaîne.

    Public Function DecryptData( 
        ByVal encryptedtext As String) As String
    
        ' Convert the encrypted text string to a byte array.
        Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext)
    
        ' Create the stream.
        Dim ms As New System.IO.MemoryStream
        ' Create the decoder to write to the stream.
        Dim decStream As New CryptoStream(ms, 
            TripleDes.CreateDecryptor(), 
            System.Security.Cryptography.CryptoStreamMode.Write)
    
        ' Use the crypto stream to write the byte array to the stream.
        decStream.Write(encryptedBytes, 0, encryptedBytes.Length)
        decStream.FlushFinalBlock()
    
        ' Convert the plaintext stream to a string.
        Return System.Text.Encoding.Unicode.GetString(ms.ToArray)
    End Function
    

    La classe wrapper peut maintenant être utilisée pour protéger les ressources de l'utilisateur. Dans cet exemple, elle est utilisée pour stocker en toute sécurité les données utilisateur privées dans un fichier texte accessible publiquement.

Pour tester le wrapper de chiffrement

  1. Dans une classe distincte, ajoutez une méthode qui utilise la méthode EncryptData du wrapper pour chiffrer une chaîne et l'écrire dans le dossier Mes documents de l'utilisateur.

    Sub TestEncoding()
        Dim plainText As String = InputBox("Enter the plain text:")
        Dim password As String = InputBox("Enter the password:")
    
        Dim wrapper As New Simple3Des(password)
        Dim cipherText As String = wrapper.EncryptData(plainText)
    
        MsgBox("The cipher text is: " & cipherText)
        My.Computer.FileSystem.WriteAllText( 
            My.Computer.FileSystem.SpecialDirectories.MyDocuments & 
            "\cipherText.txt", cipherText, False)
    End Sub
    
  2. Ajoutez une méthode qui lit la chaîne chiffrée du dossier Mes documents de l'utilisateur et la déchiffre à l'aide de la méthode DecryptData du wrapper.

    Sub TestDecoding()
        Dim cipherText As String = My.Computer.FileSystem.ReadAllText( 
            My.Computer.FileSystem.SpecialDirectories.MyDocuments & 
                "\cipherText.txt")
        Dim password As String = InputBox("Enter the password:")
        Dim wrapper As New Simple3Des(password)
    
        ' DecryptData throws if the wrong password is used.
        Try
            Dim plainText As String = wrapper.DecryptData(cipherText)
            MsgBox("The plain text is: " & plainText)
        Catch ex As System.Security.Cryptography.CryptographicException
            MsgBox("The data could not be decrypted with the password.")
        End Try
    End Sub
    
  3. Ajoutez le code d'interface utilisateur pour appeler les méthodes TestEncoding et TestDecoding.

  4. Exécutez l'application.

    Lorsque vous testez l'application, notez qu'elle ne déchiffrera pas les données si vous entrez un mot de passe incorrect.

Voir aussi

Référence

System.Security.Cryptography

DESCryptoServiceProvider

DES

TripleDES

Rijndael

Concepts

Services de chiffrement