ListView Inhalt verschlüsseln und entschlüssen (TripleDES)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    ListView Inhalt verschlüsseln und entschlüssen (TripleDES)

    N'Abend nochmal,

    hoffenlich spam ich nicht zuviel. Arbeite gerade an einem kleinen Password Manager und versuche gerade meine ListView beim speichern zu verschlüsseln und beim laden zu entschlüsseln.
    Ich habe nach vb-magazin.de/forums/forums/p/5274/20674.aspx Post gearbeitet (hätte dort nachgefragt, aber die Registrierung ist down) und bekomme nun folgenden Fehler:

    Quellcode

    1. NullReferenceException was unhandled


    Hier ist der Code der beiden Funktion zur Verschlüsselung & Entschlüsselung:
    Spoiler anzeigen

    Quellcode

    1. Public Function TripleDESEncryptMessage(ByVal plainMessage As String, ByVal password As String) As String
    2. Dim des As New TripleDESCryptoServiceProvider()
    3. des.IV = New Byte(7) {}
    4. Dim pdb As New PasswordDeriveBytes(password, New Byte(-1) {})
    5. des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
    6. Dim ms As New MemoryStream(plainMessage.Length * 2)
    7. Dim encStream As New CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)
    8. Dim plainBytes As Byte() = Encoding.UTF8.GetBytes(plainMessage)
    9. encStream.Write(plainBytes, 0, plainBytes.Length)
    10. encStream.FlushFinalBlock()
    11. Dim encryptedBytes As Byte() = New Byte(ms.Length - 1) {}
    12. ms.Position = 0
    13. ms.Read(encryptedBytes, 0, CInt(ms.Length))
    14. encStream.Close()
    15. Return (Convert.ToBase64String(encryptedBytes))
    16. End Function


    Quellcode

    1. Public Function TripleDESDecryptMessage(ByVal encryptedBase64 As String, ByVal password As String) As String
    2. Dim des As New TripleDESCryptoServiceProvider()
    3. des.IV = New Byte(7) {}
    4. Dim pdb As New PasswordDeriveBytes(password, New Byte(-1) {})
    5. des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
    6. Dim encryptedBytes As Byte() = Convert.FromBase64String(encryptedBase64)
    7. Dim ms As New MemoryStream(encryptedBase64.Length)
    8. Dim decStream As New CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)
    9. decStream.Write(encryptedBytes, 0, encryptedBytes.Length)
    10. decStream.FlushFinalBlock()
    11. Dim plainBytes As Byte() = New Byte(ms.Length - 1) {}
    12. ms.Position = 0
    13. ms.Read(plainBytes, 0, CInt(ms.Length))
    14. decStream.Close()
    15. Return (Encoding.UTF8.GetString(plainBytes))
    16. End Function


    Hier ist der Code des Speichervorgangs:
    Spoiler anzeigen

    Quellcode

    1. Private Sub ButtonSaveData_Click(sender As Object, e As EventArgs) Handles ButtonSaveData.Click
    2. My.Settings.ColumnWidthDomain = ColumnDomain.Width
    3. My.Settings.ColumnWidthUsername = ColumnUsername.Width
    4. My.Settings.ColumnWidthPassword = ColumnPassword.Width
    5. My.Settings.ColumnWidthEMail = ColumnEMail.Width
    6. My.Settings.ColumnWidthToken = ColumnToken.Width
    7. My.Settings.Save()
    8. My.Settings.Reload()
    9. Dim myWriter As New IO.StreamWriter(testfile)
    10. For Each myItem As ListViewItem In ListView1.Items
    11. myWriter.WriteLine(lock = myItem.Text & "#" & myItem.SubItems(1).Text & "#" & myItem.SubItems(2).Text & "#" & myItem.SubItems(3).Text & "#" & myItem.SubItems(4).Text)
    12. lock = TripleDESEncryptMessage(lock, Password)
    13. Next
    14. myWriter.Close()
    15. My.Settings.LastTimeEditedValue = System.DateTime.Now
    16. My.Settings.Save()
    17. My.Settings.Reload()
    18. MsgBox("Your data has been successfully saved")
    19. End Sub


    Ich hoffe ihr könnt mir helfen, vielen Dank schonmal!

    Gruß,

    ZKDev schrieb:

    bekomme nun folgenden Fehler
    in welcher Zeile Deines Codes?
    Da war ein Objekt nicht instanziiert, da fehlte die Abarbeitung eines New-Statements oder ein Äquivalent davon (CreateInstance()).
    Klick auf die relevanten Variablen, drücke Shift+F9 und sieh Dir an, was in diesen Variablen drinsteht.
    Lerne zu debuggen, diese Art von Fehlern kannst Du beheben, ohne hier einen Thread zu eröffnen.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ohne es vorher getestet und nach Fehler gesehen zu haben. Das kann noch optmiert werden.
    vb-paradise.de/index.php/Threa…halt-Speichern-bzw-Laden/

    Guggst du hier Beispiel.zip

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    RodFromGermany schrieb:

    ZKDev schrieb:

    bekomme nun folgenden Fehler
    in welcher Zeile Deines Codes?


    Spoiler anzeigen

    Quellcode

    1. Dim ms As New MemoryStream(plainMessage.Length * 2)


    Ich gebe mein bestes was debuggen angeht, aber hier komme ich leider nichr weiter.

    Danke an alle schonmal.
    Gruß,
    nutze Using sit einfach

    in etwa so
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function TripleDESEncryptMessage(ByVal plainMessage As String, ByVal password As String) As String
    2. Using des As New TripleDESCryptoServiceProvider()
    3. des.IV = New Byte(7) {}
    4. Dim pdb As New PasswordDeriveBytes(password, New Byte(-1) {})
    5. des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
    6. Using ms As New MemoryStream
    7. Using encStream As New CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)
    8. Dim plainBytes As Byte() = Encoding.UTF8.GetBytes(plainMessage)
    9. encStream.Write(plainBytes, 0, plainBytes.Length)
    10. encStream.FlushFinalBlock()
    11. Dim encryptedBytes As Byte() = New Byte(CInt(ms.Length - 1)) {}
    12. ms.Position = 0
    13. ms.Read(encryptedBytes, 0, CInt(ms.Length))
    14. encStream.Close()
    15. Return (Convert.ToBase64String(encryptedBytes))
    16. End Using
    17. End Using
    18. End Using
    19. End Function
    20. Public Function TripleDESDecryptMessage(ByVal encryptedBase64 As String, ByVal password As String) As String
    21. Using des As New TripleDESCryptoServiceProvider()
    22. des.IV = New Byte(7) {}
    23. Dim pdb As New PasswordDeriveBytes(password, New Byte(-1) {})
    24. des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
    25. Dim encryptedBytes As Byte() = Convert.FromBase64String(encryptedBase64)
    26. Using ms As New MemoryStream(encryptedBase64.Length)
    27. Using decStream As New CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)
    28. decStream.Write(encryptedBytes, 0, encryptedBytes.Length)
    29. decStream.FlushFinalBlock()
    30. Dim plainBytes As Byte() = New Byte(CInt(ms.Length - 1)) {}
    31. ms.Position = 0
    32. ms.Read(plainBytes, 0, CInt(ms.Length))
    33. decStream.Close()
    34. Return (Encoding.UTF8.GetString(plainBytes))
    35. End Using
    36. End Using
    37. End Using
    38. End Function


    Freundliche Grüsse

    exc-jdbi

    ZKDev schrieb:

    VB.NET-Quellcode

    1. Dim ms As New MemoryStream(plainMessage.Length * 2)
    Ich würde behaupten, dass plainMessage nicht instanziiert ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    exc-jdbi schrieb:

    nutze Using sit einfach

    in etwa so
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function TripleDESEncryptMessage(ByVal plainMessage As String, ByVal password As String) As String
    2. Using des As New TripleDESCryptoServiceProvider()
    3. des.IV = New Byte(7) {}
    4. Dim pdb As New PasswordDeriveBytes(password, New Byte(-1) {})
    5. des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
    6. Using ms As New MemoryStream
    7. Using encStream As New CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)
    8. Dim plainBytes As Byte() = Encoding.UTF8.GetBytes(plainMessage)
    9. encStream.Write(plainBytes, 0, plainBytes.Length)
    10. encStream.FlushFinalBlock()
    11. Dim encryptedBytes As Byte() = New Byte(CInt(ms.Length - 1)) {}
    12. ms.Position = 0
    13. ms.Read(encryptedBytes, 0, CInt(ms.Length))
    14. encStream.Close()
    15. Return (Convert.ToBase64String(encryptedBytes))
    16. End Using
    17. End Using
    18. End Using
    19. End Function
    20. Public Function TripleDESDecryptMessage(ByVal encryptedBase64 As String, ByVal password As String) As String
    21. Using des As New TripleDESCryptoServiceProvider()
    22. des.IV = New Byte(7) {}
    23. Dim pdb As New PasswordDeriveBytes(password, New Byte(-1) {})
    24. des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, New Byte(7) {})
    25. Dim encryptedBytes As Byte() = Convert.FromBase64String(encryptedBase64)
    26. Using ms As New MemoryStream(encryptedBase64.Length)
    27. Using decStream As New CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)
    28. decStream.Write(encryptedBytes, 0, encryptedBytes.Length)
    29. decStream.FlushFinalBlock()
    30. Dim plainBytes As Byte() = New Byte(CInt(ms.Length - 1)) {}
    31. ms.Position = 0
    32. ms.Read(plainBytes, 0, CInt(ms.Length))
    33. decStream.Close()
    34. Return (Encoding.UTF8.GetString(plainBytes))
    35. End Using
    36. End Using
    37. End Using
    38. End Function


    Freundliche Grüsse

    exc-jdbi


    Fehler besteht weiterhin :(

    RodFromGermany schrieb:

    ZKDev schrieb:

    VB.NET-Quellcode

    1. Dim ms As New MemoryStream(plainMessage.Length * 2)
    Ich würde behaupten, dass plainMessage nicht instanziiert ist.


    Jetzt werde ich wahrscheinlich gehasst, aber wie geht das genau?
    Finde zwar diverse Dinge dazu im Internet, aber keine hilft mir wirklich weiter (bin extremer Anfänger)

    Gruß,
    @ZKDev Post #2.

    RodFromGermany schrieb:

    Klick auf die relevanten Variablen, drücke Shift+F9 und sieh Dir an, was in diesen Variablen drinsteht.
    Du machst ungefähr so was:

    VB.NET-Quellcode

    1. Dim dlg As Form2
    2. 'dlg = New Form2 ' dies hättest Du vergessen
    3. dlg.Show()

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @ZKDev Post #2.

    RodFromGermany schrieb:

    Klick auf die relevanten Variablen, drücke Shift+F9 und sieh Dir an, was in diesen Variablen drinsteht.


    Quellcode

    1. The program '[6572] Password Manager - ZKDev.vshost.exe: Program Trace' has exited with code 0 (0x0).
    2. The program '[6572] Password Manager - ZKDev.vshost.exe' has exited with code -1 (0xffffffff).


    Du machst ungefähr so was:

    VB.NET-Quellcode

    1. Dim dlg As Form2
    2. 'dlg = New Form2 ' dies hättest Du vergessen
    3. dlg.Show()



    In welche Class muss ich das schreiben?

    Danke & Gruß,

    ZKDev schrieb:

    In welche Class muss ich das schreiben?
    Überhaupt nicht.
    Verfolge Deine Variable plainMessage in Deinem Code. Wo kommt die her?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    ZKDev schrieb:

    In welche Class muss ich das schreiben?
    Überhaupt nicht.
    Verfolge Deine Variable plainMessage in Deinem Code. Wo kommt die her?

    Quellcode

    1. Public Function TripleDESEncryptMessage(ByVal plainMessage As String, ByVal password As String) As String


    Daher, oder?

    Hier der gesamte Code:
    Dateien

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

    ZKDev schrieb:

    oder?
    Nö.
    Ich meine den Aufrufer dieser Funktion.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ZKDev Was muss ich tun, um den Fehler zu reproduzieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ZKDev
    "Password rejected"

    =========

    Sag ich doch.

    VB.NET-Quellcode

    1. lock = TripleDESEncryptMessage(lock, Password)
    lock ist bei diesem Aufruf Nothing. Das musst Du vorher abfangen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

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

    @ZKDev

    Sorry, leider kann ich es nicht kompilieren da ich hier FW4.0 hab.
    Normalerweise kann ich es zwar ohne grossen Aufwand kurz umändern, in deinem Falle ist es aber einfach zu aufwändig.

    Wenn ich deinen Code anschaue, könnte es an der Variable lock sein, ist aber nur eine Vermutung. So wie es aussieht, wird jedes item einzel verschlüsselt. Schon das wäre wahrscheinlich ein Grund das es Fehlerhaft ist. Da würde ich zuerst alle items zu einem String zusammenfassen und am Schluss die Verschlüsselung machen.

    Freundliche Grüsse

    exc-jdbi

    RodFromGermany schrieb:

    @ZKDev
    "Password rejected"

    =========
    vb-paradise.de/index.php/Attac…e1ca2015397c3a042f4e3fac9
    Sag ich doch.

    VB.NET-Quellcode

    1. lock = TripleDESEncryptMessage(lock, Password)
    lock ist bei diesem Aufruf Nothing. Das musst Du vorher abfangen.


    @RodFromGermany Wie mach ich das? ... stehe gerade mit meinen Latein am Ende

    _____________________________________

    starte das debuggen und benutzt das Tastenkürzel: " STRG + F1 " ... setzt das Passwort auf "0000" zurück.
    Dann einloggen, Add Item, irgendwas eingeben und hinzuüfgen, save data

    exc-jdbi schrieb:

    Wenn ich deinen Code anschaue, könnte es an der Variable lock sein, ist aber nur eine Vermutung. So wie es aussieht, wird jedes item einzel verschlüsselt. Schon das wäre wahrscheinlich ein Grund das es Fehlerhaft ist. Da würde ich zuerst alle items zu einem String zusammenfassen und am Schluss die Verschlüsselung machen.
    Werde ich mal versuchen, danke
    @ZKDev Deine Herangehensweise ist suboptimal.
    Du musst überlegen, was da initial passiert.
    So was (nicht aber dies) vielleicht:

    VB.NET-Quellcode

    1. If String.IsNullOrEmpty(plainMessage) Then
    2. plainMessage = "1234567890"
    3. End If
    4. Dim ms As New MemoryStream(plainMessage.Length * 2)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!