AES шифрование / дешифрование - PullRequest
2 голосов
/ 01 февраля 2012

Вот код, который хорошо работает со строками:

Public Function AESEncrypt(ByVal PlainText As String, ByVal Password As String, ByVal salt As String)
    Dim HashAlgorithm As String = "SHA1" 'Can be SHA1 or MD5
    Dim PasswordIterations As String = 2
    Dim InitialVector As String = "CanEncryption123" 'This should be a string of 16 ASCII characters.
    Dim KeySize As Integer = 256 'Can be 128, 192, or 256.

    If (String.IsNullOrEmpty(PlainText)) Then
        Return ""
        Exit Function
    End If
    Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector)
    Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt)
    Dim PlainTextBytes As Byte() = Encoding.UTF8.GetBytes(PlainText)
    Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations)
    Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8)
    Dim SymmetricKey As RijndaelManaged = New RijndaelManaged()
    SymmetricKey.Mode = CipherMode.CBC

    Dim CipherTextBytes As Byte() = Nothing
    Using Encryptor As ICryptoTransform = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes)
        Using MemStream As New MemoryStream()
            Using CryptoStream As New CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write)
                CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length)
                CryptoStream.FlushFinalBlock()
                CipherTextBytes = MemStream.ToArray()
                MemStream.Close()
                CryptoStream.Close()
            End Using
        End Using
    End Using
    SymmetricKey.Clear()
    Return Convert.ToBase64String(CipherTextBytes)
End Function
Public Function AESDecrypt(ByVal CipherText As String, ByVal password As String, ByVal salt As String) As String
    Dim HashAlgorithm As String = "SHA1"
    Dim PasswordIterations As String = 2
    Dim InitialVector As String = "CanEncryption123"
    Dim KeySize As Integer = 256

    If (String.IsNullOrEmpty(CipherText)) Then
        Return ""
    End If
    Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector)
    Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt)
    Dim CipherTextBytes As Byte() = Convert.FromBase64String(CipherText)
    Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(password, SaltValueBytes, HashAlgorithm, PasswordIterations)
    Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8)
    Dim SymmetricKey As RijndaelManaged = New RijndaelManaged()
    SymmetricKey.Mode = CipherMode.CBC
    Dim PlainTextBytes As Byte() = New Byte(CipherTextBytes.Length - 1) {}

    Dim ByteCount As Integer = 0

    Using Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes)
        Using MemStream As MemoryStream = New MemoryStream(CipherTextBytes)
            Using CryptoStream As CryptoStream = New CryptoStream(MemStream, Decryptor, CryptoStreamMode.Read)
                ByteCount = CryptoStream.Read(PlainTextBytes, 0, PlainTextBytes.Length)
                MemStream.Close()
                CryptoStream.Close()
            End Using
        End Using
    End Using
    SymmetricKey.Clear()
    Return Encoding.UTF8.GetString(PlainTextBytes, 0, ByteCount)
End Function

Могу ли я помочь с модификацией этих функций для шифрования / дешифрования байтовых массивов, а не строк?Кроме того, чтобы функции возвращали зашифрованный / расшифрованный массив байтов, а не строку.

спасибо

Ответы [ 4 ]

1 голос
/ 04 февраля 2012

Просто скопируйте все в новую функцию, начиная с Dim ByteCount As Integer = 0 до SymmetricKey.Clear(), чтобы избавиться от всех строк? После этого вам нужно только определить аргументы функции.

1 голос
/ 14 декабря 2012

Я использую это (найдено в Google) для строк Шифрование / дешифрование AES:

Imports System.Security.Cryptography

Namespace TextCrypters

    Public Class AESCrypter

        Public Shared pass As String = "password"

        Public Shared Function AES_Encrypt(ByVal input 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 = 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
                Return Nothing
            End Try

        End Function

        Public Shared Function AES_Decrypt(ByVal input 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 = 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
                Return Nothing
            End Try

        End Function

    End Class

End Namespace

Чтобы использовать его, просто сделайте это:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    TextBox2.Text = AESCrypter.AES_Encrypt(TextBox1.Text)
End Sub

Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    TextBox4.Text = AESCrypter.AES_Decrypt(TextBox3.Text)
End Sub
0 голосов
/ 06 июня 2017
Public Function AESEncrypt(ByVal PlainBytes As Byte, ByVal Password As String, ByVal salt As String)
Dim HashAlgorithm As String = "SHA1" 'Can be SHA1 or MD5
Dim PasswordIterations As String = 2
Dim InitialVector As String = "CanEncryption123" 'This should be a string of 16 ASCII characters.
Dim KeySize As Integer = 256 'Can be 128, 192, or 256.

Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector)
Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt)
Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations)
Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8)
Dim SymmetricKey As RijndaelManaged = New RijndaelManaged()
SymmetricKey.Mode = CipherMode.CBC

Dim CipherTextBytes As Byte() = Nothing
Using Encryptor As ICryptoTransform = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes)
    Using MemStream As New MemoryStream()
        Using CryptoStream As New CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write)
            CryptoStream.Write(PlainBytes, 0, PlainBytes.Length)
            CryptoStream.FlushFinalBlock()
            CipherTextBytes = MemStream.ToArray()
            MemStream.Close()
            CryptoStream.Close()
        End Using
    End Using
End Using
SymmetricKey.Clear()
Return Convert.ToBase64String(CipherTextBytes)
End Function
Public Function AESDecrypt(ByVal CipherBytes As Byte, ByVal password As String, ByVal salt As String) As String
Dim HashAlgorithm As String = "SHA1"
Dim PasswordIterations As String = 2
Dim InitialVector As String = "CanEncryption123"
Dim KeySize As Integer = 256

If (String.IsNullOrEmpty(CipherText)) Then
    Return ""
End If
Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector)
Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt)
Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(password, SaltValueBytes, HashAlgorithm, PasswordIterations)
Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8)
Dim SymmetricKey As RijndaelManaged = New RijndaelManaged()
SymmetricKey.Mode = CipherMode.CBC
Dim PlainTextBytes As Byte() = New Byte(CipherBytes.Length - 1) {}

Dim ByteCount As Integer = 0

Using Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes)
    Using MemStream As MemoryStream = New MemoryStream(CipherBytes)
        Using CryptoStream As CryptoStream = New CryptoStream(MemStream, Decryptor, CryptoStreamMode.Read)
            ByteCount = CryptoStream.Read(PlainTextBytes, 0, PlainTextBytes.Length)
            MemStream.Close()
            CryptoStream.Close()
        End Using
    End Using
End Using
SymmetricKey.Clear()
Return Encoding.UTF8.GetString(PlainTextBytes, 0, ByteCount)
End Function

Код, который вы используете, фактически преобразует входную строку в байтовый массив.Этот код принимает массив байтов.

0 голосов
/ 01 февраля 2012

Самый простой способ - использовать функцию-оболочку, которая просто преобразует байтовый массив в строку, шифрует ее с помощью функции AESEncrypt и преобразует строку обратно в байтовый массив.Вы можете найти функции преобразования для VB.net здесь .

Отредактировано, чтобы добавить: Я думаю, что я понял это неправильно.Кажется, что VB String имеет формат Unicode, и эти функции перевода преобразуют его в / из байтового массива UTF8.Что не то, что требовалось ...

...