2012-02-01 266 views
2

下面是一些代码,弦乐效果很好: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 

我可以在修改这些功能的加密/解密的字节数组,而不是字符串一些帮助。此外,要使函数返回加密/解密的字节数组,而不是字符串。

感谢

回答

0

最简单的方法是使用,只需将字节数组转换为字符串,用你的AESEncrypt函数加密它的包装功能和字符串转换回为一个字节数组。你可以找到VB.net here的转换函数。

编辑补充:我觉得我得到了这个错误。看来,一个VB String是Unicode格式,而这些翻译功能将其转换为/从UTF8字节数组。这不是什么要求...

+0

请问这种做法是一样高效/有效的修改函数接受字节数组,而不是字符串? – 2012-02-01 22:05:49

+0

效率如何?不,但我不认为头顶会很重。效果如何?是。 – TonyK 2012-02-01 22:42:33

+0

我已经使用了转换函数的字节数组转换为字符串,并VICA亦可。出于某种原因,如果我尝试解密加密的字节数组(来自文件),它与原始文件不同。使用这些转换例程有什么限制吗? – 2012-02-01 23:03:24

1

只需复制一个新的功能从Dim ByteCount As Integer = 0SymmetricKey.Clear()摆脱所有的字符串?之后,您只需要定义函数的参数。

+0

字节数组的加密函数如何? :) – 2012-02-18 02:30:03

1

我使用这个(在谷歌找到)的字符串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

该代码可以“工作”,但它肯定不是安全(ECB模式),它破坏包含非ASCII字符的任意输入。 – CodesInChaos 2012-12-15 14:27:11

0
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 

你实际上使用的代码将输入字符串转换为字节数组。该代码接受字节数组。