5.0 0.5 5 38

Как расшифровать QR код?

Ирина Чеверда
Ирина Чеверда
23 сентября 2014
2225
Оцените:
Как расшифровать QR код?

Сегодня очень часто для маркировки различной информации используется QR код. Он представляет собой двухмерный штрих-код, состоящий из черных и белых квадратов. Каждый квадрат является 1 (или 0) битом информации. Такой код легко расшифровать с помощью смартфона со специальным приложением. Однако в некоторых случаях прочитать QR код можно и вручную.

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

  • числовой (цифры 0-9);
  • альфачисловой (цифры 0-9, буквы A-Z, спецсимволы: пробел,$ % * + — / :);
  • битовый;
  • Кандзи (файлы упаковываются в 13 бит);

Как расшифровать QR код?

Вся информация в коде разбивается на блоки. Их можно условно разделить на 4 типа:

  1. область детектирования, то есть преобразовывающий модуль (расположенные по углам кода большие отчетливые квадраты, внутри которых находится еще один черный квадрат). Эта область не несет полезной информации с точки зрения расшифровки данных;
  2. системная информация. Она представляет собой две полосы данных, которые дублируются по 2 раза (итого 4 полосы, расположенных сбоку, справа и снизу от блоков детектирования);
  3. информация о версии кода. От версии кода зависит максимальное количество данных, которое можно зашифровать. Чем выше версия, тем сложнее данные расшифровать вручную. Иногда это просто не целесообразно. С повышением версии, количество блоков в коде будет больше. То есть между преобразовывающими модулями по краям пространство будет заполнено плотнее;
  4. непосредственно данные.

Шаг 1.

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

Теперь нужно вспомнить двоичную систему счисления и записать данные в этой строке. Итак, смотрим на строку (строка заканчивается под левым верхним преобразовывающим модулем) и записываем 0 на пустом месте и 1 на заполненном. Нас интересуют только первые 5 бит информации. Таким образом, получаем строку из 5 цифр (например 10111).

Шаг 2.

Теперь применяем маску к системной информации. Маска — это дополнительный способ защиты информации. Она имеет вид: 101010000010010. Поскольку мы работаем только с 5 битами информации, то и маску сокращаем соответственно. Оставляем первые 5 цифр и получаем 10101. Теперь к нашим 5 битам применяем маску с помощью операции исключающего или (XOR).

Например : 10111 XOR 10101 = 00010

Полученную строку с данными стоит разделить на 2 части. Первые 2 цифры — это уровень коррекции ошибок. В таблице ниже можно ознакомится с их типами.

L 01
M 00
Q 11
H 10

Оставшиеся 3 цифры определяют тип маски. Возможные маски приведены ниже:

Номер маски Если формула верна для приведенных ниже строки/раздела, переключаемся на новый бит
000 (i + j) mod 2 = 0
001 i mod 2 = 0
010 j mod 3 = 0
011 (i + j) mod 3 = 0
100 ((i div 2) + (j div 3)) mod 2 = 0
101 ((i j) mod 2 + (i j) mod 3) mod 2 = 0
110 ((i j) mod 2 + (i j) mod 3) mod 2 = 0

где i — строка, j—раздел.

Шаг 3.

QR код

Переходим к заголовку данных в коде. Заголовок находится в правом нижнем углу. Мысленно выделяем прямоугольник 2×12, который располагается с краю справа и направлен вверх. Запомним его расположение, он нам понадобится при непосредственном чтении данных.

Теперь определяем режим данных. Для этого опять используем двоичную систему. Опускаемся к основанию нашего воображаемого прямоугольника и записываем 0 в белых и 1 в черных клетках, двигаясь змейкой снизу вверх, справа налево. Для заголовка нам достаточно обработать область 4×4. Получаем строку из 4 цифр.

Например: 0100

Список возможных режимов приведен ниже:

ECI 0111
Числовые 0001
Буквенно-числовые 0010
8-битный (байтный) 0100
Кандзи 1000
Структурированное дополнение 0011
FNC1

0101 (1-я позиция)

1001 (2-я позиция)

   

Итак, данная в примере строка с цифрами соответствует данным из 8 битов. Независимо от получившегося типа данных, к ним нужно опять применить маску. Маска в данном случае будет для каждого типа своя. Например, для 8-битного типа данных она будет 0000, для численного - 0110. Вычислять маску можно по приведенным выше формулам.

Опять применяем к вычисленным данным маску с помощью оператора XOR.

Например 0100 XOR 0000 = 0100

Шаг 4.

Приступаем к чтению данных. Данные записаны в нашей прямоугольной области 2×12, начиная с 3-й строки (первые 2 строки- заголовок данных). Строки мы читаем снизу вверх. Итак, переводим в двоичный код всю оставшуюся область прямоугольника. Двигаемся змейкой справа налево. Получаем ряд из 20 цифр. Применяем маску с помощью оператора XOR. Для 8-битного типа данных полная маска будет 0000 0000 0000 0000 0000, для численного- 0001 1000 0110 0001 1000. (Вычисляем маску по приведенным выше формулам).

Теперь определяем режим чтения данных по таблице, приведенной ниже:

Числовые 10 бит / 4 бита
Буквенно-числовые 9 бит
8-битный (байтный) 8 бит

Это значит, что для 8-битного типа данных мы отделим первые 8 цифр, а для числового, например, 10. Получившийся ряд цифр переводим в десятичную систему. Получившееся число — количество пакетов данных. Если получаем 1 — это значит, что зашифрован 1 символ. Расшифровать его можно, переведя из двоичной системы следующие 4 цифры в оставшемся ряду.

Если полученное число пакетов больше, чем 1, то приступаем к дальнейшей расшифровке. Для этого переходим к чтению следующего столбца. Мысленно выделяем область 2×12 слева от первого выделенного прямоугольника. Переводим его в двоичный код, используя тот же принцип «змейки». К получившемуся ряду цифр применяем маску, вычисленную с помощью приведенных выше формул, с помощью оператора XOR. Далее для расшифровки ряда цифр делим его на группу из 8, 9 или 10 цифр (ряд читать справа налево), в зависимости от режима чтения (таблица представлена выше). Переводим каждую группу из двоичной системы. Для численных значений используем перевод в десятичную систему. Для перевод 8-битных данный используем таблицу кодировки ASCII.

Подписывайтесь на наши группы в социальных сетях - смешные статьи, картинки и факты!