Panduan: Mengenkripsi dan Mendekripsi String di Visual Basic

Panduan ini menunjukkan kepada Anda cara menggunakan TripleDES kelas untuk mengenkripsi dan mendekripsi string menggunakan algoritma Triple Data Encryption Standard (3DES). Langkah pertama adalah membuat kelas pembungkus sederhana yang merangkum algoritma 3DES dan menyimpan data terenkripsi sebagai string yang dikodekan base-64. Kemudian, pembungkus tersebut digunakan untuk menyimpan data pengguna privat dengan aman dalam file teks yang dapat diakses publik.

Anda dapat menggunakan enkripsi untuk melindungi rahasia pengguna (misalnya, kata sandi) dan untuk membuat kredensial tidak dapat dibaca oleh pengguna yang tidak sah. Ini dapat melindungi identitas pengguna yang berwenang dari pencurian, melindungi aset pengguna, dan memastikan integritas sehingga tindakan tersebut tidak dapat disangkal. Enkripsi juga dapat melindungi data pengguna agar tidak diakses oleh pengguna yang tidak sah.

Untuk informasi selengkapnya, lihat Layanan Kriptografi.

Penting

Algoritma Rijndael (sekarang dikenal sebagai Advanced Encryption Standard [AES]) dan Triple Data Encryption Standard (3DES) memberikan keamanan yang lebih besar daripada DES karena lebih intensif secara komputasi. Untuk informasi lebih lanjut, lihat DES dan Rijndael.

Untuk membuat pembungkus enkripsi

  1. Simple3Des Buat kelas untuk merangkum metode enkripsi dan dekripsi.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Tambahkan impor namespace kriptografi ke awal file yang berisi Simple3Des kelas .

    Imports System.Security.Cryptography
    
  3. Di kelas Simple3Des, tambahkan field privat untuk menyimpan penyedia layanan kriptografi 3DES, kunci yang ditentukan, serta versi format, ukuran salt, dan jumlah iterasi.

    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. Tambahkan metode privat yang membuat larik byte dari kunci dan garam yang ditentukan.

    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. Tambahkan konstruktor yang menyimpan kunci yang ditentukan.

    Parameter key mengontrol EncryptData metode dan 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. Tambahkan metode publik yang mengenkripsi string.

    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. Tambahkan metode publik yang mendekripsi string.

    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
    

    Kelas pembungkus sekarang dapat digunakan untuk melindungi aset pengguna. Dalam contoh ini, digunakan untuk menyimpan data pengguna privat dengan aman dalam file teks yang dapat diakses publik.

Untuk menguji pembungkus enkripsi

  1. Di kelas terpisah, tambahkan metode yang menggunakan metode pembungkus EncryptData untuk mengenkripsi string dan menulisnya ke folder Dokumen Saya pengguna.

    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. Tambahkan fungsi yang membaca string terenkripsi dari folder My Documents pengguna dan mendekripsi string tersebut dengan metode pembungkus 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. Tambahkan kode antarmuka pengguna untuk memanggil metode TestEncoding dan TestDecoding.

  4. Jalankan aplikasi.

    Ketika Anda menguji aplikasi, perhatikan bahwa aplikasi tidak akan mendekripsi data jika Anda memberikan kata sandi yang salah.

Lihat juga