vb.net - AES加密/解密

标签 vb.net encryption aes

下面是一些适用于字符串的代码:

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

我可以在修改这些函数以加密/解密字节数组而不是字符串方面获得一些帮助吗?另外,让函数返回加密/解密的字节数组,而不是字符串。

谢谢

最佳答案

我使用这个(在 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

关于vb.net - AES加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094750/

相关文章:

c# - .NET:接口(interface)问题 VB.net Getter Only Interface

android - 如何有效调用 AES/ECB 64k 次?

java - 使用java解密凯撒密码

Android AES 加密零填充

mysql - 有没有办法使用 .NET 应用程序为 Web 托管的 MySQL 数据库提供数据?

asp.net - 在 MS Access 中双插入?

ssl - AES, key 是如何分配的?

openssl - 如何在 OpenSSL 中获取 HMAC key

mysql - datagridview单击事件句柄并打开新表单

encryption - 如果攻击者有原始数据和加密数据,他们能确定密码吗?