İzlenecek yol: Visual Basic'te Dizeleri Şifreleme ve Şifresini Çözme

Bu kılavuzda, Üçlü Veri Şifreleme Standardı (3DES) algoritmasını TripleDES kullanarak dizeleri şifrelemek ve şifresini çözmek için sınıfının nasıl kullanılacağı gösterilmektedir. İlk adım, 3DES algoritmasını kapsülleyen ve şifrelenmiş verileri base-64 kodlanmış bir dize olarak depolayan basit bir sarmalayıcı sınıfı oluşturmaktır. Ardından bu sarmalayıcı, özel kullanıcı verilerini genel olarak erişilebilen bir metin dosyasında güvenli bir şekilde depolamak için kullanılır.

Kullanıcı gizli dizilerini (örneğin, parolalar) korumak ve kimlik bilgilerini yetkisiz kullanıcılar tarafından okunamaz hale getirmek için şifrelemeyi kullanabilirsiniz. Bu, yetkili bir kullanıcının kimliğinin çalınmasını önleyebilir ve bu da kullanıcının varlıklarını korur ve reddedilmemesini sağlar. Şifreleme, kullanıcının verilerinin yetkisiz kullanıcılar tarafından erişilmesini de engelleyebilir.

Daha fazla bilgi için bkz . Şifreleme Hizmetleri.

Önemli

Rijndael (şimdi Gelişmiş Şifreleme Standardı [AES] olarak adlandırılır) ve Üçlü Veri Şifreleme Standardı (3DES) algoritmaları, daha yoğun işlem gücü kullandıklarından DES'ten daha fazla güvenlik sağlar. Daha fazla bilgi için bkz. DES ve Rijndael.

Şifreleme sarmalayıcısını oluşturmak için

  1. Simple3Des Şifreleme ve şifre çözme yöntemlerini kapsüllemek için sınıfını oluşturun.

    Public NotInheritable Class Simple3Des
    End Class
    
  2. Simple3Des sınıfını içeren dosyanın başlangıcına cryptography ad alanının içeri aktarımını ekleyin.

    Imports System.Security.Cryptography
    
  3. Simple3Des sınıfında, 3DES şifreleme hizmeti sağlayıcısını, belirtilen anahtarı ve biçim sürümünü, tuz boyutunu ve yineleme sayısını depolamak için özel alanlar ekleyin.

    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. Belirtilen anahtar ve bir tuzdan bir bayt dizisi oluşturan özel bir yöntem ekleyin.

    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. Belirtilen anahtarı depolayan bir oluşturucu ekleyin.

    key parametresi, EncryptData ve DecryptData yöntemlerini denetler.

    Sub New(ByVal key As String)
        ' Store the key. The encryption key and IV are created per message.
        Me.Key = key
    End Sub
    
  6. Bir dizeyi şifreleyen genel bir yöntem ekleyin.

    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. Bir dizenin şifresini çözen genel bir yöntem ekleyin.

    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
    

    Sarmalayıcı sınıfı artık kullanıcı varlıklarını korumak için kullanılabilir. Bu örnekte, özel kullanıcı verilerini genel olarak erişilebilen bir metin dosyasında güvenli bir şekilde depolamak için kullanılır.

Şifreleme sarmalayıcısını test etmek için

  1. Ayrı bir sınıfta, bir dizeyi şifrelemek ve kullanıcının Belgelerim klasörüne yazmak için sarmalayıcının EncryptData yöntemini kullanan bir yöntem ekleyin.

    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. Kullanıcının Belgelerim klasöründen şifrelenmiş dizeyi okuyan ve sarmalayıcının DecryptData yöntemiyle dizenin şifresini çözen bir yöntem ekleyin.

    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. Kullanıcı arabirimi kodu ekleyerek TestEncoding ve TestDecoding yöntemlerini çağırın.

  4. Uygulamayı çalıştırın.

    Uygulamayı test ettiğinizde, yanlış parola sağladığınızda verilerin şifresinin çözülmediğine dikkat edin.

Ayrıca bakınız