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

Cette procédure pas à pas vous montre comment utiliser la TripleDES classe pour chiffrer et déchiffrer des chaînes à l’aide de l’algorithme Triple Data Encryption Standard (3DES). 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 les secrets utilisateur (par exemple, les mots de passe) et rendre les informations d’identification non lisibles par des utilisateurs non autorisés. Cela peut protéger l’identité d’un utilisateur autorisé contre le vol, ce qui protège les ressources de l’utilisateur et fournit une non-répudiation. Le chiffrement peut également protéger les données d’un utilisateur contre l’accès aux utilisateurs non autorisés.

Pour plus d’informations, consultez Services de cryptographie.

Importante

Les algorithmes Rijndael (maintenant appelés advanced encryption Standard [AES]) et Triple Data Encryption Standard (3DES) offrent une sécurité supérieure à CELLE des DES, car elles sont plus gourmandes en calcul. Pour plus d’informations, consultez DES et Rijndael.

Pour créer l'enveloppe de chiffrement

  1. Créez la Simple3Des classe pour encapsuler les méthodes de chiffrement et de déchiffrement.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Ajoutez une importation de l’espace de noms de chiffrement au début du fichier qui contient la Simple3Des classe.

    Imports System.Security.Cryptography
    
  3. Dans la Simple3Des classe, ajoutez des champs privés pour stocker le fournisseur de services de chiffrement 3DES, la clé spécifiée et la version de format, la taille de sel et le nombre d’itérations.

    Private TripleDes As TripleDES = TripleDES.Create()
    
    Private Const FormatVersion As Byte = 1
    Private Const SaltSize As Integer = 16
    Private Const Iterations As Integer = 600000
    Private ReadOnly Key As String
    
  4. Ajoutez une méthode privée qui crée un tableau d’octets à partir de la clé spécifiée et d’un sel.

    Private Function DeriveKey(ByVal salt() As Byte) As Byte()
        ' Derive a key from the specified key and the salt.
        Using kdf As New Rfc2898DeriveBytes(
            Key, salt, Iterations, HashAlgorithmName.SHA256)
    
            Return kdf.GetBytes(TripleDes.KeySize \ 8)
        End Using
    End Function
    
  5. Ajoutez un constructeur qui stocke la clé spécifiée.

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

    Sub New(ByVal key As String)
        ' Store the key. The encryption key and IV are created per message.
        Me.Key = key
    End Sub
    
  6. Ajoutez une méthode publique qui chiffre une chaîne.

    Public Function EncryptData( 
        ByVal plaintext As String) As String
    
        ' Create a new salt and initialization vector for this message.
        Dim salt(SaltSize - 1) As Byte
        Using rng As RandomNumberGenerator = RandomNumberGenerator.Create()
            rng.GetBytes(salt)
        End Using
    
        TripleDes.Key = DeriveKey(salt)
        TripleDes.GenerateIV()
    
        ' 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
        ' Write the format version, salt, and initialization vector in front of
        ' the cipher text. The version identifies the salt length and iteration count.
        ms.WriteByte(FormatVersion)
        ms.Write(salt, 0, salt.Length)
        ms.Write(TripleDes.IV, 0, TripleDes.IV.Length)
    
        ' 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)
    
        ' Read the header that precedes the cipher text. Only one format
        ' version exists, so reject anything else.
        Dim ivSize As Integer = TripleDes.BlockSize \ 8
        Dim headerSize As Integer = 1 + SaltSize + ivSize
        If encryptedBytes.Length < headerSize OrElse
            encryptedBytes(0) <> FormatVersion Then
    
            Throw New CryptographicException(
                "The encrypted data is not in the expected format.")
        End If
    
        Dim salt(SaltSize - 1) As Byte
        Dim iv(ivSize - 1) As Byte
        Array.Copy(encryptedBytes, 1, salt, 0, SaltSize)
        Array.Copy(encryptedBytes, 1 + SaltSize, iv, 0, ivSize)
    
        TripleDes.Key = DeriveKey(salt)
        TripleDes.IV = iv
    
        ' 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, headerSize, 
            encryptedBytes.Length - headerSize)
        decStream.FlushFinalBlock()
    
        ' Convert the plaintext stream to a string.
        Return System.Text.Encoding.Unicode.GetString(ms.ToArray)
    End Function
    

    La classe wrapper peut désormais être utilisée pour protéger les ressources utilisateur. Dans cet exemple, il est utilisé 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 du EncryptData 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 à partir du dossier Mes documents de l’utilisateur et déchiffre la chaîne avec la méthode du DecryptData 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 du 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échiffre pas les données si vous fournissez un mot de passe incorrect.

Voir aussi