Option Strict On

Imports System.Security.Cryptography

Public Class cCrypt

#Region "Zustandsvariablen"
    Private EncryptedString_ As String
    Private DecryptedString_ As String
#End Region

    Public Sub New()

    End Sub

#Region "Methoden"
    ' Verschlüsseln
    Public Sub Encrypt(ByVal AESKeySize As Int32, _
      ByVal DecryptedString As String, _
      ByVal Password As String)

        ' Der Salt-Wert ist eine zufällig gewählte Zeichenfolge, 
        ' wenn man so will ein zweites Passwort. 
        ' Nur wer den Salt-Wert und das Passwort kennt, 
        ' kann entschlüsseln.
        ' Durch Verwendung eines Salt-Wertes ist es deutlich 
        ' schwerer das Passwort zu knacken.
        ' Wird das Passwort selber zur Erstellung des Salt-Wertes 
        ' verwendet, muss dieses mindestens 8 Zeichen haben.
        Dim Salt() As Byte
        Salt = System.Text.Encoding.UTF8.GetBytes( _
          "Salt-Wert_BitteBeiVerwendungDesCodesÄndern")

        ' Mit Hilfe des Passwortes und des Salt wird ein Key (Hash-Wert) 
        ' generiert, der später zur Initialisierung des
        ' AES-Algorithmus verwendt wird. 
        Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)

        ' Instanzierung des AES-Algorithmus-Objekts mit 256-bit 
        ' oder 128-bit Schlüssel und 128-bit Block-Size
        Dim AES As New AesManaged
        AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
        AES.BlockSize = 128

        ' Algorithmus initialisieren:
        AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
        AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)

        ' Memory-Stream und Crypto-Stream erzeugen -> CreateEncryptor()
        Dim ms As New System.IO.MemoryStream
        Dim cs As New CryptoStream(ms, AES.CreateEncryptor(), _
          CryptoStreamMode.Write)

        ' Daten verschlüsseln:
        Dim Data() As Byte
        Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString)
        cs.Write(Data, 0, Data.Length)
        cs.FlushFinalBlock()
        cs.Close()

        ' Verschlüsselte Daten als String ausgeben: 
        EncryptedString_ = Convert.ToBase64String(ms.ToArray)
        ms.Close()

        AES.Clear()

    End Sub

    ' Entschlüsseln
    Public Sub Decrypt(ByVal AESKeySize As Int32, _
      ByVal EncryptedString As String, _
      ByVal Password As String)

        ' Der Salt-Wert und das Passwort müssen mit dem übereinstimmen, 
        ' das bei der Verschlüsselung verwendet wurde:
        Dim Salt() As Byte
        Salt = System.Text.Encoding.UTF8.GetBytes( _
          "Salt-Wert_BitteBeiVerwendungDesCodesÄndern")

        Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)

        ' Instanzierung des AES-Algorithmus-Objekts:
        Dim AES As New AesManaged
        ' Ein mit 256 bit verschlüsselter String kann 
        ' auch nur mit 256 bit entschlüsselt werden!
        AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
        AES.BlockSize = 128

        ' Algorithmus initialisieren:
        AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
        AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)

        ' Memory-Stream und Crypto-Stream erzeugen -> CreateDecryptor()
        Dim ms As New System.IO.MemoryStream
        Dim cs As New CryptoStream(ms, AES.CreateDecryptor(), _
          CryptoStreamMode.Write)

        Try ' Daten entschlüsseln:
            Dim Data() As Byte
            Data = Convert.FromBase64String(EncryptedString)
            cs.Write(Data, 0, Data.Length)
            cs.FlushFinalBlock()
            cs.Close()

            ' Die entschlüsselten Daten als String ausgeben: 
            DecryptedString_ = System.Text.Encoding.UTF8.GetString(ms.ToArray)
            ms.Close()

            AES.Clear()
        Catch ex As Exception
            DecryptedString_ = "Ungültiges Passwort!"
        End Try

    End Sub
#End Region

#Region "Eigenschaften"
    ReadOnly Property EncryptedString() As String
        Get
            Return EncryptedString_
        End Get
    End Property


    ReadOnly Property DecryptedString() As String
        Get
            Return DecryptedString_
        End Get
    End Property
#End Region

End Class