Precisa de ajuda para descomprimir os dados zlib armazenados no código de barras asteca (Deutsche Bahn Ticket)

Premissa

Estou tentando decodificar os dados do formato de código de barras atualmente usado nos bilhetes emitidos pela Deutsche Bahn (ferrovia alemã). Eu encontrei issosite muito útil (alemão) que já faz algo semelhante e oferece umascript python.

O site afirma que os dados são compactados comzlib, o blob resultante é assinado com o DSA e tudo é armazenado no código de barras (formato asteca).Exemplo de um código de barras

Problema

Eu usei o script fornecido no site para decodificar com êxito um ticket. Instalou a biblioteca python-pyasn1. Leia o código de barras (usadoBCTester conforme as instruções, teve alguns problemas com o aplicativo NeoReader) e converteu o resultado em hexadecimal. Salvei os dados hexadecimais como arquivo de texto sem formatação (como por algum motivo exigido pelo script) e analisou o arquivo com o script. Funcionou.

Mas o script está fazendo muito. Eu gostaria de fazer a análise sozinho, mas não consigo fazer com que a descompressão do zlib funcione e compreendo muito pouco do código para fazer sentido. Não conheço quase nenhum Python. Eu tenho alguma experiência em programação, no entanto.

Se você simplesmente olhar para os dados do código de barras, será assim:https://gist.github.com/oelna/096787dc18596aaa4f5f

A primeira pergunta seria: O que é a assinatura DSA e preciso separá-la dos dados compactados reais primeiro?

O segundo: O que poderia parecer um script python simples que lê o blob do código de barras de um arquivo e simplesmente o descompacta, para que eu possa analisar ainda mais o formato. Eu tinha algo em mente como

#!/usr/bin python

import zlib

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

print zlib.decompress(ticket)

mas não está funcionando. Qualquer dica na direção certa seria apreciada.

Aqui estão os dados hexadecimais que podem ser lidos pelo script se salvos em um arquivo:

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
Atualização / solução:

A dica de Mark Adler me colocou no caminho certo. Levei horas, mas criei uma solução funcional para esse problema em particular. Se eu fosse mais esperto, teria reconhecido o cabeçalho zlib78 9C no deslocamento 68. Simplesmente divida os dados nesse ponto e a segunda metade descompacta sem reclamar. Esteja avisado, muito tristepython

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)

Se houver uma solução fácil para isso, fique à vontade para comentar. Vou continuar trabalhando nisso um pouco mais e tentar torná-lo uma solução mais robusta que procure ativamente o cabeçalho zlib, sem codificar o deslocamento. A primeira metade é um código identificador, como#UT010080000060,, seguido por umASN.1&nbsp;Assinatura DSA, que felizmente não preciso verificar ou modificar.