Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym przewodniku pokazano, jak używać TripleDES klasy do szyfrowania i odszyfrowywania ciągów przy użyciu algorytmu Triple Data Encryption Standard (3DES). 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 to opakowanie służy do bezpiecznego przechowywania prywatnych danych użytkownika w pliku tekstowym czytelnym dla wszystkich.
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 czemu można chronić tożsamość autoryzowanego użytkownika przed kradzieżą, co chroni zasoby użytkownika i zapewnia niezaprzeczalność. 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 DES i Rijndael.
Aby utworzyć opakowanie szyfrowania
Utwórz klasę
Simple3Des, aby hermetyzować metody szyfrowania i odszyfrowywania.Public NotInheritable Class Simple3Des End ClassDodaj import przestrzeni nazw kryptografii na początku pliku zawierającego klasę
Simple3Des.Imports System.Security.CryptographyW klasie
Simple3Desdodaj pola prywatne do przechowywania dostawcy usług kryptograficznych 3DES, określonego klucza oraz wersji formatu, rozmiaru soli i liczby iteracji.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 StringDodaj prywatną metodę, która tworzy tablicę bajtów na podstawie określonego klucza i soli.
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 FunctionDodaj konstruktor, który przechowuje określony klucz.
Parametr
keysteruje metodamiEncryptDataiDecryptData.Sub New(ByVal key As String) ' Store the key. The encryption key and IV are created per message. Me.Key = key End SubDodaj metodę publiczną, która szyfruje ciąg.
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 FunctionDodaj 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) ' 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 FunctionKlasa opakowująca może teraz służyć do ochrony zasobów użytkownika. W tym przykładzie jest używany do bezpiecznego przechowywania prywatnych danych użytkownika w publicznie dostępnym pliku tekstowym.
Aby przetestować warstwę szyfrowania
W oddzielnej klasie dodaj metodę, która używa metody wrappera
EncryptDatado szyfrowania ciągu i zapisz go do folderu 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 SubDodaj metodę, która odczytuje zaszyfrowany ciąg z folderu Moje Dokumenty użytkownika i odszyfrowuje ciąg za pomocą metody wrappera
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 SubDodaj kod interfejsu użytkownika do wywołania metod
TestEncodingiTestDecoding.Uruchom aplikację.
Podczas testowania aplikacji zwróć uwagę, że nie będzie ona odszyfrowywać danych, jeśli podasz nieprawidłowe hasło.