AES Шифрование строки в VB.NET
У меня есть программа, основанная на Visual Basic 2010.
Я хочу использовать настраиваемое ключевое слово и шифрование AES для создания ключей регистрации на веб-сайте нашей компании, которые будут разблокировать программное обеспечение независимо от того, подключено ли программное обеспечение к Интернету.
Чтобы сделать это, я хочу зашифровать определенную информацию пользователя (и код проверки) в зашифрованную строку AES с помощью утилиты, которую я создам на своем веб-сайте. Затем я хочу, чтобы моя программа расшифровывала строку в пользовательскую информацию и код проверки, затем используйте эту информацию для проверки регистрационного ключа.
Это подводит меня к вопросу - как я могу программно шифровать и расшифровывать строку в AES? Есть ли код кода, который я могу использовать где-нибудь, или встроенный метод?
Ответы
Ответ 1
Быстрый поиск в Google вызывает следующие функции: я не тестировал, правильно ли они выводятся, но они, похоже, правильно компилируются.
Public Function AES_Encrypt(ByVal input As String, ByVal pass As String) As String
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
Dim encrypted As String = ""
Try
Dim hash(31) As Byte
Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(pass))
Array.Copy(temp, 0, hash, 0, 16)
Array.Copy(temp, 0, hash, 15, 16)
AES.Key = hash
AES.Mode = Security.Cryptography.CipherMode.ECB
Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(input)
encrypted = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
Return encrypted
Catch ex As Exception
End Try
End Function
Public Function AES_Decrypt(ByVal input As String, ByVal pass As String) As String
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
Dim decrypted As String = ""
Try
Dim hash(31) As Byte
Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(pass))
Array.Copy(temp, 0, hash, 0, 16)
Array.Copy(temp, 0, hash, 15, 16)
AES.Key = hash
AES.Mode = Security.Cryptography.CipherMode.ECB
Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
Dim Buffer As Byte() = Convert.FromBase64String(input)
decrypted = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
Return decrypted
Catch ex As Exception
End Try
End Function
Источник: http://www.l33thackers.com/Thread-VB-NET-AES-Encryption
Ответ 2
Изменить: Благодаря Artjom B. уведомить меня об ошибке в расшифровке AES-CBC, которая произошла из-за моего ложного предположения, что строки IV всегда заканчиваются == (в Base64), что неверно. Благодаря Kanky для придания этому тесту и благодаря Misery для решения этой проблемы в этой ссылке. Обратите внимание, что я сам не проверял его/ее исправление, но, надеюсь, это правильно.
Ниже приведены два решения для шифрования строк с AES.
Первый использует режим CBC с автоматически сгенерированным IV и более безопасен. Использование режима IV с режимом CBC гарантирует, что даже те же пары открытого текста-ключа приводят к отличным зашифрованным текстам и тем самым делают его более безопасным.
Второй использует ECB больше и не должен использоваться для повторного шифрования открытого текста.
AES.Key генерируется путем хэширования входной ключевой строки с SHA256; поэтому вам не нужно беспокоиться о псевдослучайности вашего ключа.
Это AES-CBC. IV автоматически генерируется встроенной функцией и конкатенируется с зашифрованным текстом и возвращается как результат алгоритма шифрования. Алгоритм дешифрования разбивает этот конкатенированный текст для восстановления IV и фактического зашифрованного текста.
Private Function AESE(ByVal plaintext As String, ByVal key As String) As String
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim SHA256 As New System.Security.Cryptography.SHA256Cng
Dim ciphertext As String = ""
Try
AES.GenerateIV()
AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
AES.Mode = Security.Cryptography.CipherMode.CBC
Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(plaintext)
ciphertext = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
Return Convert.ToBase64String(AES.IV) & Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
Catch ex As Exception
Return ex.Message
End Try
End Function
Private Function AESD(ByVal ciphertext As String, ByVal key As String) As String
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim SHA256 As New System.Security.Cryptography.SHA256Cng
Dim plaintext As String = ""
Dim iv As String = ""
Try
Dim ivct = ciphertext.Split({"=="}, StringSplitOptions.None)
iv = ivct(0) & "=="
ciphertext = If(ivct.Length = 3, ivct(1) & "==", ivct(1))
AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
AES.IV = Convert.FromBase64String(iv)
AES.Mode = Security.Cryptography.CipherMode.CBC
Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
Dim Buffer As Byte() = Convert.FromBase64String(ciphertext)
plaintext = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
Return plaintext
Catch ex As Exception
Return ex.Message
End Try
End Function
Ниже приведен режим AES-ECB. Он не использует IV. Те же самые текстовые тексты всегда приводят к тем же зашифрованным текстам (под тем же ключом) и наоборот.
Private Function AESE(ByVal input As Byte(), ByVal key As String) As Byte()
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim SHA256 As New System.Security.Cryptography.SHA256Cng
Dim ciphertext As String = ""
Try
AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
AES.Mode = Security.Cryptography.CipherMode.ECB
Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
Dim Buffer As Byte() = input
Return DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
Catch ex As Exception
End Try
End Function
Private Function AESD(ByVal input As Byte(), ByVal key As String) As Byte()
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim SHA256 As New System.Security.Cryptography.SHA256Cng
Try
AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
AES.Mode = Security.Cryptography.CipherMode.ECB
Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
Dim Buffer As Byte() = input
Return DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
Catch ex As Exception
End Try
End Function
Ответ 3
Вы можете использовать режим CBC для шифрования файлов с относительной легкостью. Используйте uuencode/uudecode для преобразования двоичного файла в текстовое представление и обратно. См. Относительную информацию здесь: http://www.nullskull.com/a/237/uuencode-and-uudecode-in-vbnet-and-c.aspx
и здесь: https://social.msdn.microsoft.com/Forums/vstudio/en-US/5d4eaed8-1984-4639-aebb-bb2afddbfb8a/how-to-uuencodeuudecode-file-in-vbnet?forum=vbgeneral