Считываем и эмулируем карты с магнитной полосой +59


Приветствую всех!

О том, что магнитные карты совсем скоро навсегда уйдут в историю, говорят уже не первый год. Тем не менее, хоть они и постепенно вытесняются другими технологиями (например, RFID, ISO7816), окончательно исчезать они пока даже не собираются.



Итак, в данной статье поговорим о том, как работает запись данных на карты с магнитной полосой, разберёмся, в каком формате хранится там информация, узнаем, как устроены считыватель и энкодер и, конечно же, ещё много чего интересного.

Суть такова


На просторах можно найти огромное количество материалов об устройстве и принципе работы RFID-карт. О магнитных же картах информации куда меньше. Для этого есть свои причины: считыватели магнитной полосы сравнительно дороги, на карту вмещается весьма малое количество данных, сама технология безнадёжно устарела. Но, как по мне, детально рассмотреть такое оборудование будет весьма интересно. А раз так — погнали!

Настоятельно рекомендую также прочитать вот эту статью: О долгой жизни и неминуемой смерти карт с магнитной полосой.

Устройство карты


Традиционно такая карта представляет собой обычную пластиковую карту стандарта ISO7810, на обратной стороне которой мельчайшими частицами ферромагнетика нанесена магнитная полоса. В опытных образцах использовались отрезки магнитной ленты.

По напряжённости поля, необходимого для перезаписи, карты делятся на высококоэрцитивные и низкокоэрцитивные. В настоящее время применяется преимущественно первый вариант, обладающий куда большей устойчивостью к износу и внешним магнитным полям, тогда как низкокоэрцитивные полосы размагничиваются от контакта даже с маломощными магнитами или просто от косого взгляда.

О чувствительности к магнитным полям карт высококоэрцитивного типа поговорим несколько позже.

Немного о кодировании


Все карты с магнитной полосой используют F/2F-кодирование для записи данных. В нём логической единице соответствует частота сигнала, вдвое большая таковой для нуля. В качестве обозначения перехода используется смена полярности при намагничивании карты. Причина для использования такого принципа кодирования весьма простая — можно существенно упростить устройство для считывания, так как результат не будет зависеть от скорости прокатывания через него карты. Другие методы кодирования потребовали бы установку электропривода для автоматического захвата и перемещения карты или механически связанного с энкодером ролика для контроля скорости.

Сама карта имеет три дорожки, первая имеет семибитную кодировку, вторая и третья — пятибитную. Непосредственно для данных используются соответственно шесть и четыре бита, старший же бит в коде каждого символа отведён для чётности. На магнитную полосу вначале записываются младшие биты, затем — старшие.

В начале и в конце дорожки находятся символы, обозначающие начало и конец последовательности, после стоп-символа записывается контрольное значение, представляющее собой последовательный XOR всех символов на дорожке, также дополненный своим битом чётности.

Таким образом, алгоритм для считывания карты получается следующий:
  1. Получаем строку бит с декодера. Практически нигде не подключают магнитную головку непосредственно к контроллеру, чаще всего используют специальные микросхемы F/2F-декодеров, отправляющие уже почти готовые данные;
  2. Определяем начало и конец у полученных данных (поиском старт и стоп-символов);
  3. Считываем символы согласно кодировке, у каждого считанного символа проверяем чётность;
  4. Вычисляем и сверяем контрольное число;
  5. Если ошибок обнаружено не было, выводим готовую строку.

Банковские карты


Помимо кодировки существует и стандарт, определяющий, что именно записано на магнитной полосе. Впрочем, в системах, отличных от платёжных (к примеру, электронные пропуска, скидочные, подарочные и клубные карты), может быть записана любая произвольная информация.

Остановимся поподробнее на банковских картах. Вот пример дампа второй дорожки:

;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.

Распиновка, кстати, оказалась вот такая:
  1. Земля
  2. Не подключён
  3. Не подключён
  4. Не подключён
  5. Не подключён
  6. 5 В
  7. D-
  8. 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 или смарт-карты использовать сейчас намного проще и дешевле. Впрочем, совершенно уверен, что все эти материалы смогут кому-то пригодиться.

Ссылки







