Пошаговое руководство. Шифрование и расшифровка строк в Visual Basic
В этом пошаговом руководстве показано, как использовать DESCryptoServiceProvider класс для шифрования и расшифровки строк с помощью версии алгоритма тройного шифрования данных (TripleDESCSP). Первым шагом является создание простого класса оболочки, который инкапсулирует алгоритм 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 New TripleDESCryptoServiceProvider
Добавьте закрытый метод, который создает массив байтов указанной длины из хэша указанного ключа.
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
Добавьте конструктор для инициализации поставщика криптографических служб 3DES.
Параметр
key
управляетEncryptData
имиDecryptData
.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
Добавьте открытый метод, который шифрует строку.
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
Добавьте открытый метод, расшифровывющий строку.
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
Теперь класс оболочки можно использовать для защиты ресурсов пользователей. В этом примере он используется для безопасного хранения данных частного пользователя в общедоступном текстовом файле.
Проверка оболочки шифрования
В отдельном классе добавьте метод, использующий метод оболочки
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
методов.Запустите приложение.
При тестировании приложения обратите внимание, что он не расшифровывает данные, если указан неправильный пароль.