Verschlüsseltes Zip mit nicht-ASCII Passwort entschlüsseln

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Verschlüsseltes Zip mit nicht-ASCII Passwort entschlüsseln

    Hi.

    Ich sitze gerade an einem ziemlichen Problem. Ich bekomme Dateien in verschlüsselten ZIP-Archiven angeliefert (die werden wohl durch ein C-Programm erstellt). Aus Sicherheitsgründen ist dieses Archiv mit einem Passwort verschlüsselt. Dieses besteht aber aus (25) nicht-ASCII Zeichen. Ich habe dazu nur die Byte-Reihenfolge mitgeteilt bekommen. Nun bekomme ich das Archiv einfach nicht entpackt.

    Habe es sowohl mit SharpZipLib als auch Ionic versucht. Das Passwort übergebe ich, da beide nur einen String akzeptieren, mittels System.Text.Encoding.Default.GetString(new Byte() { 189, 185, 149, ... }). Dort trage ich die ganze - mir bekannte Bytefolge ein. Beim Versuch zu entpacken, bekomme ich aber bei beiden ein "Bad Password". Die Übergabe als String scheint also nicht zu funktionieren.

    Wie kann ich also ein Archiv mittels einem ByteArray entschlüsselt entpacken? Hat da eventuell jemand einen Lösungsansatz?
    Ich muss das Passwort nicht knacken. Ich habe es ja. Ich weiß nur nicht, wie ich in VB.NET das Passwort sauber statt einem String in einem Byte-Array übergeben kann.

    Das "geknackte" Passwort dürfte auch nur eine Zeichenkette ergeben mit 25 Sonderzeichen. Mit denen ich das Archiv auch nicht auf bekomme, da ja das Byte-Array in einen String gewandelt nicht funktioniert. Ein (vom Hersteller) geliefertes Programm (C++) kann das selbe Archiv ja öffnen, exportiert aber nicht die Daten daraus, die ich benötige. Und vom Hersteller bekomme ich nichts außer dem "Passwort" in Byte-Form.
    Versuch mal zum Testen folgendes:

    Starte deinen Texteditor, sorge für Einstellung Ansi (nicht UTF8 oder Unicode).

    Dann gibst du die Bytes folgendermaßen ein:
    ALT-Taste drücken und festhalten.
    Auf dem Nummernblock 189 eingeben
    Alt-Taste loslassen.
    ALT-Taste drücken und festhalten.
    Auf dem Nummernblock 185 eingeben
    Alt-Taste loslassen.
    ALT-Taste drücken und festhalten.
    Auf dem Nummernblock 149 eingeben.
    Alt-Taste loslassen.
    usw.

    Statt 189,185,149 selbstverständlich deine Zahlen eingeben

    Anschließend kopierst du den String und versuchst damit die Zipdatei damit zu öffnen.
    Ich habe das mal probiert.

    Habe zum Testen mal 7-Zip verwendet. Wenn ich da dass Passwort so eingeben (25x3 Ziffern), dann entpackt 7-Zip das korrekt.

    Gebe ich im .NET bei der Eigenschaft "Password" den String genauso ein, habe ich im Visual Studio genau die selbe Zeichenkette - aber Ionic/Sharpzip können nicht entpacken und liefern "BadPassword" zurück. :-|

    Die verwendeten Bytes liegen zwischen 137 und 231. Scheinbar behandelt .NET diese anders als z.B. 7-Zip. Habe extra mal hart die Codepage 1252 für das Encoding verwendet, aber auch das bringt nichts.

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

    Wenn ich da dass Passwort so eingeben (25x3 Ziffern), dann entpackt 7-Zip das korrekt.


    Gebe ich im .NET bei der Eigenschaft "Password" den String genauso ein, habe ich im Visual Studio genau die selbe Zeichenkette

    Kann nicht stimmen. Auch wenn du 'dieseben' Zeichen siehst, ist die erzeugte Zeichenkette noch lange nicht gleich.


    Speicher die net-Zeichenkette in ener Datei und vergleich' sie mit deiner von Hand eingebebenen.

    Oder testweise den String durch CHRW(189) & CHRW(186) & usw. erzeugen und mit encoding.defaultt an die zip-Datei übergeben.

    Am Besten, du zeigst deinen Code.
    Soviel Code ist es noch nicht, weil ich im Moment erst einmal nur das entpacken in einem Testprojekt ausprobiere.

    Als Imports habe ich:

    VB.NET-Quellcode

    1. Imports Ionic.Zip
    2. Imports ICSharpCode.SharpZipLib.Zip


    Im Form-Load habe ich nun mal beide Varianten (Ionic/SharpZip).

    VB.NET-Quellcode

    1. Dim fz As New FastZip()
    2. fz.Password = Chr(189) & Chr(185) & Chr(149) & Chr(193) & Chr(188) '"¢╣ò┴╝"
    3. fz.ExtractZip("E:\Test\MedicalReports_2013-09-05_06.00.00.zip", "E:\Test\Extract", "*.*")
    4. fz = Nothing


    Bzw.

    VB.NET-Quellcode

    1. Dim zip As ZipFile = ZipFile.Read("E:\Test\MedicalReports_2013-09-05_06.00.00.zip")
    2. zip.Password = System.Text.Encoding.GetEncoding(1252).GetString(New Byte() {189, 185, 149, 193, 188}) '"¢╣ò┴╝"
    3. zip.ExtractAll("E:\Test\Extract")
    4. zip.Dispose()


    Ich habe die Byte-Sequenz verkürzt, zur technischen Demonstration sollte es reichen.

    Das ein String in UTF-8/16 gespeichert anders binär abgelegt wird als in ANSI-1252 ist mir schon klar. Darum versuche ich ja euch mit dem festen Encoding das Passwort zu setzen. Beide ZIP-Klassen scheinen das aber jenseits der der normalen Zeichensätze nicht korrekt in einen Byte-Schlüssel umzusetzen.

    Testweise habe ich den vollständigen String, den ich als Passwort angegeben habe, mal aus der IDE in das Fenster von 7-Zip kopiert, der entpackt es wieder richtig. Nur aus dem Framework heraus will es einfach nicht klappen.
    Nein. Das Problem ist, dass beide von mir getesteten ZIP-Assemblies offenbar nicht in der Lage sind, eine ZIP-Datei mit einem Passwort, welches aus nicht Standard-Zeichen besteht, zu entpacken. Aus dem angegebenen Passwort-String machen wohl beide ein falsches Byte-Array als Schlüssel draus.
    Ja. Wenn ich ein Archiv selbst mit Passwort packe, z.B. "Test1234" oder auch "!Testpasswort§$" geht das. Also quasi alle Zeichen, die im ASCII Satz enthalten sind. Komme ich aber in den von dem Archiv verwendeten Bereich der Zeichen, klappt offensichtlich die Übergabe des Passworts nicht bzw. es wird der falsche Decrypt-Schlüssel daraus erstellt.

    Ich hatte gestern noch Kontakt zum Entwickler der Firma, die diese Archive produzieren. Abgesehen davon dass er mir wieder klar machen wollte, ich solle einfach eine ordentliche Programmiersprache (wie sein geliebtes Visual C++) verwenden, ist es wohl so, dass beim Erzeugen der Archive der Schlüssel als Char-Array bzw. Byte-Array übergeben wird. Und da scheint das Problem der .NET Implementationen zu liegen. Sie zeigen mir zwar in der IDE das richtige Passwort als String an, scheinen dann aber beim Erzeugen des Schlüssels ein anderes Byte-Array daraus zu machen, sie interpretieren die Zeichen quasi falsch. Und da ich keine Möglichkeit sehe, weder bei SharpZip noch bei Ionic, dass Passwort oder den Schlüssel direkt als Byte-Array anzugeben, werde ich unter .NET wohl diese Archive nicht entpackt bekommen.