5

前提

ドイツ鉄道 (ドイツ鉄道) が発行するチケットで現在使用されているバーコード形式からデータをデコードしようとしています。すでに同様のことを行っており、python スクリプトを提供しているこの非常に便利な Web サイト(ドイツ語) を見つけました。

Web サイトには、データは で圧縮されzlib、結果のブロブは DSA で署名され、そのすべてがバーコード (Aztec 形式) で保存されると記載されています。 そのようなバーコードの例

問題

Web サイトで提供されているスクリプトを使用して、チケットを正常にデコードしました。python-pyasn1 ライブラリをインストールしました。バーコードを読み取り (指示に従ってBCTesterを使用しましたが、NeoReader アプリに問題がありました)、結果を 16 進数に変換しました。16進データをプレーンテキストファイルとして保存し(何らかの理由でスクリプトで必要なため)、スクリプトでファイルを解析しました。出来た。

しかし、スクリプトはやりすぎです。私は自分で解析を行いたいのですが、zlib 解凍を機能させることができず、それを理解するためのコードをほとんど理解していません。私はPythonをほとんど知りません。ただし、プログラミング経験はあります。

バーコードのデータを単純に見ると、次のようになります: https://gist.github.com/oelna/096787dc18596aaa4f5f

最初の質問は次のとおりです: DSA 署名とは何ですか? 最初に実際の圧縮データからそれを分割する必要がありますか?

2 つ目: ファイルからバーコード BLOB を読み取り、単純に圧縮解除する単純な Python スクリプトはどのようなもので、形式をさらに解析できます。みたいなのが頭にあった

#!/usr/bin python

import zlib

ticket = open('ticketdata.txt').read()

print zlib.decompress(ticket)

しかし、それは機能していません。正しい方向へのヒントをいただければ幸いです。

ファイルに保存された場合にスクリプトで読み取ることができる 16 進データは次のとおりです。

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

更新/解決策:

Mark Adler のヒントは、私を正しい軌道に乗せました。何時間もかかりましたが、この特定の問題に対する有効な解決策をまとめました。もっと賢かったら78 9C、オフセット 68 にある zlib ヘッダーを認識できたでしょう。この時点でデータを分割するだけで、後半は問題なく解凍されます。注意してください、非常に悲しいです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)

これに対する簡単な解決策がある場合は、お気軽にコメントしてください。もう少しこの作業を続けて、オフセットをハードコーディングせずに zlib ヘッダーを積極的に探し出す、より堅牢なソリューションにしようとします。前半は のような識別子コードで#UT010080000060,、その後にASN.1DSA 署名が続きます。幸いなことに、検証や変更を行う必要はありません。

4

1 に答える 1