La última vez que viajé en tren me di cuenta que el código que la compañía me dio no fue un código QR, sino uno ligeramente diferente. Era un código AZTEC. Ambos son muy parecidos, sobre todo porque contienen información digitalizada en una imagen bidimensional, pero son fácilmente distinguibles a simple vista. Todos los códigos AZTEC tienen un cuadradito en el centro (que visto desde arriba podría parecerse a una pirámide azteca), mientras que todos los códigos QR tienen tres cuadraditos en las esquinas y en ocasiones otros cuadraditos más pequeños en el centro o en otra esquina.
Cómo no, cogí una aplicación del móvil para leer códigos bidimensionales y corrí a escanearlo, para ver qué información contenía. Y termino escaneando la siguiente información: En este caso estamos viendo un código de un billete de Renfe (los dígitos con asterisco están para ofuscar el código):
7427****54782010710409509/07/202109:280017000002210000402A0000000000000000000000000000000000000000007427****5478217000221000907210409500402A030L**UUN..4X**K00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000MCwCFAxzbtEgaVQ1tTkGcCsM98lhW29sAhQfHtK9vMbsq7xbJOxQ2cRWG/oRDg==~~~~~~~~~~~~
En ese extracto se pueden ver cosas como el número de billete, la fecha y la hora. Buscando un poco más podemos incluso identificar el vagón coche y el asiento asignado. En este caso podemos ver también el localizador y el código para el combinado cercanías. Pero, poco más: el resto de detalles se nos escapan a la vista. He estado indagando un poco en internet y he visto que hay un estándar común para emitir códigos AZTEC para viajes en tren, en este documento publicado por la ERA (European Rail Agency) y parece que también validado por la UIC.
Peero no, amigos. En España no hemos decidido seguir ninguno de esos estándares y «tenemos» el nuestro propio. Eso sí, me ha sorprendido ver que, al menos, está en cierta parte estandarizado por Adif. Supongo que también es porque se encarga de hacer el control de entrada a los viajeros en muchas estaciones, y los códigos que deben emitir las empresas ferroviarias deben tener puntos en común.
Formato del código en ADIF
Esta información la encontramos en el documento de la declaración de la red de Adif. En la última versión publicada hasta este momento, la del 30 de junio de 2021, aparece explicado en la sección 7.3.2.5. Requisitos generales y condiciones de acceso, páginas 236 – 237. La tabla que nos interesa es la siguiente:
Orden | Campo del código AZTEC | Posiciones | Observaciones |
---|---|---|---|
1 | Un número de control o secuencial propio de cada empresa | 13 | Por lo que he visto suele coincidir con el número del billete |
2 | Empresa | 5 | |
3 | Número comercial del tren | 5 | |
4 | Fecha de viaje | 10 | dd/mm/yyyy |
5 | Hora de salida del tren | 5 | hh:mm |
6 | Estación de origen | 7 | En caso de billetes nacionales los dos primeros dígitos serán 00 |
7 | Estación de destino | 7 | En caso de billetes nacionales los dos primeros dígitos serán 00 |
8 | Coche | 3 | Tren sin reserva vendrá no relleno |
9 | Asiento | 3 | Tren sin reserva vendrá no relleno |
10 | Billete combinado | 10 | En este caso se completará con 00 |
11 | Estación intermedia del billete combinado | 7 | En caso billetes nacionales los dos primeros dígitos serán 00 |
12 | Reservado ADIF | 33 | Vacío: completar con 00 |
13 | Espacio para el operador | 316 | |
14 | Firma SHA1withDSA | 100 | Firma de los campos anteriores con el algoritmo SHA1withDSA |
La buena noticia es que, tal y como podéis ver, todos estos campos son públicos. Sin embargo, hay otra noticia no tan buena para nosotros: el campo 13 está reservado para el operador, y éste tiene libertad para poner los datos que considere necesarios.
Campo del operador: Ouigo
He de admitir que me puse a investigar esto después de escanear un billete de Ouigo. Y es que en comparación a uno de Renfe, contiene información codificada de una forma extraña, que hasta ahora me ha sido imposible de descifrar. Por seguridad, he ofuscado, de los campos públicos, el número de billete y parte de la fecha. Y del campo privado, he ofuscado parte de lo que creo que es el número de la reserva. Porque si lo observáis con detenimiento… veréis que no entendéis nada de lo que pone
02****6186826037800647118/**/202107:050060000007180100705ANO000000000000000000000000000000000000000000IE0****4/s/LMy87Ort5fpyi0lMNOOpwS5IirWQupu5ZkN7BFZmY8zr/8AWa9/7nDDJLwNFgcJdaH4H02wtXWsAylI3onESc0W1xS/OPeDcGjqhMrLZxx/G3U0QFU73McmHZnGGxPTm9ba/iCUulHFpLf/kpUiUZCSfFOxuJc2K2BSrUnHYWy7907pjf2mdgAAAAAAAAAAAAAAAAAAAA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000MC0CFGBp4oT//lq0tHg0amCEYJFEv4fNAhUAzucFxdCkFctUB8enQqkinb1Fpdw=~~~~~~~~~~~~
A priori, parece ser algún tipo de contenido binario que está codificado como base64. En mi intento por hacer ingeniería inversa de este «trozo» de texto, he encontrado algunas herramientas o repositorios interesantes. Parece que la DB en alemania también emite tickets con un código AZTEC y hay alguien que ha creado librerías para «descifrarlo», como esta de ticket-parser, o este otro script. Aunque en este caso no he llegado a ningún resultado útil, me he encontrado con Cyberchef, una herramienta que te permite aplicar diferentes funciones a este trozo de texto para intentar descifrar qué es lo que pone ahí.
Por el momento, sigo buscando y toca esperar a dar con la tecla correcta.
Iryo
Otros operadores, como iryo, por suerte, no tienen codificado de forma tan extraña la información de sus billetes, sino que simplemente, tal y como hace Renfe, el campo del operador lo tienen vacío.
Un saludo!
Deja una respuesta