Premise
Ich helfe ich versucht, gespeichert zlib Dekomprimieren von Daten die Daten vom Barcode-Format, das von der Deutschen Bahn (Deutsch Eisenbahn) ausgestellt aktuell Tickets verwendet zu dekodieren. Ich habe diese very useful website (deutsch) gefunden, die schon eine ähnliche Sache macht und eine python script anbietet.Benötigen Sie in Aztec Barcode (Deutsche Bahn Ticket)
Die Website besagt, dass die Daten mit zlib
komprimiert sind, der resultierende Blob ist mit DSA signiert und alles ist im Barcode (Aztec-Format) gespeichert. Example of such a barcode
Problem
ich die auf der Website erfolgreich ein Ticket zu entschlüsseln bereitgestellt Skript verwendet haben, um. Installierte die Bibliothek python-pyasn1. Lesen Sie den Barcode (verwendet BCTester gemäß Anweisungen, hatte einige Probleme mit NeoReader App) und konvertierte das Ergebnis in Hex. Gespeichert die Hex-Daten als Nur-Text-Datei (wie aus irgendeinem Grund vom Skript benötigt) und analysierte die Datei mit dem Skript. Es funktionierte.
Aber das Skript macht zu viel. Ich möchte das Parsing selbst machen, aber ich kann die zlib-Dekomprimierung nicht zum Laufen bringen und ich verstehe wenig von dem Code, um daraus einen Sinn zu ziehen. Ich kenne fast kein Python. Ich habe jedoch etwas Programmiererfahrung.
Wenn Sie einfach auf die Daten aus dem Barcode aussehen, sieht es wie folgt aus: https://gist.github.com/oelna/096787dc18596aaa4f5f
Die erste Frage wäre: Was die DSA-Signatur ist und ich es von den tatsächlichen geteilt müssen komprimierte Daten zuerst?
Die zweite: ein einfacher Python-Skript wie das Was aussehen könnte, liest den Barcode Klecks aus einer Datei und einfach dekomprimiert sie, so kann ich weiter das Format parsen. Ich hatte etwas im Sinn wie
#!/usr/bin python
import zlib
ticket = open('ticketdata.txt').read()
print zlib.decompress(ticket)
aber es funktioniert nicht. Jeder Hinweis in die richtige Richtung wäre willkommen.
Hier sind die Hex-Daten, die durch das Skript gelesen werden kann, wenn in eine Datei gespeichert:
23 55 54 30 31 30 30 38 30 30 30 30 30 31 30 2c 02 14 1c 3d e9 2d cd 5e c4 c0 56 bd ae 61 3e 54 ad a1 b3 26 33 d2 02 14 40 75 03 d0 cf 9c c1 f5 70 58 bd 59 50 a7 af c5 eb 0a f4 74 00 00 00 00 30 32 37 31 78 9c 65 50 cb 4e c3 30 10 e4 53 2c 71 43 4a d9 f5 2b 36 b7 84 04 52 01 55 51 40 1c 51 01 23 2a 42 0e 21 15 3f c7 8d 1f 63 36 11 52 2b 7c f1 78 76 76 66 bd f7 8f 4d 5d 54 c4 44 ce 10 05 d2 eb 78 5b ac 32 7b b4 77 c8 11 6b 62 c7 d6 79 aa ea aa 16 e1 b2 22 4d c4 01 ad 36 58 61 ca 6b 30 c6 e5 64 a0 b6 97 0f a6 a9 6f d6 71 df c7 cf 3e 7f 37 93 66 8e c6 71 de 92 4c c0 e1 22 0d fd 57 7a cb ee b6 cf ef 69 54 fd 66 44 05 31 d0 03 18 01 05 40 04 70 9c 51 46 ad 38 49 33 00 86 20 dd 42 88 04 22 5f a6 a1 db f6 78 79 d4 79 95 76 1f 3f df fd e7 98 86 16 b1 30 0b 65 d6 3c bd 2a 15 ce d8 ab e5 79 9d 47 7b da 34 13 c7 34 73 5a 6b 0b 35 72 d9 5c 0d bb ae 53 aa e8 5f 86 b4 01 e9 25 8d 0d 50 8e 72 3c 39 3c b2 13 94 82 74 ce 2d c7 b3 41 8b ed 4c 9f f5 0b e2 85 6c 01 8c fe c7 b8 e9 87 8c d9 f1 90 28 a3 73 fe 05 6d de 5f f1
Update/Lösung:
Mark Adler Spitze setzte mich auf dem richtigen Weg. Es hat Stunden gedauert, aber ich habe eine funktionierende Lösung für dieses spezielle Problem zusammengehackt. Wäre ich schlauer gewesen, hätte ich beim Offset 68 den zlib-Header 78 9C
erkannt. Einfach die Daten an dieser Stelle aufteilen und die zweite Hälfte ohne Beanstandung dekomprimieren. Seien Sie gewarnt, sehr traurig python
dsa_signature = ''
zlib_data = ''
cursor = 0
with open('ticketdata.txt', "rb") as fp:
chunk = fp.read(1)
while chunk:
if(cursor < 68):
dsa_signature += chunk
else:
zlib_data += chunk
chunk = fp.read(1)
cursor = cursor + 1
print "\nSignature:"
print "%s\n" % dsa_signature
print "\nCompressed data:"
print "%s\n" % zlib_data
print "\nDecoded:"
print zlib.decompress(zlib_data)
Wenn es eine einfache Lösung für dieses Problem ist, zu kommentieren frei fühlen. Ich werde weiter daran arbeiten für ein wenig mehr und versuchen, es zu einer robusteren Lösung, die aktiv die Zlib-Header sucht, ohne den Offset zu kodieren. Die erste Hälfte ist ein Identifikationscode, wie #UT010080000060,
, gefolgt von einer DSA-Signatur ASN.1
, die ich glücklicherweise nicht verifizieren oder ändern muss.
Danke! Es hat eine Weile gedauert, aber mit deiner Hilfe habe ich eine Lösung gefunden. Ich habe die Frage entsprechend aktualisiert. – oelna