web-dev-qa-db-ja.com

VB.NETのAES暗号化文字列

Visual Basic 2010に基づいたプログラムがあります。

カスタムキーワードとAES暗号化を使用して、会社のWebサイトで登録キーを生成します。これにより、ソフトウェアがインターネットに接続されているかどうかに関係なく、ソフトウェアのロックが解除されます。

これを行うには、Webサイトで作成するユーティリティを使用して、特定のユーザー情報(および検証コード)をAES暗号化文字列に暗号化します。次に、プログラムで文字列を解読してユーザー情報と検証コードにし、その情報を使用して登録キーを検証します。

質問に私をもたらします-AESで文字列をプログラムで暗号化および復号化するにはどうすればよいですか?どこかで使用できるコードテンプレート、または組み込みメソッドはありますか?

17
CodeMouse92

簡単な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

30
Shane Gowland

編集: Artjom B。 に感謝します。IV文字列は常に==(Base64で)で終わるという誤った仮定のために発生したAES-CBCの復号化の誤りを通知してくれました。 Kanky このトピックを取り上げてくれてありがとう- Miserythis link で解決策を提供してくれてありがとう私は彼/彼女の修正を自分でチェックしなかったが、うまくいけばそれが正しいことに注意してください。

以下は、AESで文字列を暗号化するための2つのソリューションです。 1つ目は、自動生成されたIVでCBCモードを使用し、より安全です。 CBCモードでIVを使用すると、同じプレーンテキストとキーのペアであっても、明確な暗号文が生成されるため、より安全になります。 2つ目は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
6
Ussiane Lepsiq

以下は、AESおよび3DES暗号化の2つの例です。これらは入力および出力としてバイト配列を使用しますが、文字列を処理するために簡単に変更できます。推奨事項として、常に初期化ベクトル(IV)を生成し、復号化のために出力ファイルに付加する必要があります。これは、ブルートフォース攻撃からキーを保護するのに役立ちます。また、暗号モードにはEBCよりもCBCを使用することをお勧めします。

Imports System.Security.Cryptography
Imports System.Text

Public Class CAes
    '************************************************************************************************
    'Functions for AES Encryption
    '************************************************************************************************
    Public Function AES_Encrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim AES As New RijndaelManaged
        Dim SHA256 As New SHA256Cng
        Dim output() As Byte

        AES.GenerateIV()
        Dim iv() As Byte = AES.IV
        AES.Key = SHA256.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))

        AES.Mode = CipherMode.CBC
        Dim AESEncrypter As ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = value
        output = AESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)

        'Copy the IV as the first 16 bytes of the output then copy encrypted bytes
        Dim ivAndOutput(output.Length - 1 + 16) As Byte
        Array.Copy(iv, ivAndOutput, 16)
        Array.Copy(output, 0, ivAndOutput, 16, output.Length)

        Return ivAndOutput

    End Function

    Public Function AES_Decrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim AES As New RijndaelManaged
        Dim SHA256 As New SHA256Cng
        Dim output() As Byte
        Dim iv(15) As Byte
        Dim Buffer(value.Length - 1 - 16) As Byte

        'Extract first 16 bytes of input stream as IV.  Copy remaining bytes into encrypted buffer
        Array.Copy(value, iv, 16)
        Array.Copy(value, 16, Buffer, 0, value.Length - 16)

        AES.Key = SHA256.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
        AES.IV = iv
        AES.Mode = CipherMode.CBC
        Dim AESDecrypter As ICryptoTransform = AES.CreateDecryptor
        output = AESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
        Return output

    End Function
End Class

Public Class C3Des

    '************************************************************************************************
    'Functions for 3DES Encryption
    '************************************************************************************************
    Public Function DES_Encrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim m As MD5 = New MD5CryptoServiceProvider
        Dim d As TripleDES = New TripleDESCryptoServiceProvider
        Dim encryptBytes() As Byte
        d.Key = m.ComputeHash(Encoding.Unicode.GetBytes(key))
        d.GenerateIV()
        Dim c As ICryptoTransform = d.CreateEncryptor
        Dim input() As Byte = value
        encryptBytes = c.TransformFinalBlock(input, 0, input.Length)
        Dim outBytes(encryptBytes.Length + d.IV.Length - 1) As Byte
        Array.Copy(d.IV, outBytes, d.IV.Length)
        Array.Copy(encryptBytes, 0, outBytes, 8, encryptBytes.Length)
        Return outBytes
    End Function

    Public Function DES_Decrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim m As MD5 = New MD5CryptoServiceProvider
        Dim d As TripleDES = New TripleDESCryptoServiceProvider
        Dim encryptBytes(value.Length - 9), iv(7) As Byte
        Array.Copy(value, 0, iv, 0, 8)
        Array.Copy(value, 8, encryptBytes, 0, value.Length - 8)
        d.Key = m.ComputeHash(Encoding.Unicode.GetBytes(key))
        d.IV = iv
        Dim b As Byte() = encryptBytes
        Dim c As ICryptoTransform = d.CreateDecryptor
        Dim output() As Byte = c.TransformFinalBlock(b, 0, b.Length)
        Return output
    End Function
End Class
0
user3034017

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

0
Will Pepponi