Una tarde me disponía a salir con mi coche del aparcamiento subterráneo
de un conocido centro comercial. La cantidad de personas que se encontraban
en mi misma situación era tal que los encargados del parking, al ver el
cuello de botella que se producía en la máquina que comprobaba el pago
del estacionamiento, decidieron desconectar ésta y dejar la barra
de paso permanente levantada. Sobre la máquina colgaron un cartel que
rezaba: "Salga directamente". Y eso fue precisamente lo que
hice.
Así
fue como salí con la tarjeta del aparcamiento, sin tener que devolverla
para que me dejasen ir. En aquel momento no le di demasiada importancia
(había pagado, de todos modos). Pero al llegar a casa, por alguna razón,
no la tiré a la basura.
Unos
meses después se me ocurrió una idea. En casa tenía uno de aquellos viejos
ordenadores Amstrad CPC con unidad de cinta. No funcionaba y hacía tiempo
que lo había destripado. Extraje el cabezal de la unidad de cinta y lo
coloqué sobre un soporte de madera hecho a medida de la tarjeta. Enchufé
la alimentación y deslicé la tarjeta por el improvisado lector. Por el
altavoz del Amstrad sonaron los crujidos y pitidos típicos de la información
digital, los mismos que producía el ordenador en vida. A continuación
conecté la salida de la unidad de cinta a una entrada del puerto
paralelo de mi 286 e hice un pequeño programa en C que representaba en
pantalla una gráfica de lo que recibía. Lo que apareció fue una onda cuadrada
de aspecto bastante irregular.
Buscando
información sobre tarjetas magnéticas en Internet descubrí el modo de
traducir la onda a una fila de ceros y unos. Yo sabía que, de alguna forma,
la fecha y hora del estacionamiento estarían codificadas en ese montón
de bits. En la Red hay mucha información sobre cómo está almacenada la
información en tarjetas que siguen las normas ISO/ANSI, como las tarjetas
de crédito, pero las máquinas de un aparcamiento no tienen ninguna necesidad
de seguir normativas. Se trata de que esas tarjetas sólo las puedan leer
ellas.
Para
descubrir el patrón que seguía mi tarjeta tenía que conseguir más, de
diferentes días y horas. Así que metí mi Amstrad destripado en el maletero
del coche. A lo largo de una semana, cada vez que aparcaba en el lugar
en cuestión, abría mi maletero, enchufaba el artefacto a una pequeña batería
y pasaba la tarjeta por el improvisado lector. La información quedaba
ahora grabada en una cinta de audio. Al llegar a casa reproducía la cinta,
introduciendo la información en el ordenador.
Para tener
una visión más global imprimí el contenido de varias tarjetas en un papel.
Cuando tenía un rato libre o la clase me parecía demasiado aburrida, sacaba
mi papel y me ponía a hacer "sopas de letras". Pronto aparecieron
los minutos. La hora, el mes y, por último, el día no tardaron.
Lo
cierto es que podía haberme dedicado a decodificar cualquier tarjeta que
ya tuviera en casa, sin necesidad de complicarme la vida con las del aparcamiento.
Pero, por alguna razón, fue aquella la que me inspiró la idea. Además,
yo ya tenía bastante claro lo que iba a hacer cuando lograse averiguar
cómo funcionaban las dichosas tarjetas...
FUNCIONAMIENTO
El uso masivo y generalizado de tarjetas magnéticas ha hecho necesaria
la aparición de normativas y standards que definan sus dimensiones, propiedades
físicas (flexibilidad, resistencia, etc.), número de pistas, medidas de
las pistas, forma de codificar la información y demás características.
Si bien no todos los fabricantes se ciñen a ellas, sí coinciden en algunos
puntos importantes. Lo que explico a continuación es válido para todas
las tarjetas de las que tengo noticia.
La banda oscura que vemos en toda tarjeta de crédito, carnet de estudiante
o bono de autobús es una banda magnética. Las bandas magnéticas están
hechas de un pigmento a base de pequeñas partículas ferromagnéticas (esto
quiere decir que, al someterlas a un campo magnético, se convierten en
pequeños imanes permanentes) embebidas en una matriz de resina. Normalmente
cada partícula produce un pequeño campo magnético pero, al estar cada
uno orientado en distinta dirección, el efecto neto que producen es como
si no existiera campo magnético en absoluto. En el momento de la grabación,
un solenoide o electroimán va pasando a lo largo de la banda. Dependiendo
del sentido en que circule la corriente eléctrica por el solenoide éste
inducirá una polaridad u otra a las partículas ferromagnéticas. De esta
forma, cuando la banda ha sido grabada, tendremos en ella una fila de
zonas en las que las partículas estarán magnetizadas en la misma dirección.
Estas zonas actuarán ahora como pequeños imanes, presentando sus polos
norte o sur a la superficie de la tarjeta. Las fronteras entre dos zonas
adyacentes, con distinta polaridad, se llaman inversiones de flujo.
La lectura se realizará con
otro solenoide (estos solenoides son lo que llamamos normalmente cabezales).
En este caso el proceso es el inverso: al deslizarse la tarjeta las inversiones
de flujo inducirán en el solenoide una corriente eléctrica (fenómeno de
reciprocidad electromagnética), que circulará en un sentido u otro dependiendo
del caso: si cambiamos de una zona norte a otra sur, la corriente circulará
en un sentido; si pasamos de una zona sur a otra norte, la corriente circulará
en sentido contrario.
Bien, éste es principio físico
en el que se basa la tecnología de las tarjetas magnéticas. Pero, ¿cómo
se almacenan los bits?. La técnica utilizada para codificar la información
digital es conocida como "bifase Aiken", "codificación
por doble frecuencia de fase coherente" o simplemente "F/2F".
Los bits están representados por celdas entre las que existe una inversión
de flujo magnético. Si en el interior de la celda (en la mitad) existe
también una inversión del flujo, la celda será un uno, en caso contrario
será un cero. Es decir, los unos están representados por una onda de frecuencia
doble que la de los ceros, y cada bit tiene una "longitud" igual
al período de la onda que representa el cero.
En la figura tenemos representado la señal que recibe el circuito digital
encargado de leer la información (tensión en función del tiempo). Cada
vez que la tensión cambia es porque el cabezal ha detectado una inversión
en el flujo magnético.
Podemos preguntarnos qué pasará
si al deslizar con nuestra mano la tarjeta por el lector hacemos un cambio
brusco en la velocidad. ¿No puede ser que, al mover la tarjeta más despacio
de repente, hagamos que el lector interprete un cero donde debería haber
un uno?. Pues bien: no. Para poder confundirlo tendríamos que disminuir
la velocidad de nuestra mano a la mitad en unas pocas milésimas de segundo.
DATOS,
DATOS, DATOS...
Ya sabemos cómo se codifican los bits. Ahora vamos a ver cómo se ordenan
estos para representar información útil.
Antes de nada explicaré cómo realizar un sencillo experimento. Sólo necesitamos
una tarjeta magnética y limaduras finas de hierro (no son tan difíciles
de conseguir). Espolvoreamos suavemente las limaduras sobre la tarjeta
y eliminamos las que no se hayan quedado adheridas a ésta mediante unos
suaves golpecitos. Veremos ante nosotros la "información" que
está guardada en la tarjeta. Si hemos escogido una tarjeta de crédito
(que son las que se ciñen a las normativas) veremos que hay tres pistas
dentro de la banda oscura, cada una de ellas de unos 3mm de grosor. Son
las tres pistas definidas en los estándares ANSI / ISO, la primera es
alfanumérica y contiene cosas como el nombre del propietario o el número
de identificación encriptado, las otras dos contienen únicamente números
(fechas de caducidad y demás). Si la tarjeta es de otro tipo lo anterior
no tiene porqué ser así. Puede haber una única pista, puede tener medio
centímetro o un milímetro de anchura...
Las tarjetas que se ajustan
a las normativas ANSI / ISO son fáciles de leer. Hay mucha información
en la Red acerca de estos formatos (ver sección de links),
así que no perderé el tiempo explicándolos. En lugar de ello utilizaré
de ejemplo para esta parte una tarjeta de parking: una de ésas que no
se ciñen al estándar. He encontrado en Internet artículos de gente que
ha intentado leer este tipo de tarjetas sin ningún éxito. La causa está
en que lo han hecho aplicando las reglas por las que se rige la pista
2 en el estándar ISO. Veremos que no tienen nada que ver.
Cuando deslizamos una tarjeta por el cabezal lector, éste produce una
señal eléctrica que algún aparato (caja registradora, microcontrolador,
ordenador...) tendrá que decodificar. Eso ya lo sabemos. Ésta señal suele
comenzar con una fila de ceros que sirve para sincronizar el lector con
los bits de la pista. A continuación vienen los datos. Por último, la
pista se acaba con una fila de bits "de relleno", que pueden
ser unos o ceros. La información puede tener distinta densidad. Así, hablamos
de "tantos bits por pulgada" o "tantos bits por centímetro".
Veamos la señal que se produce
al leer nuestra tarjeta de parking. En la figura represento la señal correspondiente
a la única pista que contiene. Nada más comenzar la pista hay una fila
de ceros, después vemos varios unos seguidos (el conjunto de pulsos con
la mitad de anchura). A partir de aquí hay mucha confusión de unos y ceros,
pero al final vuelven a ser otra vez todos ceros. Podemos observar que
la frecuencia de los ceros del final es algo mayor que la de los ceros
del principio. Esto se debe a que el movimiento de mi mano no es uniforme.
Pero, como dije antes, esto no afecta para nada a la validez de la señal.
Esta señal, tras ser interpretada por un decodificador F/2F, nos daría
la siguiente secuencia de bits (podéis comprobarlo, pero no os lo recomiendo):
...000000000001111111101000000110000011110000000110001010110000110100001010010011011101111
01000101011100000000111111110100000011000011110000000011000101011000011010000101001001101
11011110100010101110000000000000...
Ahora es donde entra en juego nuestra habilidad para hacer sopas de letras.
Si nos fijamos un poco en el código anterior veremos enseguida que se
trata de una secuencia duplicada. La redundancia es la mejor forma de
comprobar errores. Podemos suponer que la máquina lee las dos partes y
si encuentra algo que no coincide rechaza la tarjeta como no válida.
Así que la parte que nos interesa,
eliminando los ceros iniciales, se reduce a:
1111111101000000110000011110000000110001010110000110100001010010011011101111010001010111
00000000
Otro sistema de detección de errores muy común en transmisiones informáticas
es el del bit de paridad. Enviamos la información en bloques, generalmente
de unos pocos bits, y a continuación mandamos un bit de paridad. Éste
puede ser de paridad par o impar. Si el bit es de paridad par, el número
total de unos que hay en el bloque más el bit de paridad debe ser par.
Es lo mismo que decir que si el número de unos que hay en el bloque enviado
es impar, el bit de paridad valdrá 1, y valdrá 0 en el caso contrario.
No hace falta que explique cómo funciona un bit de paridad impar.
Resulta que las tarjetas magnéticas
suelen utilizar muy a menudo este sistema. Así que podemos ir probando
a colocar la información en bloques de distinto tamaño. Con un poco de
suerte encontraremos los bits de paridad.
¿Qué pasa si colocamos nuestros
bits de ocho en ocho?. Que hemos encontrado lo que queríamos: si desechamos
el primer y último bloque (debemos suponer que se trata de identificadores
de inicio y fin de la secuencia de datos), cada bloque estará compuesto
por siete bits de datos más uno de paridad impar. Podéis hacer la prueba,
el número de unos en cada fila siempre es impar:
|
11111111 < Inicio de secuencia
01000000
11000001
11100000
00110001
01011000
01101000
01010010
01101110
11110100
01010111 < LRC
00000000 < Fin de secuencia |
He aquí otro sistema más para detectar errores: si os fijáis en la última
fila dentro de la secuencia, veréis que cada uno de sus bits es un bit
de paridad impar "vertical". El número de unos en cada columna
también es impar. Este conjunto de bits es conocido como LRC, o "chequeo
de redundancia longitudinal".
Bueno, ahora queda lo más difícil. Sabemos que, de alguna manera, ahí
en medio estarán codificados el año, día, mes, hora y minutos del momento
en el que se entró en el parking. Y todo eso lo sabemos, porque está impreso
en la tarjeta:
Fecha: 19 - 10 - 99 Hora: 22 : 47
Para encontrar estas cifras no nos queda más remedio que comparar la información
de distintas tarjetas. Por cierto, a estas alturas ya doy por hecho que
todo el mundo sabe cómo se representan los números en binario (de todas
formas, quien no tenga ni idea puede pinchar aquí (*)).
Las anteriores cifras en binario serían:
19 - 10011
10 - 1010
99 - 1100011
22 - 10110
47 - 101111 |
En la siguiente figura muestro todo lo que he descubierto acerca de la
forma en que aparece la información en las tarjetas de aparcamiento (más
tarde veremos que es todo lo que hace falta saber). No es que sea precisamente
la estructura de datos más elegante de la historia, pero debemos disculpar
a sus creadores: ellos nunca imaginaron que iba a ser expuesta públicamente.
Vemos que los números se almacenan directamente en binario, comenzando
por el LSB y terminando con el MSB. La forma de representar el día es,
por decirlo de alguna manera, retorcida. No hace falta insistir en que
no es suficiente con una tarjeta para desentrañar este tipo de cosas.
Los demás bits deben contener cosas como el año y el número de serie,
pero a nosotros no nos hacen falta para nada.
Hasta aquí he mostrado el funcionamiento
y la forma de codificar información de las tarjetas magnéticas.
Pero, ¿cómo leerlas?.
CÓMO
LEER TARJETAS MAGNÉTICAS
Me temo que el resto del artículo requerirá por parte del lector algo
más que conocer el sistema binario. Por lo menos un poco de electrónica
y otro poco de informática (me refiero, por supuesto, a programar; no
a jugar al "Age of Empires") serán conocimientos indispensables
para poder poner en práctica, que no para seguir leyendo, lo expuesto
a continuación.
Como ya indiqué al comienzo, me introduje en el mundo de las tarjetas
con una unidad de cinta de un ordenador Amstrad CPC. Desconozco hasta
qué punto son válidos estos cabezales para la lectura de pistas magnéticas,
pero yo he logrado leer correctamente numerosas tarjetas, incluidas las
tres pistas de las tarjetas normalizadas ISO / ANSI. Se pueden encontrar
ordenadores de este tipo en muchos sitios y tirados de precio, así que,
para quien quiera probar, ahí van unas instrucciones generales:
| Rojo |
Retorno de alimentación
(tras el interruptor) |
| Negro |
Masa |
| Blanco |
Entrada de alimentación (antes
del interruptor) |
| Azul |
Datos a grabar |
| Verde |
Lectura de datos |
| Marrón |
Entrada de alimentación |
| Gris |
Sonido (al altavoz) |
| Amarillo |
Habilitación de motor |
-
Introduciremos
una tensión de alimentación de 5 ó 6 voltios entre los cables rojo
y negro. Si encendemos el interruptor y apretamos PLAY veremos que
el motor no se mueve, debemos poner a masa el cable amarillo para
activar el relé que controla el motor. Conectaremos el cable verde
a alguno de los bits de entrada del puerto paralelo de nuestro PC,
también conectaremos la masa del lector a la masa del puerto paralelo.
Quien no sepa cómo se utiliza el puerto paralelo puede echar un vistazo
a Interfacing
the standard parallel port.
-
Haremos un
pequeño programa que vuelque a pantalla lo que llegue desde el lector.
Sin embargo recomiendo a quien pueda conseguir un lector comercial. Son
mucho más cómodos, robustos y sencillos de usar. Y lo más importante de
todo: algunos también pueden grabar. El problema es que no son demasiado
fáciles de encontrar. Se pueden adquirir a través de Internet; también
he visto algún catálogo para venta por correo de componentes electrónicos
en los que aparecía uno. Pero la forma más económica de conseguir uno
es frecuentando rastros, chatarrerías y demás cementerios tecnológicos.
En los comercios se utilizan y se desechan montones de máquinas
lectoras de tarjetas, y a algún sitio tienen que ir a parar. El lector-grabador
que utilizo actualmente (IBM 4717) no costó más de 300 pesetas en el rastro.
Éste es su aspecto:
Internamente posee dos placas de circuitos, cada una controla una "capa"
distinta de procesamiento. La primera está conectada directamente a los
cabezales y se encarga del proceso a bajo nivel: codificación-decodificación
F/2F y generación de la señales de sincronización. La segunda está construida
alrededor de un microcontrolador Intel 8051 y realiza el proceso a alto
nivel, interpretando los caracteres y números leídos en las pistas y transmitiéndolos
a la caja registradora a través de un puerto serie. Como no sólo pretendemos
leer tarjetas estándar necesitamos un contacto más directo con el hardware,
así que he eliminado la segunda placa y he conectado directamente la primera
al puerto paralelo del PC.
En la sección de links he listado algunas páginas que contienen bastante
información sobre varios tipos de lectores - grabadores comerciales. Todo
aquel que pretenda hacerse con uno tendrá que echar un vistazo a estos
lugares.
Un aparato de este tipo ya
lleva incorporado el decodificador F/2F, con lo que sólo debemos ocuparnos
de leer los bits de forma asíncrona. En el mío, como en otros, hay un
cabezal lector para cada una de las dos primeras pistas del estándar
ISO / ANSI. Cada lector tiene una línea por donde envía los bits leídos
y otra por la que envía una señal de sincronismo o reloj (clk). El programa
en el PC debe leer el bit presente en la línea de datos a cada flanco
descendente de la línea de sincronismo. La rutina que utilizo, escrita
en C, es algo como esto:
int leer(char pista)
{
int i;
unsigned char mask1,mask2; /* máscaras para
seleccionar el bit correspondiente */
if (pista==2) { /* seleccionamos
las entradas correspondientes a cada pista */
mask1=64;
/* bit 6: reloj de la pista 2 */
mask2=32;
/* bit 5: datos de la pista 2 */
}
else{
mask1=16;
/* bit 4: reloj de la pista 1 */
mask2=8;
/* bit 3: datos de la pista 1 */
}
printf("/nInserte tarjeta.../n");
do {
/* espera la primera señal de reloj */
} while (inportb(0x379) & mask1);
for (i=0;i<700;i++)
{
do {
/* espera mientras clk es alto */
if(...) return i;
/* aquí va la instrucción que detecta el fin
de la pista */
} while (inportb(0x379) & mask1);
bits[i] = inportb(0x379) & mask2; /* lee el
bit de la pista correspondiente */
do {
} while (!(inportb(0x379) & mask1));
/* espera a que clk sea alto */
}
return i;
/* devuelve el número de bits leídos */
}
Por motivos de claridad, no he incluido la instrucción que determina cuándo
se ha llegado al final de la tarjeta. Para bajar el código completo del
programa pincha aquí: Magcard.
El método que he elegido para
detectar el final de pista consiste en utilizar la IRQ del temporizador
del sistema (PIT) para saber cuándo el lector tarda demasiado tiempo en
enviar el siguiente bit. Si el programa tiene que esperar más de, aproximadamente,
5 centésimas de segundo, se da por terminado el flujo de información.
No me extenderé más en el tema
de la lectura de tarjetas, ya que es algo muy dependiente del material
que posea cada uno. Pasemos ya a lo realmente interesante.
... Una vez descubierto el patrón mediante el
cual mis tarjetas de aparcamiento codificaban todos sus datos importantes
no pude resistir la tentación de probar a engañar a la caja automática.
Cuando
intenté crear una imitación de una de estas tarjetas con mi recién adquirido
lector-grabador surgió un problema. El aparato, preparado para escribir
sólo las dos primeras pistas estándar, aceptaba únicamente dos densidades
de bits: 210 y 75 bits por pulgada (bpi). Las tarjetas de parking estaban
escritas con una densidad más baja que la primera y más alta que la segunda.
Así que no tuve más remedio que probar cada una. Copié el contenido de
una tarjeta a otra a 75 bpi, pero la información quedaba demasiado "extendida":
la máquina no la aceptó. Repitiendo la misma operación a 210 bpi la máquina
reconoció la copia como si fuese la original.
Hay
un detalle muy interesante acerca del funcionamiento de estas máquinas:
al aceptar una tarjeta, la caja automática reescribe completamente su
contenido, haya o no que pagar. Esto nos beneficia para nuestros experimentos
ya que, una vez pasada nuestra tarjeta experimental por la caja, podemos
estar seguros de que la máquina para salir del aparcamiento la va a aceptar
como válida. Ya sabía lo suficiente para realizar la prueba final.
Como
andaba un poco escaso de tarjetas originales, decidí construir una. Nada
más fácil: corté un trozo del papel que contienen las cintas de audio
(ése donde uno escribe los títulos de las canciones) y le pegué una tira
de la misma cinta de audio, a modo de banda magnética. En ella grabé el
contenido de una tarjeta auténtica, pero modificando los datos del día
y la hora de entrada (¡cuidando de cambiar también los bits de paridad
y el LRC!).
En
el parking del que hablo las dos primeras horas son gratis. Aquella tarde
tuve mi coche aparcado durante más de tres horas, pero yo tenía dos tarjetas:
la auténtica me decía que tenía que pagar 250 pesetas, la improvisada
decía que no tenía que pagar nada. Salí utilizando la segunda y tras haber
pagado lo que me pedía la primera: no estaba allí para robar a nadie y,
ante todo, no quería correr el riesgo de quedarme detenido en la salida
sólo con una tarjeta hecha con un trozo de cinta de audio.
CÓMO
GRABAR TARJETAS MAGNÉTICAS
Al igual que en el anterior apartado, lo que puedo decir acerca de la
grabación de tarjetas se limita a mis propias experiencias con el grabador
que he podido localizar. Y, como antes, remito al lector a la sección
de links, de donde se puede partir hacia
alguna página que contenga información acerca de varios modelos de grabadores.
Incluso, en http://www.chez.com/mosfet/index.html
se pueden encontrar diagramas para construir un copiador de tarjetas (siempre
que uno encuentre los cabezales necesarios).
En el lector-grabador IBM 4717
hay un cabezal de escritura para cada pista. La sincronización se produce
gracias a una rueda que se apoya en la tarjeta deslizante. La rueda es
un sensor de posición: al girar genera dos ondas cuadradas, una para la
escritura a 75 bits por pulgada y otra a 210 bits por pulgada. La lógica
interna del grabador se encarga de generar la señal F/2F mediante un sencillo
circuito secuencial a base de biestables J-K, con lo que No hay nada más
fácil de programar: se espera a que el bit de sincronismo se ponga bajo,
se manda el bit correspondiente y se espera a que el sincronismo se ponga
alto. Así hasta que se haya escrito toda la pista. En el programa Magcard
muestro un ejemplo.
Un último detalle. En tarjetas
de una sola pista como nuestras queridas tarjetas de parking, ésta puede
ser muy ancha. Para hacer una pista tan gruesa podemos utilizar conjuntamente
dos cabezales (en el programa de ejemplo he utilizado esto).
Sin embargo en mi grabador, para poder hacer esto, he tenido que realizar
algunas modificaciones en el circuito. Nada difícil para quien tenga idea
de electrónica digital.
Estoy convencido
de que el que se aburre es porque le gusta. Algo tan vulgar y cotidiano
como una tarjeta de acceso a un aparcamiento puede convertirse en un objeto
fascinante y mantener nuestro tiempo felizmente ocupado durante un par
de semanas. Espero que este documento haga aumentar el interés del lector
por este tipo de tecnología en particular y, en general, por comprender
todo lo que hay de mágico en todos esos pequeños milagros tecnológicos
que nos encontramos en nuestra vida diaria.
No dudéis a la hora de preguntarme, sugerirme o informarme acerca de cualquier
cosa relacionada con este artículo.
(*) ¿Problemas con el sistema binario?. Aquí va una breve explicación:
El sistema
que utilizamos diariamente para numerar es el decimal. En sistema decimal,
el número representado se obtiene multiplicando cada dígito por una potencia
de diez. Las unidades se multiplican por 10 elevado a cero (1); las decenas,
por diez elevado a 1 (10); las centenas, por diez elevado a dos (100),
etc. Así:
1238 = 8*10^0 + 3*10^1 + 2*10^2 + 1*10^3
Donde "*" es el signo de multiplicar y "^" indica
"elevado a".
En sistema binario sólo hay dos dígitos: 0 y 1. Sólo que ahora los dígitos
se llaman bits (abreviatura de "birary digit"). En lugar de
multiplicar por potencias de diez, multiplicamos por potencias de 2. Así:
10101 binario = 1*2^0 + 0*2^1 + 1*2^2
+ 0*2^3 + 1*2^4 = 21 decimal
Al bit de la derecha se le llama "bit menos significativo" o
LSB, al bit de la izquierda se le llama "bit más significativo"
o MSB.
|