Durante la última semana he estado haciendo experimentos con un lector de tarjetas de banda magnética. En resumen, me he comprado el lector de tarjetas más barato que había en Amazon, lo abrí, le soldé unos cuantos cables, agregué unos cuantos componentes electrónicos, lo enchufé al conector de micrófono de mi ordenador y grabé cosas como esta: la señal en bruto procedente de una banda magnética. En este artículo voy a explicar cómo funcionan las tarjetas de banda magnética y cómo descodificarlas.
Las tarjetas de banda magnética fueron inventadas por Forrest Parry en 1969, que fue un año bastante prolífico en cuestión de pasos de gigante para la humanidad. La primera empresa en desarrollar y producir estas tarjetas fue IBM, que dejó las ideas básicas “abiertas” para que el resto de la industria pudiese desarrollar sus propios sistemas de tarjetas. Al poco tiempo, las industrias bancarias y aeronáuticas se reunieron y definieron un conjunto de estándares, de manera que todas las tarjetas magnéticas tienen el mismo tamaño, tienen la banda magnética en la misma posición, utilizan las mismas codificaciones, etc., etc.
La banda magnética es la tira, generalmente de color oscuro, que aparece en la parte de atrás de la tarjeta. En la banda magnética están grabados los datos de la tarjeta, pero para hablar de cómo están grabados estos datos, antes tengo que hablar de imanes.
Imaginad que tenéis un imán en forma de barra. Un extremo es el “polo norte” del imán y el otro extremo es el “polo sur”. El imán produce un campo magnético, que se representa mediante “líneas de fuerza” que salen por un polo del imán y vuelven a entrar por el polo opuesto. Donde las líneas de fuerza son más densas, el campo magnético es más intenso. Casi todas las líneas de fuerza salen o entran por los polos, así que es allí donde más densas son y donde más intenso es el campo magnético. Esto significa que si tomáis un trozo de hierro y lo acercáis a un imán, se verá atraído con más fuerza hacia un polo que, por ejemplo, hacia el centro de la barra, donde las líneas de fuerza están más separadas.
Si tomáis dos imanes y los juntáis por los polos, pueden pasar dos cosas. La primera posibilidad es que estéis juntando el polo norte de un imán con el polo sur del otro imán. En este caso, las líneas de fuerza de los dos imanes empiezan a combinarse y, cuando los dos imanes se tocan, se comportan como si fueran un solo imán el doble de largo: los dos polos que se tocan desaparecen, y sólo quedan los dos polos que quedaron libres, por donde salen y entran las líneas de fuerza del imán combinado. Si, en cambio, juntáis dos polos iguales de ambos imanes, ambos imanes comenzarán a repelerse, las líneas de fuerza no se cruzarán, y la intensidad del campo magnético entre ambos imanes aumentará. Según se juntan más los dos imanes la fuerza de repulsión aumenta y con ella la intensidad del campo magnético.
La banda magnética está compuesta por multitudes de partículas magnéticas que se comportan como imanes diminutos. Imaginad que todas estas partículas están orientadas con el polo norte a la derecha. En este caso, la banda magnética se comportaría como si fuese un único imán con su polo norte a la derecha y su polo sur a la izquierda, con el campo magnético más intenso a la derecha e izquierda de la banda. Sin embargo, se puede utilizar un imán permanente o un electroimán para invertir la orientación de algunas partículas. En este caso, en las regiones que separan las partículas con distintas orientaciones se producirá un campo magnético más intenso. Un “cabezal de escritura”, que es un electroimán, puede determinar la orientación de las partículas que se encuentran debajo del cabezal.
Si se mueve el cabezal de escritura de un lado a otro mientras éste induce una u otra orientación, la banda magnética acaba pareciéndose a una ristra de imanes que se han juntado polo con polo. El campo magnético de esta banda magnética tendrá picos de intensidad donde se enfrentan los polos iguales de dos dominios magnéticos. Estos picos de intensidad del campo magnético se pueden detectar usando un “cabezal de lectura”, que es un dispositivo que produce una pequeña corriente eléctrica cuando está expuesto a un campo magnético que cambia de intensidad. Deslizando este cabezal de lectura por encima de la banda magnética, las distintas intensidades en distintos puntos de la banda magnética producen pulsos de corriente: en un sentido si son dos polos norte los que están enfrentados, y en el sentido contrario si son dos polos sur.
Por lo tanto, el cabezal de escritura produce inversiones de polaridad y el cabezal de lectura produce un pulso eléctrico cada vez que detecta una inversión de polaridad. Si se graba un determinado patrón de inversiones de polaridad, más tarde el cabezal de lectura producirá un patrón análogo de pulsos eléctricos. Es así como se pueden grabar y leer luego datos binarios (ceros y unos) en una banda magnética. El sistema funciona igual que la comunicación con espíritus en una sesión de espiritismo: un pulso significa “cero” y dos pulsos significan “uno”.
Mirad el diagrama de la izquierda, que muestra varias inversiones de polaridad de distintas longitudes. Las inversiones de polaridad más cortas duran la mitad que una inversión de polaridad larga, y las inversiones cortas siempre van en pares. Un cero se graba como una inversión de polaridad larga y un uno como dos inversiones cortas. Al leerlas, el cero se recibe como dos pulsos separados un determinado intervalo con nada más que silencio en medio, mientras que el uno se recibe como dos pulsos separados el mismo intervalo, pero con otro pulso en medio. Los bits de la figura de la izquierda, leídos de izquierda a derecha, son, por lo tanto, 001011.
La cuestión a la hora de leer una banda magnética es saber cómo de largo es el intervalo entre dos pulsos. Dicho de otra manera: estos dos pulsos, ¿representan un uno o dos ceros muy rápidos? Como los lectores de tarjetas se accionan moviendo la tarjeta a mano, la velocidad a la que llegan los pulsos varía de una lectura a otra, e incluso varía bastante durante la lectura de la tarjeta. Por lo tanto, ¿cómo sabe el lector cómo de largo es el intervalo entre los pulsos de un cero? La respuesta está en el uso de pulsos de sincronización.
Antes de los datos propiamente dichos hay una serie de 40 o 50 bits, todos con el valor 0, llamados “bits de sincronización”. Cuando la tarjeta empieza a pasar por el lector, el cabezal de lectura produce los pulsos correspondientes a estos ceros, y el lector mide el tiempo que transcurre entre estos pulsos. Al cabo de unos pocos pulsos el lector ya tiene una buena idea de cuánto dura el intervalo entre los pulsos de un cero y está listo para comenzar a recibir datos. A partir de este momento, cada vez que el lector recibe un pulso mira cuánto tiempo ha pasado desde el último pulso. Si este tiempo es, aproximadamente, la duración del intervalo, el lector registra que ha leído un cero. Si es, aproximadamente, la mitad de ese tiempo, el lector registra que ha leído un uno y espera al segundo pulso. El lector también mira si los pulsos llegan ligeramente adelantados o retrasados y ajusta en consecuencia el intervalo. De este modo el lector puede compensar los cambios en la velocidad a la que se lee la tarjeta.
Por ejemplo, imaginad que alguien está pasando la tarjeta a tal velocidad que los pulsos de sincronización han llegado a razón de uno cada 2 milisegundos y en mitad de la banda magnética empieza a reducir la velocidad: podríamos recibir pulsos como los de la figura de la derecha. Los primeros pulsos llegan a razón de uno cada 2 milisegundos, así que está claro que cada uno representa un cero binario. Luego llegan dos pares de pulsos separados 1 milisegundo, por lo que cada par es un 1 binario. Luego empieza a reducirse la velocidad y llega otro pulso 2.2 milisegundos más tarde, lo que significa que es un cero binario y que la tarjeta está pasando más despacio, así que ahora pasamos a esperar los pulsos cada 2.2 milisegundos. El siguiente pulso llega 2.6 milisegundos después, con lo que registramos otro 0 y esperamos el siguiente pulso 2.6 ms más tarde. Luego llega un pulso 1.5 milisegundos más tarde, que es bastante menos que el tiempo en el que esperábamos un pulso, por lo que consideramos que hemos recibido un 1 y esperamos al siguiente pulso, que llega 1.6 milisegundos después. 1.5+1.6=3.1 milisegundos, que es el tiempo que esperaremos recibir el siguiente pulso. Los siguientes pulsos llegan 1.7 y 1.8 ms más tarde, por lo que tenemos un 1. Y así sucesivamente…
A la izquierda podéis ver una foto (publicada originalmente por The Reverend Anaglyph en “Tetherd Cow Ahead” y reproducida con su permiso) que muestra el resultado de espolvorear algo de polvo de óxido de hierro sobre la banda magnética de una tarjeta. El óxido de hierro es atraído por los imanes, así que se queda pegado a las áreas donde el campo magnético es más intenso, y los datos que están grabados en la banda magnética se hacen visibles al ojo humano. Mola, ¿eh? Incluso se pueden distinguir los ceros de los unos. Viendo la foto podéis observar que hay tres “pistas” que contienen datos. La pista central (pista 2) fue la primera en estar estandarizada y está grabada con una densidad de 75 bits por pulgada. Las pistas superior e inferior (1 y 3) son más recientes y están grabadas a 210 bits por pulgada.
Las tres pistas contienen, en este orden, una serie de bits de sincronización, un “centinela” (que es una serie de bits que indica que comienzan los datos), los datos propiamente dichos, otro centinela (que indica que se han acabado los datos) y, finalmente, otra serie de bits de sincronización. Hay bits de sincronización al principio y al final de la pista para que los lectores puedan leer la tarjeta tanto si se pasa al derecho como si se pasa al revés. Obviamente, si se pasa al revés, los bits llegarán en el orden opuesto, pero como los centinelas del principio y el final de la pista son distintos, el lector puede detectar en qué dirección se ha pasado la tarjeta e invertir el orden de los bits si es necesario.
Los datos de la pista 1 están codificados con un esquema de 7 bits por símbolo. Estos 7 bits se distribuyen en un bit de paridad y 6 bits de datos. La paridad es impar, lo que significa que entre los 7 bits siempre hay un número impar de bits con valor 1. El primer bit del símbolo es el bit de paridad, seguido del bit menos significativo, y así hasta que el bit más significativo llega último. Con 6 bits se pueden representar 64 valores distintos, lo que da espacio para números, letras mayúsculas y minúsculas, y varios signos de puntuación. Se puede convertir este símbolo de 6 bits en un carácter ASCII simplemente interpretándolo como un número y sumándole 32.
Las pistas 2 y 3 están codificadas con un esquema de 5 bits por símbolo: 1 bit de paridad impar y 4 bits de datos, con el bit menos significativo primero. Los 4 bits admiten 16 valores distintos, lo que da espacio para los 10 dígitos del 0 al 9 y 6 caracteres de control. Este símbolo se puede convertir en un carácter ASCII interpretándolo como un número y sumándole 48.
Y ahora llega la última cuestión: ¿qué hay grabado en cada pista? Originalmente las tarjetas de banda magnética sólo tenían la que ahora llamamos pista 2. Esta pista sólo puede contener datos numéricos, así que almacenaba el número de tarjeta, fecha de caducidad y unos pocos datos más. Unos años más tarde se añadieron las pistas 1 y 3. La pista 1 puede almacenar números y letras, así que contiene el nombre del titular de la tarjeta y una copia de todos los datos de la pista 2. La pista 3 casi nunca se usa, así que suele contener todo ceros o, a veces, directamente no existe.
Sabiendo todo esto me puse a construir mi propio sistema para leer tarjetas de banda magnética. Como no me veo capaz de fabricarme mis propios cabezales de lectura, me compré el lector de tarjetas más barato que encontré y lo abrí para soldarle unos cuantos cables en los cabezales de lectura. (Por azares del destino el lector llegó estropeado así que no me dio ninguna pena abrirlo). Como las tarjetas tienen tres pistas, el lector de tarjetas también tiene tres cabezales de lectura, uno por cada pista. Una vez soldados los cables, me puse a pensar en cómo conectarlos al enchufe del micrófono de mi ordenador.
Un enchufe de micrófono estéreo tiene tres terminales: uno de alimentación y dos que reciben las señales de un micrófono estéreo. La idea general era enchufar los cabezales de las pistas 1 y 2 de manera que cada uno de ellos enviase sus impulsos por un terminal distinto. Como sólo hay dos terminales, la pista 3 se queda sin conectar pero, como dije antes, casi nunca hay nada interesante en esta pista, así que no importa.
La manera más simple de conectar estos cabezales consistiría en conectar uno de sus cables al terminal de alimentación y el otro al correspondiente terminal de señal, pero resulta que entre estos dos terminales hay una diferencia de potencial de 4 voltios, así que tuve miedo de que con esa diferencia de potencial el cabezal de lectura se convirtiese en un electroimán y me borrase la tarjeta mientras intentaba leerla. Para evitarlo primero probé a conectar un condensador en serie, pero distorsionaba la señal. Al final improvisé un circuito con amplificadores operacionales.
(Más tarde me di cuenta de que los 4 V eran la diferencia de potencial en abierto; con el cabezal conectado, la diferencia de potencial caía a 100 mV. Los experimentos que hice sugieren que no es suficiente diferencia de potencial como para estropear la tarjeta, pero bueno… más vale prevenir que curar).
Una vez enchufados los cabezales de lectura arranqué un programa editor de sonido, lo puse a grabar, pasé la tarjeta por el lector, y obtuve lo que sale en la captura de pantalla de la izquierda: una serie de pulsos recibidos a través del enchufe del micrófono. Después de amplificar en software la señal recibida, los pulsos son tan claros que incluso se pueden descodificar a ojo (0000011010000).
Con el lector de tarjetas conectado al ordenador y funcionando correctamente, sólo quedaba escribir un programa para descodificar los pulsos. El programa que hice recibe señales procedentes del conector de micrófono, detecta los pulsos, cuenta el tiempo transcurrido entre pulso y pulso, extrae los bits, descodifica los símbolos, los convierte a ASCII y muestra el resultado en una ventana. La captura de pantalla de la derecha muestra mi programita después de pasar por el lector una tarjeta de fidelización de una aerolínea (los datos no deberían ser delicados, pero por precaución he tapado algunos números). La caja de arriba muestra el contenido de la pista 1: el número de tarjeta, mi nombre, y algunos datos que supongo que sirven para validar la tarjeta. La caja de abajo muestra la pista 2: el número de tarjeta y los mismos números que venían después de mi nombre. La pista 3 no aparece porque, como ya he dicho, no estaba conectada, pero sólo contiene ceros.
Y con esto mis experimentos en lectura y descodificación de tarjetas magnéticas han llegado a su fin, al menos por ahora. Es posible que en el futuro me ponga a implementarlo en un microcontrolador o que haga un descodificador para bandas magnéticas “exóticas” (billetes de transporte público, tarjetas-llave de hotel, etc.), pero por el momento me conformo con ser capaz de descodificar tarjetas normales en un ordenador.
Los lectores de tarjetas que están disponibles en el mercado hacen todos estos procesos por si solos y luego simulan que son un teclado: al pasar la tarjeta, el lector de tarjetas “teclea” a toda velocidad los datos almacenados en ella. Por lo tanto, para que un programa sea capaz de leer tarjetas no es necesario hacer nada especial, sólo leer caracteres del teclado. Si mi intención fuese sólo hacer un programa que lee tarjetas, todo esto que comenté arriba habría sido innecesario: habría bastado con enchufar el lector de tarjetas y abrir el Bloc de Notas. Pero bueno, cómo de aburrido sería el mundo si nunca hiciésemos cosas innecesarias de vez en cuando, ¿no?