Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как использовать TripleDES класс для шифрования и расшифровки строк с помощью алгоритма тройного шифрования данных (3DES). Первым шагом является создание простого класса оболочки, который инкапсулирует алгоритм 3DES и сохраняет зашифрованные данные в виде строки в кодировке base-64. Затем эта оболочка используется для безопасного хранения данных частного пользователя в общедоступном текстовом файле.
Вы можете использовать шифрование для защиты секретов пользователей (например, паролей) и для того, чтобы учетные данные не читались несанкционированными пользователями. Это может защитить личность авторизованного пользователя от кражи, что защищает активы пользователя и обеспечивает неотказуемость. Шифрование также может защитить данные пользователя от доступа к неавторизованным пользователям.
Дополнительные сведения см. в разделе "Криптографические службы".
Это важно
Алгоритмы Rijndael (теперь называются расширенным шифрованием (AES)) и тройным стандартом шифрования данных (3DES) обеспечивают большую безопасность, чем DES, так как они являются более вычислительными. Дополнительные сведения см. в разделах DES и Rijndael.
Создание оболочки шифрования
Simple3DesСоздайте класс, чтобы инкапсулировать методы шифрования и расшифровки.Public NotInheritable Class Simple3Des End ClassДобавьте импорт пространства имен шифрования в начало файла, содержащего
Simple3Desкласс.Imports System.Security.CryptographyВ классе
Simple3Desдобавьте закрытые поля для хранения поставщика криптографических служб 3DES, указанного ключа, а также версии формата, размера соли и числа итераций.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Добавьте закрытый метод, который создает массив байтов из указанного ключа и соли.
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Добавьте конструктор, который хранит указанный ключ.
Параметр
keyуправляет методамиEncryptDataиDecryptData.Sub New(ByVal key As String) ' Store the key. The encryption key and IV are created per message. Me.Key = key End SubДобавьте открытый метод, который шифрует строку.
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Добавьте открытый метод, расшифровывющий строку.
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Теперь класс оболочки можно использовать для защиты ресурсов пользователей. В этом примере он используется для безопасного хранения данных частного пользователя в общедоступном текстовом файле.
Проверка оболочки шифрования
В отдельном классе добавьте метод, использующий метод оболочки
EncryptDataдля шифрования строки и записи его в папку "Мои документы".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Добавьте метод, который считывает зашифрованную строку из папки "Мои документы" пользователя и расшифровывает строку с помощью метода оболочки
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Добавьте код интерфейса пользователя для вызова методов
TestEncodingиTestDecoding.Запустите приложение.
При тестировании приложения обратите внимание, что он не расшифровывает данные, если указан неправильный пароль.