|
Бесплатный проезд в электричках
Xakep, номер #048, стр. 048-058-2 С чем едят штрих-код Штрих-код - это не магнитная или смарт-карта, это всего лишь последовательность вертикальных полосок, которую может напечатать каждый. Поэтому непонятно, почему билет так слабо защищен! Существует несколько разных форматов штрих-кодов. Они бывают линейные и двухмерные. Нас будет интересовать линейный код ITF (Interleaved 2 из 5). Код состоит из последовательности чередующихся черных и белых вертикальных полосок, начинающейся и заканчивающейся черными. Полоски бывают широкие (будем обозначать "1") и узкие (будем обозначать "0"). ITF предполагает наличие стартового и стопового символов, которые кодируются "0000" и "100" соответственно. Между этими символами и расположена полезная информация. Свое название код получил, исходя из того, что информация кодируется расположением двух широких полосок среди пяти. Применяя элементарную комбинаторику, получаем, что таким блоком можно закодировать C = 10 различных значений, т.е. все цифры от 0 до 9. Interleaved (перемежающийся - англ.) же он потому, что рассматриваются отдельно черные и отдельно белые полоски. На четных позициях записывается цифра, образованная черными полосками (см. рис. 3). Алфавит кода можно найти на http://www.sbarcode.com/encoding/int25.shtml или на нашем сайте http://tickers.da.ru. Кролики решили подумать Штрих-код железнодорожного билета состоит из 87 полосок. Семь из них - это стартовый и стоповый символы. Остается 80, которые несут информацию. Делим на пять и получаем, что там записано 16 десятичных цифр. Что же это за 16 цифр? Что там записано? Может быть, это номер записи в базе данных проданных билетов? Нет, это невозможно из-за автономности касс. Там закодирована вся информация о билете! Такая вот странная нумерация с нуля сложилась из-за наличия Си'шников в нашей команде :). Сразу возникают следующие вопросы: Q: Почему не кодируются все цифры номеров касс и билета? A: Ответ прост - а зачем? Этого и так вполне достаточно. Q: Какая же позиция в штрих-коде у каждой аббревиатуры (у каждого поля)? A: Все не так просто :). Во-первых, недостаточно знать только это, по той причине, что турникет пропускает только билеты сегодняшней даты, поля которой у нас в таблице не отражены. Во-вторых, эти позиции переставляются каждый день. И, в-третьих, к каждому значению поля каждый день прибавляется по модулю 10, определенное для данного дня и данного поля число (которое мы называем смещением). Рассмотрим перестановку и смещение определенной даты. Сделаем это, например, для 17 марта 2001г: Всю таблицу мы называем маской (mask). Верхнюю строчку - перестановкой (transposition). Нижнюю - вектором смещения (offset vector) или просто вектором. Давай подведем первый итог: Чтобы узнать шифр, т.е. научиться по штрих-коду узнавать все данные о билете и наоборот, генерировать штрих-код по любым желаемым данным, достаточно знать соответствующие дате маску и значения констант. Т.е. по приведенной маске можно создавать и распознавать любой билет, датированный 17-м марта 2001г... |