Wskazówki: szyfrowanie i odszyfrowywanie ciągów w Visual Basic
W tym przewodniku pokazano, jak używać DESCryptoServiceProvider klasy do szyfrowania i odszyfrowywania ciągów przy użyciu wersji dostawcy usług kryptograficznych (CSP) algorytmu Triple Data Encryption Standard (TripleDES). Pierwszym krokiem jest utworzenie prostej klasy otoki, która hermetyzuje algorytm 3DES i przechowuje zaszyfrowane dane jako ciąg zakodowany w formacie base-64. Następnie ta otoka służy do bezpiecznego przechowywania prywatnych danych użytkownika w publicznie dostępnym pliku tekstowym.
Szyfrowanie służy do ochrony wpisów tajnych użytkownika (na przykład haseł) i tworzenia poświadczeń nieczytelnych przez nieautoryzowanych użytkowników. Dzięki temu można chronić tożsamość autoryzowanego użytkownika przed kradzieżą, która chroni zasoby użytkownika i nie odrzuca. Szyfrowanie może również chronić dane użytkownika przed uzyskaniem dostępu przez nieautoryzowanych użytkowników.
Aby uzyskać więcej informacji, zobacz Usługi kryptograficzne.
Ważne
Algorytmy Rijndael (określane obecnie jako Advanced Encryption Standard [AES]) i Triple Data Encryption Standard (3DES) zapewniają większe bezpieczeństwo niż DES, ponieważ są bardziej intensywnie obliczeniowe. Aby uzyskać więcej informacji, zobacz tematy DES oraz Rijndael.
Aby utworzyć otokę szyfrowania
Utwórz klasę
Simple3Des
, aby hermetyzować metody szyfrowania i odszyfrowywania.Public NotInheritable Class Simple3Des End Class
Dodaj import przestrzeni nazw kryptografii na początku pliku zawierającego klasę
Simple3Des
.Imports System.Security.Cryptography
Simple3Des
W klasie dodaj pole prywatne do przechowywania dostawcy usług kryptograficznych 3DES.Private TripleDes As New TripleDESCryptoServiceProvider
Dodaj metodę prywatną, która tworzy tablicę bajtów o określonej długości na podstawie skrótu określonego klucza.
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
Dodaj konstruktor, aby zainicjować dostawcę usług kryptograficznych 3DES.
Parametr
key
steruje metodamiEncryptData
iDecryptData
.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
Dodaj metodę publiczną, która szyfruje ciąg.
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
Dodaj metodę publiczną, która odszyfrowuje ciąg.
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
Klasa otoki może teraz służyć do ochrony zasobów użytkowników. W tym przykładzie jest używany do bezpiecznego przechowywania prywatnych danych użytkownika w publicznie dostępnym pliku tekstowym.
Aby przetestować otokę szyfrowania
W oddzielnej klasie dodaj metodę, która używa metody otoki
EncryptData
do szyfrowania ciągu i zapisywania go w folderze Moje dokumenty użytkownika.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
Dodaj metodę, która odczytuje zaszyfrowany ciąg z folderu Moje dokumenty użytkownika i odszyfrowuje ciąg za pomocą metody otoki
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
Dodaj kod interfejsu użytkownika w celu wywołania
TestEncoding
metod iTestDecoding
.Uruchom aplikację.
Podczas testowania aplikacji zwróć uwagę, że nie będzie ona odszyfrowywać danych, jeśli podasz nieprawidłowe hasło.