2015-12-22 27 views
5

Tiền đề

Tôi đang cố gắng để giải mã dữ liệu từ các định dạng mã vạch hiện đang được sử dụng trên vé do Deutsche Bahn (Đức đường sắt). Tôi đã tìm thấy điều này very useful website (Đức) đã làm một điều tương tự và cung cấp một python script.Cần giúp đỡ giải nén dữ liệu zlib lưu trữ trong mã vạch Aztec (Deutsche Bahn Ticket)

Trang web tuyên bố rằng dữ liệu được nén với zlib, đốm màu kết quả được ký bằng DSA và tất cả được lưu trữ trong mã vạch (định dạng Aztec). Example of such a barcode

Vấn đề

Tôi đã sử dụng kịch bản được cung cấp trên trang web để giải mã thành công một vé. Cài đặt thư viện python-pyasn1. Đọc mã vạch (sử dụng BCTester theo hướng dẫn, gặp sự cố với ứng dụng NeoReader) và chuyển đổi kết quả thành hex. Lưu dữ liệu hex dưới dạng tệp văn bản thuần túy (vì lý do nào đó được yêu cầu bởi tập lệnh) và phân tích cú pháp tệp bằng tập lệnh. Nó đã làm việc.

Nhưng tập lệnh đang hoạt động quá nhiều. Tôi muốn tự phân tích cú pháp, nhưng tôi không thể giải nén zlib để làm việc và tôi hiểu rất ít mã để hiểu được nó. Tôi biết hầu như không có Python. Tôi có một số kinh nghiệm lập trình, mặc dù.

Nếu bạn chỉ cần nhìn vào các dữ liệu từ các mã vạch, nó trông như thế này: https://gist.github.com/oelna/096787dc18596aaa4f5f

Câu hỏi đầu tiên sẽ là: gì là chữ ký DSA và tôi cần phải chia nó ra khỏi thực tế dữ liệu nén đầu tiên?

Thứ hai: Chữ viết mã đơn giản trông giống như đọc mã vạch từ tệp và chỉ giải nén nó, vì vậy tôi có thể phân tích cú pháp định dạng. Tôi có điều gì đó trong đầu như

#!/usr/bin python 

import zlib 

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

print zlib.decompress(ticket) 

nhưng không hoạt động. Bất kỳ gợi ý nào về đúng hướng sẽ được đánh giá cao.

Đây là dữ liệu hex đó là có thể đọc được bởi kịch bản nếu lưu vào một tập tin:

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 

Cập nhật/Giải pháp: tip

Đánh dấu Adler thiết cho tôi đi đúng hướng. Nó đã cho tôi giờ, nhưng tôi đã hack cùng một giải pháp làm việc cho vấn đề cụ thể này. Nếu tôi đã thông minh hơn, tôi sẽ nhận ra tiêu đề zlib 78 9C ở độ lệch 68. Đơn giản chỉ cần tách dữ liệu tại thời điểm này và giải nén nửa sau mà không có khiếu nại. Được cảnh báo, rất buồn 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) 

Nếu có giải pháp dễ dàng, vui lòng bình luận. Tôi sẽ tiếp tục làm việc này thêm một chút nữa và cố gắng làm cho nó trở thành một giải pháp mạnh mẽ hơn, chủ động tìm kiếm tiêu đề zlib mà không cần mã hóa bù đắp. Nửa đầu là mã nhận dạng, như #UT010080000060,, theo sau là chữ ký DSA ASN.1, thật may là tôi không cần phải xác minh hoặc sửa đổi.

Trả lời

5

Có một dòng zlib hoàn chỉnh và hợp lệ bắt đầu tại offset 68 trong dữ liệu hex của bạn và sẽ kết thúc. Nó decompresses đến:

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

Nếu bạn thả fi rst 68 byte trong ví dụ của bạn, zlib.decompress() sẽ trả lại ở trên.

Việc tùy chọn 68 byte đầu tiên là tùy thuộc vào bạn.

+0

Cảm ơn! Phải mất một thời gian, nhưng với sự giúp đỡ của bạn, tôi đã tìm ra một giải pháp. Tôi đã cập nhật câu hỏi cho phù hợp. – oelna

Các vấn đề liên quan