2015-12-22 3 views
5

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.

Antwort

5

Es gibt einen vollständigen und gültigen zlib-Stream, der bei Offset 68 in Ihren Hex-Daten beginnt und bis zum Ende geht. Es dekomprimiert zu:

U_HEAD01005300802P9QAN-40501201514560DEDE0080ID0200180104840080BL020357031204GW3HEMP906012015060120151021193517S0010018Fernweh-Ticket natS00200012S0030001AS00900051-0-0S01200010S0140002S2S0150006BerlinS0160011NeumünsterS0210038B-Hbf 8 : 16 ICE794/HH-Hbf 10.16 IC2224S0230013Krull AndreaS026000213S0270019 *************** 0484S0280013Andrea # Krull S031001006.01.2015S032001006.01.2015S035000511160S0360003271

Wenn Sie Drop die fi Die ersten 68 Bytes Ihres Beispiels, zlib.decompress(), werden das obige Ergebnis liefern.

Es liegt an Ihnen herauszufinden, was die ersten 68 Bytes sind.

+0

Danke! Es hat eine Weile gedauert, aber mit deiner Hilfe habe ich eine Lösung gefunden. Ich habe die Frage entsprechend aktualisiert. – oelna