Комментарии (29):

  1. dlinyj
    /#24960464 / +7

    Невероятно круто! Очень.

    Мне дико понравилась история с эмулятором магнитной карты, в 2000-х это была бы просто бомба. Да и сейчас выглядит весьма достойно. Спасибо за прекрасный хабратортный материал!

    З.Ы. И приятно, что меня вспомнили :).

    • MaFrance351
      /#24960616 / +2

      Был и "обратный" вариант - скиммеры. Кустарного изготовления девайсы из платы от MP3-плеера и магнитной головки от магнитофона. И какой-то софт (который мне не удалось найти), который преобразует аудиозапись в данные карт.

  2. Iv38
    /#24960786

    При оплате используется только вторая дорожка? Иначе я не очень понимаю как можно эмулировать три параллельные дорожки одним внешним электромагнитом.

  3. TheChief5055
    /#24960812 / +1

    До недавнего времени это прекрасно делал Самсунг (Samsung MST).

    • MaFrance351
      /#24960852 / +1

      Именно так. Но, насколько помню, там оно может использоваться только для Samsung Pay. То есть, к примеру, забить в телефон магнитный пропуск или что-то подобное не получится.

  4. inkelyad
    /#24960946 / +2

    Теперь надо сделать overengineered вариант: взять пленку для визуализации магнитных полей, камеру, написать софт для распознавания картинки...

    Или взять датчик Холла из компьютерного вентилятора и сделать на нем.

  5. Eugeeny
    /#24960984

    Я правильно понимаю, что сосканировав дорожку, можно легко перебрать все 9999 пинов, записать дорожку на другую карту и идти с ней в магазин?

    • MaFrance351
      /#24961042

      Нет. Нужен ещё ключ проверки PIN.

      • osmanpasha
        /#24961080

        А где он находится на оригинальной карте? Вообще интересно было бы почитать про процесс покупки с этой точки зрения

    • YDR
      /#24961906 / +1

      John Connor в T2 что-то подобное делает, и у него получается (хотя в реальной жизни этот способ не работает. Но, вроде бы, были и работавшие способы)

  6. deathbel
    /#24960994 / +2

    в свое время на ардуинке и какомто дешманском считывателе который выдавал в три провода битовый поток с головы делал считыватель и дешифратор содержимого дорожек. с ардуинкой пришлось хитрить так как все библиотеки безбожно тормозили и ардуинка не поспевала за потоком.

    до сих пор в архивах должны валятся дампы всех карт которые тогда были в руках. )))

    • MaFrance351
      /#24961552

      Интересный проект. Было бы интересно на программу взглянуть. В частности, на то, как вам удалось обойти ограничения по скорости.

  7. osmanpasha
    /#24961096

    Получается, если прокатывать карту не равномерно, а четко рассчитанными рывками, то можно передать модифицированные данные?

    • M_AJ
      /#24961210 / +3

      Это один из методов борьбы со скиммерами, который использовали в банкоматах. Карта выдавалась и принималась медленно и с небольшими рывками.

      • MaFrance351
        /#24961260 / +1

        Wincor Nixdorf старых моделей (вроде ProCash 2500xe) для верности несколько раз прокатывает карту. То есть заглотил, наполовину высунул и заглотил уже окончательно. Как раз для этого всего.

        У NCR/Nautilus карта меедленно заезжает и выезжает, при этом постоянно дрыгаясь.

  8. Didimus
    /#24965322 / +1

    Говорят, студенты паяли магнитофон для репликации проездных карт с магнитной полосой. Очень давно было

    • MaFrance351
      /#24965338

      Интересно, в каком городе это было. В большинстве транспортных предприятий этой страны сразу были внедрены RFID-карты.

      Насчёт магнитофона - более чем реально, там не требуется какая-то адовая точность, так что прочитать карту в кустарных условиях вполне возможно. С записью чуть сложнее, но тоже выполнимо.

      • Iv38
        /#24965400 / +1

        В Москве были билеты с магнитной полосой. И в метро и в наземном транспорте. Судя по тому что удалось быстро нагуглить появились они в метро в 1993, массово стали использоваться с 1997, а заменены на ультралайты были в 2011. То есть минимум 13 лет использовались.

        • MaFrance351
          /#24965416 / +1

          Вот, нашёл.

          • safari2012
            /#24967484

            Слышал такую байку, что там дорожка дублировалась на случай размагничивания и "студенты" отрезали полдорожки и переклеивали на другую карту, т.о. удваивая количество поездок. Сам не проверял, хотя пользовался такими картами.

            • MaFrance351
              /#24967922

              Увы, дампа этой карты у меня нет. Так что проверить не могу.

            • dmsushko
              /#24969408 / +1

              Эх, давно это было...

              статья в журнале Xakep №2 за 1999г.