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