演练:在 Visual Basic 中对字符串进行加密和解密

本演练介绍如何使用 DESCryptoServiceProvider 类通过三重数据加密标准 (TripleDES) 算法的加密服务提供程序 (CSP) 版本来加密和解密字符串。 第一步是创建一个简单的包装类,用于封装 3DES 算法并将加密的数据存储为 base-64 编码字符串。 然后,使用该包装器将私密用户数据安全存储在可公开访问的文本文件中。

可以使用加密来保护用户机密(例如密码),并使未经授权的用户无法读取凭据。 这可以防范已获授权用户的身份被盗用,从而保护用户的资产并提供不可否认性。 加密还可以防范用户数据被未经授权的用户访问。

有关更多信息,请参阅加密服务

重要

Rijndael(现在称为高级加密标准 [AES])和三重数据加密标准 (3DES) 算法提供的安全性高于 DES,因为它们的计算强度更大。 有关详细信息,请参阅 DESRijndael

创建加密包装器

  1. 创建 Simple3Des 类以封装加密和解密方法。

    Public NotInheritable Class Simple3Des
    End Class
    
  2. 在包含 Simple3Des 类的文件的开头,添加加密命名空间的 import 语句。

    Imports System.Security.Cryptography
    
  3. Simple3Des 类中添加一个专用字段,用于存储 3DES 加密服务提供程序。

    Private TripleDes As New TripleDESCryptoServiceProvider
    
  4. 添加一个专用方法,用于根据指定密钥的哈希中指定的长度创建一个字节数组。

    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. 添加一个构造函数,用于初始化 3DES 加密服务提供程序。

    key 参数控制 EncryptDataDecryptData 方法。

    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. 添加用于加密字符串的公共方法。

    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. 添加用于解密字符串的公共方法。

    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
    

    该包装类现在可用于保护用户资产。 在此示例中,它用于将私密用户数据安全存储在可公开访问的文本文件中。

测试加密包装器

  1. 在一个单独的类中添加一个方法,该方法使用包装器的 EncryptData 方法来加密字符串,并将其写入用户的“我的文档”文件夹中。

    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. 添加一个方法,用于从用户的“我的文档”文件夹中读取已加密的字符串并使用包装器的 DecryptData 方法解密该字符串。

    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. 添加用户界面代码以调用 TestEncodingTestDecoding 方法。

  4. 运行应用程序。

    在测试应用程序时请注意,如果提供错误的密码,则它不会解密数据。

另请参阅