Artículo anterior Enlaces de interés Página inicial Acerca del autor Artículo siguiente

 


EXPERIMENTOS CON
TARJETAS MAGNÉTICAS

 


      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:

  • Abrimos el aparato, extraemos el cabezal de la unidad de cinta (sin desoldarlo) y lo colocamos en un soporte que hayamos hecho. Se trata de poder deslizar cómodamente las tarjetas sobre el cabezal.

  • Desenchufamos el conector de la unidad de cinta que va al circuito digital. Este conector tendrá unos cables cuyas funciones serán las siguientes:
              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.

 

 

JMB 29-11-2000
juanmb@bigfoot.com

Artículo anterior Subir Artículo siguiente