2012-02-01 100 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

このアプローチは、文字列ではなくバイト配列を受け入れるように関数を変更するのと同じくらい効率的で効果的でしょうか? –

+0

効率的ですか?しかし、私はオーバーヘッドが重くなるとは思わない。効果的ですか?はい。 – TonyK

+0

私は変換関数を使って、バイト配列を文字列とその逆に変換しています。何らかの理由で、(ファイルから)暗号化されたバイト配列を解読しようとすると、元のファイルと同じではありません。これらの変換ルーチンを使用する上での制限はありますか? –

1

すべての文字列を取り除くには、Dim ByteCount As Integer = 0からSymmetricKey.Clear()に始まる新しい機能のすべてをコピーしてください。その後、関数の引数を定義するだけで済みます。私は、文字列AES暗号化/復号化のために、これは(Googleで見つかった)を使用しています

+0

バイト配列の暗号化機能はどうですか? :) –

1

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

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 

あなたが実際に使用しているコード入力文字列をバイト配列に変換します。このコードはバイト配列を受け入れます。