Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit overzicht ziet u hoe u de TripleDES klasse gebruikt om tekenreeksen te versleutelen en ontsleutelen met behulp van het 3DES-algoritme (Triple Data Encryption Standard). De eerste stap is het maken van een eenvoudige wrapperklasse die het 3DES-algoritme inkapselt en de versleutelde gegevens opslaat als een met base 64 gecodeerde tekenreeks. Vervolgens wordt die wrapper gebruikt om persoonlijke gebruikersgegevens veilig op te slaan in een openbaar toegankelijk tekstbestand.
U kunt versleuteling gebruiken om gebruikersgeheimen (bijvoorbeeld wachtwoorden) te beveiligen en referenties onleesbaar te maken door onbevoegde gebruikers. Dit kan de identiteit van een geautoriseerde gebruiker beschermen tegen diefstal, waardoor de bezittingen van de gebruiker worden beschermd en niet-weerspreekbaarheid wordt geboden. Versleuteling kan de gegevens van een gebruiker ook beschermen tegen toegang door onbevoegde gebruikers.
Zie Cryptografische services voor meer informatie.
Belangrijk
De Rijndael (nu aangeduid als Advanced Encryption Standard [AES]) en Triple Data Encryption Standard (3DES) bieden meer beveiliging dan DES omdat ze rekenintensief zijn. Zie voor meer informatie DES en Rijndael.
De versleutelingslaag maken
Maak de
Simple3Desklasse om de versleutelings- en ontsleutelingsmethoden in te kapselen.Public NotInheritable Class Simple3Des End ClassVoeg een import van de cryptografienaamruimte toe aan het begin van het bestand dat de
Simple3Desklasse bevat.Imports System.Security.CryptographyVoeg in de
Simple3Desklasse privévelden toe om de cryptografische 3DES-serviceprovider, de opgegeven sleutel en de indelingsversie, de zoutgrootte en het aantal iteraties op te slaan.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 StringVoeg een privémethode toe waarmee een bytematrix wordt gemaakt op basis van de opgegeven sleutel en een zout.
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 FunctionVoeg een constructor toe waarmee de opgegeven sleutel wordt opgeslagen.
De
keyparameter bepaalt deEncryptDataenDecryptDatamethoden.Sub New(ByVal key As String) ' Store the key. The encryption key and IV are created per message. Me.Key = key End SubVoeg een openbare methode toe waarmee een tekenreeks wordt versleuteld.
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 FunctionVoeg een openbare methode toe waarmee een tekenreeks wordt ontsleuteld.
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 FunctionDe wrapper-klasse kan nu worden gebruikt om gebruikersassets te beveiligen. In dit voorbeeld wordt het gebruikt om persoonlijke gebruikersgegevens veilig op te slaan in een openbaar toegankelijk tekstbestand.
Het testen van de versleutelingswikkelaar
Voeg in een afzonderlijke klasse een methode toe die gebruikmaakt van de methode van de wrapper
EncryptDataom een tekenreeks te versleutelen en naar de map Mijn documenten van de gebruiker te schrijven.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 SubVoeg een methode toe waarmee de versleutelde tekenreeks uit de map Mijn documenten van de gebruiker wordt gelezen en de tekenreeks wordt ontsleuteld met de methode van
DecryptDatade wrapper.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 SubVoeg code van de gebruikersinterface toe om de
TestEncodingenTestDecodingmethoden aan te roepen.Voer de toepassing uit.
Wanneer u de toepassing test, ziet u dat de gegevens niet worden ontsleuteld als u het verkeerde wachtwoord opgeeft.