Наиболее полно и точно карты с магнитной полосой описаны в стандартах ISO7810-ISO7813, в частности:
- ISO7810 (ГОСТ Р ИСО/МЭК 7810-2002) — Карты идентификационные. Физические характеристики.
- ISO7811-2 (ГОСТ Р ИСО/МЭК 7811-2-2001) — Карты идентификационные. Способ записи. Часть 2. Магнитная полоса малой коэрцетивной силы.
- ISO7811-6 (ГОСТ Р ИСО/МЭК 7811-6-2001) — Карты идентификационные. Способ записи. Часть 6. Магнитная полоса большой коэрцетивной силы.
Кроме того, существует группа стандартов на карты тонкие гибкие — ИСО/МЭК 15457, но речь пойдёт не о них (это мягкие карты с магнитной полосой для проезда на общественном транспорте, оплаты автостоянок, платных автодорог и т.д., форматов TFC.0, TFC.1, TFC.5)
Итак, согласно описанным выше стандартам, карты с магнитной полосой бывают трёх форматов: ID-1, ID-2, ID-3. Наиболее распространённым и привычным для нас является формат ID-1, именно в таком формате выпускается большинство пластиковых карт, о нём и пойдёт речь. На карте формата ID-1 есть 3 дорожки с информацией: ISO1, ISO2, ISO3, разделённые защитными промежутками, чтобы данные с разных дорожек не накладывались друг на друга (обычно эти промежутки есть, хотя на рисунке ниже видно, что по стандарту края дорожек вполне могут накладываться друг на друга). Размеры карты и расположение дорожек смотрим на рисунке ниже.
Информация на магнитной полосе карты записана с помощью F/2F частотного кодирования (с чем это едят и как можно декодировать — читаем вот здесь) и представляет собой алфавитно-цифровые символы в 7-ми битной кодировке или цифровые символы в 5-ти битной кодировке.
Для определения ошибок считывания применяется контроль чётности и продольный контроль по избыточности (или продольный резервный контроль — LRC).
В обоих кодировках самый старший бит используется для контроля чётности, а остальные биты — это биты данных. То есть биты данных составляют соответственно 6 и 4 бита (следовательно, ёмкость кодировок составляет: 26=64 символа и 24=16 символов). Бит контроля чётности позволяет обнаружить одиночные ошибки при считывании.
Продольный резервный контроль производится следующим образом — между всеми словами данных (естественно, без бита чётности) последовательно выполняется операция XOR (исключающее ИЛИ), полученное слово дополняется битом контроля чётности и дописывается в самом конце записи, после символа end. Совместно с контролем чётности LRC позволяет обнаружить двойные ошибки при считывании.
На магнитной полосе сначала записаны младшие биты, потом старшие, в этом же порядке они считываются (то есть как бы задом наперёд). Если приёмный регистр считывателя выполняет сдвиг влево и запись в младший разряд последнего считанного бита, то в результате в регистре будет восстановлен нормальный порядок бит (сначала старшие, потом младшие биты). В представленных ниже таблицах сохранён нормальный порядок бит (бит чётности отделён пробелом).
Таблицы кодировок:
Пятибитная кодировка
Двоичные данные | hex | Символ | Служебная функция |
1 0000 | 00h | 0 | |
0 0001 | 01h | 1 | |
0 0010 | 02h | 2 | |
1 0011 | 03h | 3 | |
0 0100 | 04h | 4 | |
1 0101 | 05h | 5 | |
1 0110 | 06h | 6 | |
0 0111 | 07h | 7 | |
0 1000 | 08h | 8 | |
1 1001 | 09h | 9 | |
1 1010 | 0Ah | : | управление |
0 1011 | 0Bh | ; | начало (start) |
1 1100 | 0Ch | < | управление |
0 1101 | 0Dh | = | разделитель |
0 1110 | 0Eh | > | управление |
1 1111 | 0Fh | ? | конец (end) |
Семибитная кодировка
Двоичные данные | hex | Символ | Служебная функция |
1 000000 | 00h | пробел | |
0 000001 | 01h | ! | |
0 000010 | 02h | " | |
1 000011 | 03h | # | резерв |
0 000100 | 04h | $ | |
1 000101 | 05h | % | начало (start) |
1 000110 | 06h | & | |
0 000111 | 07h | ‘ | |
0 001000 | 08h | ( | |
1 001001 | 09h | ) | |
1 001010 | 0Ah | * | |
0 001011 | 0Bh | + | |
1 001100 | 0Ch | , | |
0 001101 | 0Dh | — | |
0 001110 | 0Eh | . | |
1 001111 | 0Fh | / | |
0 010000 | 10h | 0 | |
1 010001 | 11h | 1 | |
1 010010 | 12h | 2 | |
0 010011 | 13h | 3 | |
1 010100 | 14h | 4 | |
0 010101 | 15h | 5 | |
0 010110 | 16h | 6 | |
1 010111 | 17h | 7 | |
1 011000 | 18h | 8 | |
0 011001 | 19h | 9 | |
0 011010 | 1Ah | : | |
1 011011 | 1Bh | ; | |
0 011100 | 1Ch | < | |
1 011101 | 1Dh | = | |
1 011110 | 1Eh | > | |
0 011111 | 1Fh | ? | конец (end) |
0 100000 | 20h | @ | |
1 100001 | 21h | A | |
1 100010 | 22h | B | |
0 100011 | 23h | C | |
1 100100 | 24h | D | |
0 100101 | 25h | E | |
0 100110 | 26h | F | |
1 100111 | 27h | G | |
1 101000 | 28h | H | |
0 101001 | 29h | I | |
0 101010 | 2Ah | J | |
1 101011 | 2Bh | K | |
0 101100 | 2Ch | L | |
1 101101 | 2Dh | M | |
1 101110 | 2Eh | N | |
0 101111 | 2Fh | O | |
1 110000 | 30h | P | |
0 110001 | 31h | Q | |
0 110010 | 32h | R | |
1 110011 | 33h | S | |
0 110100 | 34h | T | |
1 110101 | 35h | U | |
1 110110 | 36h | V | |
0 110111 | 37h | W | |
0 111000 | 38h | X | |
1 111001 | 39h | Y | |
1 111010 | 3Ah | Z | |
0 111011 | 3Bh | [ | резерв |
1 111100 | 3Ch | \ | резерв |
0 111101 | 3Dh | ] | резерв |
0 111110 | 3Eh | ^ | разделитель |
1 111111 | 3Fh | _ |
По правилам, данные на любой дорожке должны начинаться со служебного символа «start» и заканчиваться служебным символом «end». Эти символы выбраны таким образом, что позволяют определить начало блока полезной информации, определить направление считывания карты и даже определить формат кодировки информации (пятибитная или семибитная).
Управляющие символы предназначены для целей управления аппаратными средствами и не могут быть использованы для передачи информации (содержания данных).
Разделители используются для разделения полей данных на карте.
В семибитной кодировке символы [ \ ] зарезервированы для дополнительных национальных символов и не должны применяться в рамках международного обмена информацией, символ # зарезервирован для произвольных дополнительных графических символов.
Ну и пара примеров того, как это может выглядеть:
— стандартная дорожка ISO2:
;XXXXXXXXXXXXXXXX=YYYYYYYYYYYYYYYYY?Z, 37 символов
X…X — номер карты, Z — LRC (здесь, как видите, данные начинаются с символа start и заканчиваются символом end, номер карты 16-тизначный, такой же как и у банковских карт, присутствует LRC, то есть всё по правилам)
— нестандартная дорожка ISO2:
1:XXXX<YYYYY:1, 14 символов
(на этой дорожке нет ни символа start, ни символа end, не говоря уже про LRC)
Подробно про приём и декодирования F/2F частотно кодированных сигналов можно прочитать вот здесь.
А вот здесь можно почитать про то, как самостоятельно изготовить простейший считыватель магнитной полосы пластиковых карт.