Benötigen Sie Hilfe beim Dekomprimieren von Zlib-Daten, die im Aztec-Barcode (Deutsche Bahn Ticket) gespeichert sind.
Ich versuche, die Daten aus dem Barcode-Format zu entschlüsseln, das derzeit auf Fahrkarten der Deutschen Bahn verwendet wird. Ich habe dieses @ gefundsehr nützliche Website das macht schon was ähnliches und bietet einpython script.
Die Website gibt an, dass die Daten mit @ komprimiert werdzlib
, der resultierende Blob wird mit DSA signiert und alles im Barcode (Aztec-Format) gespeichert.Beispiel eines solchen Barcodes
Ich habe das Skript auf der Website verwendet, um ein Ticket erfolgreich zu dekodieren. Installierte die python-pyasn1 Bibliothek. Lesen Sie den Barcode (verwendet BCTester gemäß Anleitung, hatte einige Probleme mit der NeoReader-App) und konvertierte das Ergebnis in hexadezimal. Die hexadezimalen Daten wurden als reine Textdatei gespeichert (wie vom Skript aus irgendeinem Grund gefordert) und die Datei mit dem Skript analysiert. Es funktionierte
Aber das Skript macht zu viel. Ich würde das Parsen gerne selbst durchführen, aber ich kann die Zlib-Dekomprimierung nicht zum Laufen bringen, und ich verstehe zu wenig vom Code, um einen Sinn daraus zu machen. Ich kenne fast kein Python. Ich habe allerdings einige Programmiererfahrung.
Wenn Sie sich einfach die Daten aus dem Barcode ansehen, sieht das so aus:https: //gist.github.com/oelna/096787dc18596aaa4f5
Die erste Frage wäre: Was ist die DSA-Signatur und muss ich sie zuerst von den tatsächlich komprimierten Daten trennen?
Der Zweite Wie könnte ein einfaches Python-Skript aussehen, das den Barcode-Blob aus einer Datei liest und einfach dekomprimiert, damit ich das Format weiter analysieren kann. 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 vom Skript gelesen werden können, wenn sie in einer Datei gespeichert werden:
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 Adlers Tipp hat mich auf den richtigen Weg gebracht. Es hat Stunden gedauert, aber ich habe eine funktionierende Lösung für dieses spezielle Problem gefunden. Wenn ich schlauer gewesen wäre, hätte ich den zlib-Header erkannt78 9C
bei Offset 68. Teilen Sie einfach die Daten an diesem Punkt auf, und die zweite Hälfte wird ohne Beanstandung dekomprimiert. Seien Sie gewarnt, sehr traurigpython
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 gibt, können Sie dies gerne kommentieren. Ich werde noch ein wenig weiter daran arbeiten und versuchen, es zu einer stabileren Lösung zu machen, die aktiv nach dem zlib-Header sucht, ohne den Offset fest zu codieren. Die erste Hälfte ist ein Identifizierungscode wie#UT010080000060,
, gefolgt von einemASN.1
DSA-Signatur, die ich zum Glück nicht überprüfen oder ändern muss.