AES256 Crypto

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von th3Khem.

    AES256 Crypto

    Hallo brach mal nen tip wie ich am besten dateien verschlüsseln kann .Kann zwar ein string mit aes 256 verschlüsseln bin aber leider planlos wie ich eine datei verschlüsseln kann .bitte um tips .finde nur immer Sachen zu rc2 und so
    Such mal nach '.net encrypt file aes', das erste Ergebnis zeigt eine Variante in C#, dies lässt sich aber sehr einfach mit der Hilfe von Online-Konvertern in VB.NET übersetzen.
    Dein Post war schonmal sehr hilfreich muss nur leider zugeben das ich IV und Salt noch nicht so verstanden habe .DerSalt soll das ganze besser verschlüsseln und wird als Klartext angegeben oder und der IV.Hoffe kannst ma das noch anders erklären.

    Und wie würdest du Autentifizieren für ein loginsystem einsetzen wenn man das Passwort nicht in my Setting oder so verschlüsselt speichern will.Momentan Nutz ich sha256 um das Passwort zu verschlüsseln und das wird mit dem eingegeben text verglichen.oder ist die herrsngehensweise das falsch beim loginsystem ?
    Danke schonmal für die Hilfe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „th3Khem“ ()

    Bei Loginsystemen ist die Vorgehensweise normalerweise:
    1. (einmalig) Gesetztes Passwort wird gehasht (zB mit SHA256) und gespeichert
    2. (jedes mal) Eingegebenes Passwort wird gehasht und mit dem gespeicherten Hash verglichen, wenn beide gleich sind, ist das eingegebene Passwort richtig.
    Daher denke ich, soweit ich deine Erklärungen verstanden habe, dass deine Hergehensweise richtig ist :).
    Den Hash solltest du übrigens nicht als hash.txt oder so irgendwo speichern, da lässt er sich ganz einfach finden und ersetzen, versteck sie irgendwo ;).
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt
    K und genau das ableiten anhand des Salt verstehe ich nicht .Den der Salt wird ja als klartext geschrieben wa ? Aber wie arbeitet das ganze weiter das ist meine Lücke trotz deines vorhergehenden Post. Den will mir so das loginsystem und das verschlüsseln der datei so machen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Sha("passwort" + "salt")
    der salt steht höchstens im programm als klartext, jedoch nicht direkt im Hash. Außerdem kann man bei der Verrechnung von passwort und salt auch komplexere Vorgänge implementieren, welche nicht ganz so einfach nachzuvollziehen sind.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @nafets3646

    Eine kurze Frage bezüglich dem ein Passwort in Hash umwandeln und später beim Anmelden immer vergleichen, ob das Login passwort in Hash mit dem gespeichertem Hash Wert übereinstimmt.

    Wie wissen Seiten, Programmen etc. bei denen man zuerst registrieren muss, dass beim Erstellen Benutzer Account zu erstellen, beim Passwort keine klein / gross Buchstabe, Zahl oder Sonderzeichen vorhanden ist oder eben nicht?

    Also muss es ja im Prinzip einen Zwischenschritt geben, der das eingegebene Person nach diesen Kriterien überprüft. Erst dann wird es in Hash umgewandelt und abgespeichert. Ist das wirklich so?

    Lg BK
    K wenn ich jetzt richtig verstehe müsste ich ein password als Hash (bzw. als verschlüsselt) in mein Programm speichern und den Salt und das eigentliche Passwort im loginsystem einbauen also ein feld für das Passwort und eins für den Salt wo ich diese beiden eingeben muss und dann so alles gebildet wird oder ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „th3Khem“ ()

    ohne präzises Denken wird das nix.
    in einem Programm kann man nichts abspeichern. Man speichert in eine Datei.
    Ein Passwort wird nie abgespeichert. Es wird nur der abgeleitete Schlüssel und das Salt, und für AES und Konsorten auch der IV abgespeichert.
    Ein Passwort wird auch nirgends eingebaut.
    auch Salt und IV werden nirgends eingebaut.
    Ein Schlüssel-Ableitung wird implementiert, und dabei wird vlt. das Rfc2898DeriveBytes eingebaut.

    Aber das steht viel besser erklärt im Tut.
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt
    K und genau das geht nicht in mein Kopf also gebe ich in mein Programm den Salt und IV ein k da komm ich noch mit aber woher weis das crypto das das eingegebene Passwort korrekt ist ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    wer ist eiglich dieser "k", den du so häufig erwähnst?

    Was ist das "crypto"?

    Salt und IV werden niemals eingegeben. Die werden generiert, beim Schlüssel ableiten.
    Für ein Login brauchst du auch kein IV, weil IV braucht man für symmetrische Verschlüsselung von Texten, für Authentifizierung braucht mans nicht. Es ärgert mich, dassich dir das ganze Tut nochmal vorkauen muß.
    K hoffe jetzt hab ich es verstanden .
    1. Unzwar erstelle ich zuerst ein Salt der aber zufällig generiert wird. Als nächstes bestimme ich das Passwort .Aus Salt und password wird ein Schlüssel generiert der dann gehashed wird .Den Schlüssel muss man dan mitgeben später.

    2 bei entschlüsseln wird später der Schlüssel durch das password zerlegt in Salt und password und dann entschlüsselt .

    Stimmt es soweit wie ich es jetzt verstehe ?
    lies nochma Tut. Du bringst Verschlüsselung und Authentifizierung durcheinander.

    Und vergiss mal das Wort "Hash". Schlüsselableitung ist keine Hash-Funktion.

    Und entschlüsselt wird bei einer Authentifizierung nirgends.

    Ich kanns auch nochma versuchen erklären:
    Beim SchlüsselAbleiten wird das Passwort vom User genommen, und ausserdem ein kryptografisch starker zusätzlicher Zufalls-Schlüssel generiert, das Salt.
    Passwort und Salt werden zusammen durch den Algo gezogen, und raus kommt der abgeleitete Schlüssel.

    Der abgeleitete Schlüssel wird mit dem Salt zusammen gespeichert - der User kriegt vom Salt ühaupt nix mit - in meine Crypter-Klasse wird das Salt dem abgeleiteten Schlüssel einfach vorangestellt.

    Zur Autentifizierung Passwort eingeben, Salt auslesen, daraus mit obigem Algo den Schlüssel generieren und gucken, ob er identisch mit dem gespeicherten Schlüssel ist.

    Der Witz ist nu:
    Der Hash eines einfachen, schwachen Passworts lässt sich mw. in einer Rainbow-Table von 10Mio Einträgen auffinden.
    Aber nun kommt noch das Salt, gewissermaßen als Zusatz-PW hinzu. Da es bekannt ist, isses eiglich kein Passwort, sondern nur eine Verkomplizierung des Algorithmus.
    Da nu jeder abgeleitete Schlüssel ein anneres Salt hat, müssteman für jedes Salt eine eigene Rainbow-Table generieren.

    Da kannmandann die Table auch sein lassen, und gleich mit olle Brute-Force zu knacken versuchen.
    k aus anderem tut und deinem würde es jetzt so aussehen

    Encrypt:Der Salt ist erstmal als 12345678 angegeben wird aber später generiert

    VB.NET-Quellcode

    1. Public Sub Encrypt(ByVal AESKeySize As Int32, _
    2. ByVal DecryptedString As String, _
    3. ByVal Password As String)
    4. Dim Salt() As Byte
    5. Salt = System.Text.Encoding.UTF8.GetBytes( _
    6. "12345678")
    7. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
    8. Dim AES As New AesManaged
    9. AES.KeySize = AESKeySize
    10. AES.BlockSize = 128
    11. ' Algorithmus initialisieren:
    12. AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
    13. AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
    14. ' Memory-Stream und Crypto-Stream erzeugen -> CreateEncryptor()
    15. Dim ms As New IO.MemoryStream
    16. Dim cs As New CryptoStream(ms, AES.CreateEncryptor(), _
    17. CryptoStreamMode.Write)
    18. ' Daten verschlüsseln:
    19. Dim Data() As Byte
    20. Data = System.Text.Encoding.UTF8.GetBytes(DecryptedString)
    21. cs.Write(Data, 0, Data.Length)
    22. cs.FlushFinalBlock()
    23. cs.Close()
    24. ' Verschlüsselte Daten als String ausgeben:
    25. EncryptedString_ = Convert.ToBase64String(ms.ToArray)
    26. ms.Close()
    27. AES.Clear()
    28. End Sub


    Decrypt:

    VB.NET-Quellcode

    1. Public Sub Decrypt(ByVal AESKeySize As Int32, _
    2. ByVal EncryptedString As String, _
    3. ByVal Password As String)
    4. Dim Salt() As Byte
    5. Salt = System.Text.Encoding.UTF8.GetBytes( _
    6. "12345678")
    7. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)
    8. ' Instanzierung des AES-Algorithmus-Objekts:
    9. Dim AES As New AesManaged
    10. ' Ein mit 256 bit verschlüsselter String kann
    11. ' auch nur mit 256 bit entschlüsselt werden!
    12. AES.KeySize = AESKeySize ' möglich sind 256 oder 128 bit
    13. AES.BlockSize = 128
    14. ' Algorithmus initialisieren:
    15. AES.Key = GenerierterKey.GetBytes(AES.KeySize \ 8)
    16. AES.IV = GenerierterKey.GetBytes(AES.BlockSize \ 8)
    17. ' Memory-Stream und Crypto-Stream erzeugen -> CreateDecryptor()
    18. Dim ms As New IO.MemoryStream
    19. Dim cs As New CryptoStream(ms, AES.CreateDecryptor(), _
    20. CryptoStreamMode.Write)
    21. Try ' Daten entschlüsseln:
    22. Dim Data() As Byte
    23. Data = Convert.FromBase64String(EncryptedString)
    24. cs.Write(Data, 0, Data.Length)
    25. cs.FlushFinalBlock()
    26. cs.Close()
    27. ' Die entschlüsselten Daten als String ausgeben:
    28. DecryptedString_ = System.Text.Encoding.UTF8.GetString(ms.ToArray)
    29. ms.Close()
    30. AES.Clear()
    31. Catch ex As Exception
    32. DecryptedString_ = "Ungültiges Passwort!"
    33. End Try
    34. End Sub


    Verschlüsseln:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Encrypt(256, "hase", "2h3zrqhy")
    3. textbox1.text = EncryptedString_
    4. MsgBox(EncryptedString_)
    5. End Sub


    Entschlüsseln:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Decrypt(256, "yFz/PHuc9+weT7gyn4VzXw==", "2h3zrqhy")
    3. MsgBox(DecryptedString_)
    4. End Sub


    Ist jetzt als string ermal gemacht was ver und entschlüsselt ist. Aber was ich mitliefern muss ist nun der Salt und ?Schlüssel?

    nur wie kann ich den schlüssel in string mitliefern?
    Schlüssel wird ja hier generiert oder ?

    VB.NET-Quellcode

    1. Dim GenerierterKey As New Rfc2898DeriveBytes(Password, Salt)


    nur wie verhält sich das wenn ich das auch als login nehme das kann ich ja schlecht "yFz/PHuc9+weT7gyn4VzXw==" was ja Hase ist in einem string reinschreiben oder ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „th3Khem“ ()