mehrere Dateien gleichzeitig entschlüsseln

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

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Script1.

    mehrere Dateien gleichzeitig entschlüsseln

    Hallo zusammen,
    ich habe folgendes Problem:
    ich probiere mit einer For Schleife mehrere Bilder gleichzeitig zu entschlüsseln. Ich bekomme dies leider nicht richtig hin.
    Ich habe schon mehrfach meinen Debugger durchlaufen lassen. Er speichert mir nur 1 Bild was entschlüsselt ist.

    Quellcode

    1. Dim folder As String = Pfad & "\" & Ordnername.Text & "\"
    2. For Each file In IO.Directory.GetFiles(folder, "*.*", IO.SearchOption.TopDirectoryOnly)
    3. TB2_ScreenUhr.Text = ""
    4. TB2_ScreenUhr.Text = IO.Path.GetFileName(file)
    5. Dim newImage As Image = DecryptImage(folder & TB2_ScreenUhr.Text, folder & TB2_ScreenUhr.Text & ".dat")
    6. ' Bild in Datei speichern:
    7. newImage.Save(folder & TB2_ScreenUhr.Text & ".jpg")
    8. Next


    Wer kann mir helfen?
    Bilder
    • schlüssel.PNG

      17,5 kB, 749×203, 38 mal angesehen
    Es wäre schön, wenn Du endlich mal den richtigen CodeTag (den für VB.NET) verwenden würdest. Die Moderation hat keine Lust, Dir dauernd hinterherräumen zu müssen. Siehe dazu folgenden Thread: CodeTags

    Desweiteren: Was passiert denn, wenn eine für die DecryptImage-Funktion ungültige Datei in die Schleife kommt? Denn wenn da eine Datei ohne Extension oder eine Dat-Datei oder eine JPG-Datei verwendet wird, muss ja irgendwas passieren. Wird die Datei übersprungen? Kommt eine Exception?

    Und: Was soll bedeuten, dass Du »schon mehrfach [D]einen Debugger [hast] durchlaufen lassen«? Setzt Du da auch mal nen Haltepunkt in Zeile#9, um zu sehen, ob da für jede Datei auch ein gültiges Image rauskommt?

    btw: Zeile#4 kannst Du löschen. Und: gleichzeitig passiert da nichts, da Du nicht asynchronen Code ausführen lässt. In einer normalen Schleife wie der hiesigen passiert alles nacheinander.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    okay, sorry ich habe dies leider nicht gewusst das es verschiedene CodeTags gibt.

    VB.NET-Quellcode

    1. Public Function DecryptImage(ByVal encryptedFile As String, ByVal keyFile As String) As Image
    2. Dim encryptedBytes As Byte()
    3. Using fs As New FileStream(encryptedFile, FileMode.Open)
    4. encryptedBytes = New Byte(fs.Length - 1) {}
    5. fs.Read(encryptedBytes, 0, CInt(fs.Length))
    6. End Using
    7. Dim keyBytes As Byte()
    8. Using fs As New FileStream(keyFile, FileMode.Open)
    9. keyBytes = New Byte(fs.Length - 1) {}
    10. fs.Read(keyBytes, 0, CInt(fs.Length))
    11. End Using
    12. Dim originalBytes As Byte() = New Byte(encryptedBytes.Length - 1) {}
    13. Vernam(encryptedBytes, keyBytes, originalBytes)
    14. Dim ic As New ImageConverter()
    15. Return TryCast(ic.ConvertFrom(originalBytes), Image)
    16. End Function
    17. Public Sub Vernam(ByVal inBytes As Byte(), ByVal keyBytes As Byte(), ByRef outBytes As Byte())
    18. If (inBytes.Length <> keyBytes.Length) OrElse (keyBytes.Length <> outBytes.Length) Then
    19. Throw New ArgumentException("Ungleiche Länge")
    20. End If
    21. For i As Integer = 0 To inBytes.Length - 1
    22. outBytes(i) = CByte((inBytes(i) Xor keyBytes(i)))
    23. Next
    24. End Sub
    25. Dim folder As String = Pfad & "\" & Ordnername.Text & "\"
    26. For Each file In IO.Directory.GetFiles(folder, "*.*", IO.SearchOption.TopDirectoryOnly)
    27. Dim newImage As Image = DecryptImage(folder & TB2_ScreenUhr.Text, folder & TB2_ScreenUhr.Text & ".dat")
    28. ' Bild in Datei speichern:
    29. newImage.Save(folder & TB2_ScreenUhr.Text & ".jpg")
    30. Next


    Die Schleife geht genau 2x durch (weil 2 verschlüsselte Bilder vorhanden sind). Die Bilder sind verschlüsselt und sogar ohne .jpg Endung.
    Der erste durchlauf ist soweit in Ordnung. Er verschlüsselt 1 Bild mit der Endung .jpg.
    Bei dem 2. Durchlauf kommt dies
    System.IO.FileNotFoundExceptionHResult=0x80070002

    Script1 schrieb:

    System.IO.FileNotFoundException
    Hmmm …
    Ich glaube, dass diese Fehlermeldung genügend sagt. Sobald der Compiler mit dieser Fehlermeldung anhält, kannst Du ja nachschauen, an welcher Stelle der Fehler auftritt und wo da ein Dateipfad verwendet wird, der laut Compiler nicht exisiert. Und bevor Du da Einspruch erheben willst: Der Compiler hat immer recht, wenn er sagt, dass die angegebene Datei nicht existiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das liegt an der For Schleife, weil er irgendwie die Endung .dat doppelt macht. Ich habe dies schon Stundenlang rum probiert und keine Lösung gefunden.

    Das ist die Fehlermeldung:
    System.IO.FileNotFoundException: "Die Datei "C:\Users\dgzf5\Desktop\AIA\25042022021828.dat.dat" konnte nicht gefunden werden.
    @Script1 Wo kommt der Inhalt des Parameters encryptedFile her?
    Hat die Variable keyFile den richtigen Inhalt?
    Bitte nicht einfach mit "Ja" antworten, setze einen Haltepunkt beim Verschlüsseln und speichere die Inhalte (Plural, wenn ich mich recht entsinne) im Notapad ab und vergleiche sie dann beim Entschlüsseln.
    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!

    Script1 schrieb:

    weil er irgendwie die Endung .dat doppelt macht.

    Script1 schrieb:

    ich vermute das es an der Schleife liegt
    Was sind denn das hier für Debugging-Methoden? Weder »irgendwie« noch »ich vermute« sind für die Fehlerfindung akzeptabel! Sobald der Compiler die Exception wirfst, bist Du in der fehlerproduzierenden Zeile.
    • Welche genau ist das?


    Dann schaust Du den Teil der Codezeile an, der offensichtlich den Fehler produziert?
    • Welcher Parameter von welchem Befehl ist das?


    Dann schaust Du, wo der Parameter überall verwendet wird. Dazu klickst Du auf den Parameter und die Stellen werden entsprechend (bei mir nur hellgrau) hinterlegt.



    Dann schaust Du eben, an welcher Stelle Zuweisungen zu diesem Parameter sind. Wenn in der Methode, in der der Fehler auftritt keine Zuweisungen sind, weil die Variable ein Methodenparameter ist, dann doppelklickst Du im Fenster Aufrufliste (Menü Debuggen -> Fenster -> Aufrufliste oder Strg+Alt+C) auf die Methode, die die aktuelle aufruft und schaust da nach dem fehlerhaften Parameter.



    Sobald Du die Zuweisung gefunden hast, die Mist in die Variable reinschreibst, hast Du die Stelle gefunden, die Du ändern musst.
    Von daher: Wie lauten die konkreten Antworten bei Dir bei diesem Problem auf die o.g. Fragen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Option Strict ON!!

    dann erkennst Du vielleicht auch, daß die Variablen "TB2_ScreenUhr.Text" und "Ordnername.Text" keine validen String Variablen sind.
    In der Schleife speicherst Du die dekodierte Datei im selben Ordner wie die Originale (die dann als neue 3. Datei versucht wird zu dekodieren)
    Nimm einfach einen anderen Ordner.
    Kunst kommt von können und nicht von wollen, sonst hieße es Wunst!

    Script1 schrieb:

    Genau an dieser Stelle
    Ich vermute, dass Du noch nicht verinnerlicht hast, dass jede Zeile Deines Codes, die Du nicht explizit getestet hast, falsch ist!
    Vermutungen nützen da nix.
    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!
    Hallo,
    ich kenne mich leider noch nicht so gut wie ihr damit aus.
    Ich habe unter der Aufrufliste sowas gelesen:
    TEST.exe!TEST.xxxform.DecryptImage(String encryptedFile, String keyFile) Zeile 97 Basic
    TEST.exe!TEST.xxxform.S_Screen_Tick(Object sender, System.EventArgs e) Zeile 208 Basic

    Ich habe ganz oben die Option Strict On gesetzt:
    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler BC30512 "Option Strict On" lässt keine impliziten Konvertierungen von "Long" in "Integer" zu.

    Ich habe probiert und probiert und leider noch nicht richtig hin bekommen.
    Könntet ihr mir vielleicht ein passenden Quellcode dazu geben? Darüber wäre ich sehr dankbar.
    Bilder
    • Pic_1.PNG

      161,95 kB, 1.094×610, 20 mal angesehen
    • Pic_2.PNG

      51,44 kB, 1.207×284, 21 mal angesehen

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

    Script1 schrieb:

    ich kenne mich leider noch nicht so gut wie ihr damit aus.
    Dann mach doch einfach ein paar einfachere Übungen, bis Du Dich auskennst:
    [Sammelthread] Programmieren, aber was? (Programmideen)
    ====
    Wo kommt den der Long-Wert 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!

    Script1 schrieb:

    Könntet ihr mir vielleicht ein passenden Quellcode dazu geben?
    Zum einen: Wahrscheinlich hat niemand Lust dazu.
    Wir sehen den Sinn des Forums darin, Leuten das Programmieren beizubringen - fertige Codes helfen da annähernd überhaupt nicht.
    Zum andern: kann man nicht wissen, was bei deim Programm der Fehler ist.
    Wurde schon gesagt: Am Ende hats gar keinen Fehler, solange man das richtige in ieine Textbox einträgt..
    Der Long Wert kommt genau bei:

    Public Function DecryptImage(BayVal ...)
    ...
    Using ...
    encryptedBytes = New Bytes(fs.Length - 1) {}
    ...

    Using fs As New FileStream(keyFile, FileMode.Open)
    (keyBytes = New Bytes(fs.Length - 1)) {}
    ...

    Und bei Date ist unter Option Strict On:
    TB2_SceenUhr.Text = System.DateTime.Now

    Script1 schrieb:

    Der Long Wert kommt genau bei:
    Ja wo kommt er denn nun?
    Aus den 3 Punkten?
    Poste bitte gefälligst komplette Codezeilen.
    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!
    Also der Long Wert kommt bei:

    VB.NET-Quellcode

    1. Public Function DecryptImage(ByVal encryptedFile As String, ByVal keyFile As String) As Image
    2. Dim encryptedBytes As Byte()
    3. Using fs As New FileStream(encryptedFile, FileMode.Open)
    4. encryptedBytes = New Byte[size=18]([color=#FF0000][u]fs.Length - 1[/u][/color][/size]) {}
    5. fs.Read(encryptedBytes, 0, CInt(fs.Length))
    6. End Using
    7. Dim keyBytes As Byte()
    8. Using fs As New FileStream(keyFile, FileMode.Open)
    9. keyBytes = New Byte[size=18]([u][color=#FF0000]fs.Length - 1[/color][/u][/size]) {}
    10. fs.Read(keyBytes, 0, CInt(fs.Length))
    11. End Using
    12. Dim originalBytes As Byte() = New Byte(encryptedBytes.Length - 1) {}
    13. Vernam(encryptedBytes, keyBytes, originalBytes)
    14. Dim ic As New ImageConverter()
    15. Return TryCast(ic.ConvertFrom(originalBytes), Image)
    16. End Function
    17. Private Sub T1_Screen_Tick(sender As System.Object, e As System.EventArgs) Handles T1_Screen.Tick
    18. If Not IO.Directory.Exists(Pfad & "\" & Ordnername.Text) Then
    19. Dim rn1 As New Random
    20. Ordnername.Clear()
    21. Dim Chars1() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray
    22. For i As Integer = 0 To 2
    23. Ordnername.AppendText(Chars1(rn1.Next(Chars1.Length)))
    24. Next
    25. IO.Directory.CreateDirectory(Pfad & "\" & Ordnername.Text)
    26. End If
    27. TB2_ScreenUhr.Text = ""
    28. TB2_ScreenUhr.Text = [size=18][color=#008000][u]System.DateTime.Now[/u][/color][/size]
    29. Dim sText As String = TB2_ScreenUhr.Text
    30. sText = sText.Replace(":", "")
    31. sText = sText.Replace(".", "")
    32. sText = sText.Replace(" ", "")
    33. Dim stamp = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss")
    34. TB2_ScreenUhr.Text = sText
    35. Dim bounds As Rectangle
    36. Dim screenshot As System.Drawing.Bitmap
    37. Dim graph As Graphics
    38. bounds = Screen.PrimaryScreen.Bounds
    39. screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    40. graph = Graphics.FromImage(screenshot)
    41. graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
    42. ScreenBox.Image = screenshot
    43. Dim originalImage As Image = ScreenBox.Image
    44. EncryptImage(originalImage, Pfad & "\" & Ordnername.Text & "\" & TB2_ScreenUhr.Text, Pfad & "\" & Ordnername.Text & "\" & TB2_ScreenUhr.Text & ".dat")
    45. End Sub
    46. '...
    47. '...
    48. Dim folder As String = Pfad & "\" & Ordnername.Text & "\"
    49. For Each file In IO.Directory.GetFiles(folder, "*.*", IO.SearchOption.TopDirectoryOnly)
    50. TB2_ScreenUhr.Text = ""
    51. TB2_ScreenUhr.Text = IO.Path.GetFileName(file)
    52. Dim newImage As Image = DecryptImage(folder & TB2_ScreenUhr.Text, folder & TB2_ScreenUhr.Text & ".dat")
    53. ' Bild in Datei speichern:
    54. newImage.Save(folder & TB2_ScreenUhr.Text & ".jpg")
    55. Next


    Also das Rot markierte ist der Long Wert und Grün ist Date Wert
    encryptedBytes = New Byte(fs.Length - 1) {}
    keyBytes = New Byte(fs.Length - 1) {}
    TB2_ScreenUhr.Text = System.DateTime.Now
    @Script1 What :?:
    "Der Fehler kommt in Zeile 42" oder so wäre ein guter Hinweis.
    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!
    Ehm, bevor RfG gleich explodiert. Wir interessieren uns nicht dafür, was in Zeile#42 steht, sondern in welcher konkreten Zeile Dein Fehler kommt. Also: In welcher Zeile kommt der Fehler?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    sorry, das habe ich jetzt falsch verstanden.
    Der Fehler kommt in Zeile 4, 9 und 31.
    Sorry das es unleserlich ist, ich habe dies versucht rot zu markieren.

    Also in Zeile 4 steht:

    VB.NET-Quellcode

    1. encryptedBytes = New Byte(fs.Length - 1) {}


    In Zeile 9 steht:

    VB.NET-Quellcode

    1. keyBytes = New Byte(fs.Length - 1) {}


    und in Zeile 31 steht:

    VB.NET-Quellcode

    1. TB2_ScreenUhr.Text = System.DateTime.Now