О том, что магнитные карты совсем скоро навсегда уйдут в историю, говорят уже не первый год. Тем не менее, хоть они и постепенно вытесняются другими технологиями (например, RFID, ISO7816), окончательно исчезать они пока даже не собираются.
Итак, в данной статье поговорим о том, как работает запись данных на карты с магнитной полосой, разберёмся, в каком формате хранится там информация, узнаем, как устроены считыватель и энкодер и, конечно же, ещё много чего интересного.
Суть такова
На просторах можно найти огромное количество материалов об устройстве и принципе работы RFID-карт. О магнитных же картах информации куда меньше. Для этого есть свои причины: считыватели магнитной полосы сравнительно дороги, на карту вмещается весьма малое количество данных, сама технология безнадёжно устарела. Но, как по мне, детально рассмотреть такое оборудование будет весьма интересно. А раз так — погнали!
Настоятельно рекомендую также прочитать вот эту статью: О долгой жизни и неминуемой смерти карт с магнитной полосой.
Устройство карты
Традиционно такая карта представляет собой обычную пластиковую карту стандарта ISO7810, на обратной стороне которой мельчайшими частицами ферромагнетика нанесена магнитная полоса. В опытных образцах использовались отрезки магнитной ленты.
По напряжённости поля, необходимого для перезаписи, карты делятся на высококоэрцитивные и низкокоэрцитивные. В настоящее время применяется преимущественно первый вариант, обладающий куда большей устойчивостью к износу и внешним магнитным полям, тогда как низкокоэрцитивные полосы размагничиваются от контакта даже с маломощными магнитами или просто от косого взгляда.
О чувствительности к магнитным полям карт высококоэрцитивного типа поговорим несколько позже.
Немного о кодировании
Все карты с магнитной полосой используют F/2F-кодирование для записи данных. В нём логической единице соответствует частота сигнала, вдвое большая таковой для нуля. В качестве обозначения перехода используется смена полярности при намагничивании карты. Причина для использования такого принципа кодирования весьма простая — можно существенно упростить устройство для считывания, так как результат не будет зависеть от скорости прокатывания через него карты. Другие методы кодирования потребовали бы установку электропривода для автоматического захвата и перемещения карты или механически связанного с энкодером ролика для контроля скорости.
Сама карта имеет три дорожки, первая имеет семибитную кодировку, вторая и третья — пятибитную. Непосредственно для данных используются соответственно шесть и четыре бита, старший же бит в коде каждого символа отведён для чётности. На магнитную полосу вначале записываются младшие биты, затем — старшие.
В начале и в конце дорожки находятся символы, обозначающие начало и конец последовательности, после стоп-символа записывается контрольное значение, представляющее собой последовательный XOR всех символов на дорожке, также дополненный своим битом чётности.
Таким образом, алгоритм для считывания карты получается следующий:
- Получаем строку бит с декодера. Практически нигде не подключают магнитную головку непосредственно к контроллеру, чаще всего используют специальные микросхемы F/2F-декодеров, отправляющие уже почти готовые данные;
- Определяем начало и конец у полученных данных (поиском старт и стоп-символов);
- Считываем символы согласно кодировке, у каждого считанного символа проверяем чётность;
- Вычисляем и сверяем контрольное число;
- Если ошибок обнаружено не было, выводим готовую строку.
Банковские карты
Помимо кодировки существует и стандарт, определяющий, что именно записано на магнитной полосе. Впрочем, в системах, отличных от платёжных (к примеру, электронные пропуска, скидочные, подарочные и клубные карты), может быть записана любая произвольная информация.
Остановимся поподробнее на банковских картах. Вот пример дампа второй дорожки:
;4034351574462072=2402121111946800?
Итак, цифры до разделителя (символа "=") — PAN (Primary Account Number), собственно, сам номер карты. Спешу вас заверить, что данные эти были созданы при помощи сервиса генерации «левых» номеров карт и не имеют никакого отношения к реальной карте.
Следующая группа из четырёх цифр — срок действия в формате YYMM. Далее идёт Service code. Это трёхзначное число, позволяющее задать ряд ограничений, к примеру, запретить использование магнитной полосы (при попытке прокатать такую карту на экране терминала загорится требование использовать чип). Более подробно значения Service code расписаны тут. По традиции, все упомянутые ссылки будут продублированы в конце поста.
Далее идут ещё пять цифр — PVV (PIN Verification Value). Первая цифра указывает на наличие этого кода, оставшиеся четыре представляют собой непосредственно значение. Как нетрудно догадаться, это число используется для верификации PIN карты.
Последняя группа цифр в последовательности — CVV-1/CVC-1. Этот код используется для авторизации с использованием магнитной полосы. Не следует путать его с CVV-2/CVC-2, напечатанным на обратной стороне карты рядом с местом для подписи.
Считыватель
Время перейти к обзору оборудования. У меня имелись два считывателя магнитных карт Posiflex MR-2000U. Мой экземпляр рассчитан на чтение первой и второй дорожек и имеет интерфейс подключения USB.
Большинство таких считывателей эмулируют клавиатуру, просто выводя данные дорожек, опционально добавляя перевод строки в конце. Это позволяет записывать данные карт хоть в Excel.
Разберём экземпляр. На плате отчётливо видны две микросхемы — одна отвечает за F/2F-декодирование, другая — за обработку данных и их отправку по USB. Перемычками настраивается режим работы, например, можно включить или отключить считывание одной или нескольких дорожек, либо отображение символов начала и конца каждой дорожки.
А вот и непосредственно считывающий узел. Головка закреплена в пластиковом шасси, на нём же находится платка с операционными усилителями. Точно такие же модули используются и в других изделиях компании Posiflex, например, в программируемых кассовых клавиатурах.
Магнитная головка отдельно. Она от POS-terminal'а Ingenico 5100. Отчётливо видны три её дорожки.
А вот другая головка. Такие применялись в терминалах VeriFone VX510.
Собираем считыватель сами
Как устроен заводской считыватель, разобрались. Теперь попробуем собрать свой собственный вариант.
У меня остались магнитная головка и микросхема декодера MRD531B-LQ от помершего VX510. Без проблем найдя даташит на эту микросхему (просто загуглив «MRD531 PDF»), собрал на макетке типовую схему включения.
Недолгие поиски какого-то примера работы с магнитным считывателем на МК вывели меня на библиотеку для подключения такого считывателя к Arduino.
Интерфейс подключения предельно прост: вывод CLS для контроля наличия карты и традиционные DATA/CLK для каждой из дорожек.
Как позже выяснилось, схема весьма дубовая и работает даже при существенно далёких от рекомендуемого номинала компонентах.
К головке тоже нет никаких существенных требований, при отсутствии таковой от считывателя, подойдёт даже экземпляр от кассетного магнитофона.
Если у вас нет и F/2F-декодера, а воспользоваться считывателем хочется, то можно собрать данную схему самому.
Энкодер
Ну что же, перейдём к самому интересному — к тому, как производится запись на магнитные карты.
Такое устройство, как нетрудно догадаться, намного сложнее и дороже считывателя. На нашей вторичке типичный энкодер стоит около восьми тысяч рублей (интересно, откуда такая цена?) при стоимости считывателя раз в десять меньше, что для меня чрезмерно дорого.
Тем не менее, мне таки повезло раздобыть экземпляр. Называется он MSR206U. Самая продвинутая модель — пишет и читает все три дорожки, поддерживает высокоэрцитивные карты. Устройство в хорошем состоянии, с блоком питания (на двадцать четыре вольта), но без USB-кабеля. Ну что же, отличный повод разобрать девайс, поскольку распиновку разъёма 8P8C я не нашёл.
Итак, аппарат чем-то напоминает считыватель, правда, примерно в полтора раза больше обычного. Спереди щель для магнитной карты, три индикаторных светодиода, обозначение модели.
Снизу резиновые ножки, наклейка с указанием модели, четыре винта, один из которых заклеен гарантийной пломбой. Мне её пришлось оторвать.
А вот и плата. Отчётливо видны мощные резисторы, два реле, микроконтроллер, ПЗУшка. Отдельного упоминания заслуживает драйвер записывающей головки: он выполнен на трёх H-мостах L293D (надо полагать, по одному на каждую дорожку). USB-интерфейс реализован на базе микросхемы конвертера USB-TTL Prolific PL-2303HX.
Распиновка, кстати, оказалась вот такая:
- Земля
- Не подключён
- Не подключён
- Не подключён
- Не подключён
- 5 В
- D-
- D+
Основная часть. Маленький шлейфик (едва видимый рядом с наклеенным жёлтым скотчем) от считывающей головки. К записывающей ведёт жгут из голубых проводов. Оставшиеся провода ведут к оптопаре, детектирующей момент вставки карты, и индикаторным светодиодам. Чёрная пластиковая деталь, к которой ведут цветные провода — энкодер.
С другого ракурса. Отчётливо видны считывающая и записывающая головки. Над записывающей по-китайски аккуратно закреплена оптопара.
А вот и энкодер. На валу у него резиновый ролик, вращающийся при прокатывании карты и служащий для отслеживания её положения.
Белый пластик
Помимо энкодера мне достались и карты. А раз так, попробуем записать что-нибудь.
Ставим поставляющийся с энкодером софт, 206DDX51. Запускаем.
В настройках указываем COM-порт, выбираем высококоэрцитивный тип карты, вводим какие-нибудь данные и жмём кнопку записи. На энкодере загорается жёлтый светодиод. Теперь прокатываем карту, и, если запись и верификация пройдены успешно, жёлтый светодиод погаснет, а зелёный — загорится. Всё, карта успешно записана. Прокатываем её в считывателе и убеждаемся, что всё успешно читается.
Эмулятор
Разумеется, магнитные карты можно эмулировать. Многие из нас даже помнят функцию MST в некоторых телефонах Samsung. И сейчас мы попробуем разобраться с эмуляцией карт и собрать устройство для этого всего из трёх деталей (аж вспомнился пост товарища dlinyj про эмулятор RFID из трёх деталей). В этот раз, правда, всё будет намного проще.
Есть такой проект как MagSpoof. В своё время его даже упоминали здесь, но особого интереса тогда всё это не вызвало.
MagSpoof представляет собой эмулятор магнитных карт, состоящий из катушки, поле которой и будет регистрировать головка считывателя, микроконтроллера ATTiny85, а также уже оказавшегося упомянутым здесь H-моста L293D.
Код проекта был написан для платформы Arduino и может быть запущен с минимальными изменениями (лишь поменять номера ножек) практически на любой плате. Под рукой у меня как раз оказалась Mega. На ней мы и будем всё это собирать. Монтажную плату использовать на этот раз не стал, разместил всё на беспаечной макетке.
У меня не было цели изготовить полностью автономное устройство, так что отталкивался от того, что имелось у меня. Мотать катушку ради устройства, с которым я поиграюсь десять минут, а потом разберу, решительно не хотелось, так что пришлось поискать что-то подходящее в закромах. Очень кстати на глаза попалась коробка с деталями от отслуживших своё принтеров. Шаговики, направляющие, оптопары и платы HVPS оставим для каких-нибудь других опытов, а вот соленоид, из числа тех, что стоят в захватывающем механизме лазерных принтеров, будет в самый раз.
Отсоединяем от него подвижную часть (аккуратно, чтобы не потерять пружинку, нам ведь, как-никак, потом это ещё и назад ставить), и, в общем-то, всё.
Собираем схему. Выводы ENABLE, A и B L293D подключаем к цифровым пинам МК, питание логики — к пяти вольтам, питание нагрузки — к двенадцати (вообще, соленоид рассчитан на двадцать четыре вольта, но в данном опыте я бы столько не подавал, так как можно и саму головку намагнитить). Теперь забиваем свой дамп карты и заливаем скетч. Всё, можно пробовать.
Прижимаем катушку к считывателю, жмём кнопку… и всё успешно срабатывает с первого раза, в открытом «Блокноте» появляется наш номер карты.
Ну, где считыватель, там и POS-terminal. И на нём это тоже прекрасно срабатывает. Всё так, как нам хотелось.
Принцип работы этого эмулятора крайне прост — программа рассчитывает чётность и контрольное значение для заданной дорожки, после чего воспроизводит её на катушке при помощи H-моста, позволяющего менять полярность. По идее, если подключить записывающую головку и энкодер, а подачу тока завязать не на фиксированные тайминги, а на сигналы с энкодера, то можно даже создать устройство для записи карт.
Размагничивание
Как показала парочка опытов, высококоэрцитивные карты весьма стойко переносят нахождение рядом с металлическими предметами и даже кратковременное присутствие магнита.
Пластиковый и ферритовый магниты вообще не смогли оказать влияния на магнитную полосу. Стереть данные удалось только неодимовым магнитом, проведя им по полосе.
Так что носить магнитные карты в кошельках с магнитными застёжками или с некоторыми ключами (например, Mottura выпускала замки, ключи от которых содержали неодимовые магниты) всё-таки не стоит.
Также не стоит забывать и про банальный износ карты. В своё время выпускавшиеся магнитные карты Maestro буквально расслаивались от частого использования, разумеется, переставая при этом читаться.
Так что в итоге?
В банковской сфере магнитные карты уже уходят в историю. Крупнейшие платёжные системы уже заявили о прекращении выпуска карт с магнитной полосой буквально через пять лет.
И даже в других областях, где такие карты применялись, RFID постепенно берёт своё.
Безусловно, RFID или смарт-карты использовать сейчас намного проще и дешевле. Впрочем, совершенно уверен, что все эти материалы смогут кому-то пригодиться.
Ссылки
- Сервис генерации случайных номеров карт
- Формат Service Code
- Библиотека для подключения считывателя магнитных карт к Arduino
- Аналогичный проект от Adafruit (но лично у меня оно не заработало)
- Самая простая схема магнитного считывателя
- MagSpoof
- Пример реального использования MagSpoof
- Софт для MSR206
- Ещё внутренности MSR206
Автор: Лев