Задание: необходимо создать кодовое слово (сокращенный вариант собственной фамилии и инициалов) по алгоритму А.С. Пушкина. Затем создать для полученного сокращения Micro QR Code вер. М2. Данный режим невозможно прочитать стандартными ресурсами мобильных устройств, производимых GAFAM (как оказалось, свободно распространяемые библиотеки просто страшно глючат, поэтому Ассоциация отказалась и от этого режима).

Этап 0. Алгоритм А.С. Пушкина

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

Немного упростим и применим данный алгоритм:

  • исходный текст (Фамилия И.О.) – Рыженко А.А.;

  • преобразуем в английский вариант – Ryzhenko A.A.;

  • убираем лишние символы и пробелы – RyzhenkoAA;

  • сокращаем до 6 символов (ограничение М2) – RznkAA;

  • и переводим в верхний регистр (еще одно ограничение М2) – RZNKAA.

Этап 1. Кодирование исходных данных

Рассмотрим М2 поближе. Имеем матрицу размерностью 13х13 бинарных символов, один индикатор и два определителя (горизонтальный и вертикальный) (рис. 1).

Рисунок 1 – Исходная матрица для М2
Рисунок 1 – Исходная матрица для М2

Примечание: здесь и далее будем использовать один из доступных программных инструментов Ассоциации – MS Excel (русскоязычная версия). Как следствие, все команды автоматизации процессов будут на кириллице.

Примечание: здесь и далее будет использоваться информация ГОСТ Р ИСО/МЭК 18004-2015 или в оригинале ISO/IEC 18004:2015 (далее – ГОСТ).

Первый наносимый ограничитель символ на матрицу М2 – надлежащие битовые последовательности информации о формате (рис. 2). Чтение битовой последовательности начинается с 14 бита, т.е. последовательность чтения/записи будет 14, 13, 12, 11, 10 и т.д.

Рисунок 2 – Надлежащие битовые последовательности информации о формате
Рисунок 2 – Надлежащие битовые последовательности информации о формате

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

Второй не менее важный элемент М2 – маршрут последовательности заполнения битами данных поля матрицы (рис. 3). Данная схема отражена на рисунке 11 ГОСТ.

Рисунок 3 – Маршрут последовательности записи бит кода М2
Рисунок 3 – Маршрут последовательности записи бит кода М2

Если наложить маршрут на матрицу, получаем последовательность из 80 бит кода М2 (рис. 4). Число 80 пригодится чуть позже при работе с кодами Рида-Соломона.

Рисунок 4 – Кодовая последовательность на матричном поле М2
Рисунок 4 – Кодовая последовательность на матричном поле М2

Переходим к реализации первого этапа – получение кодовой комбинации исходного текста. В системе QR Code существует несколько разновидностей кодирования: числовойалфавитно-цифровойбайтовыйкандзиструктурированное соединение и FNC1. Самые простые – числовой (число определенной длины из цифр 0..9) и алфавитно-цифровой (табл. 1).

Таблица 1 – Кодирование/декодирование для алфавитно-цифрового режима (Таблица 5 ГОСТ)

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

Знак

Значение

0

0

6

6

С

12

I

18

О

24

U

30

SP

36

.

42

1

1

7

7

D

13

J

19

Р

25

V

31

$

37

/

43

2

2

8

8

Е

14

К

20

Q

26

W

32

%

38

:

44

3

3

9

9

F

15

L

21

R

27

X

33

*

39

 

 

4

4

А

10

G

16

М

22

S

28

Y

34

+

40

 

 

5

5

В

11

Н

17

N

23

Т

29

Z

35

-

41

 

 

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

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

Используем алфавитно-цифровую систему кодирования для выполнения требований задания. Следующее ограничение – необходимо кодировать ровно 6 символов. М2 поддерживает два уровня исправления ошибок – L и M. Обращаемся к таблице 7 ГОСТ, получаем, что только уровень L поддерживает емкость 6 символов (табл. 2, емкость данных для алфавитно-цифрового режима). Выбор уровня исправления ошибок L будет отражен позже на пятом этапе в надлежащей битовой последовательности информации о формате (рис. 2).

Таблица 2 – Число знаков символа и емкость входных данных для QR Code (Таблица 7 ГОСТ)

Версия

Уровень исправления ошибок

Число кодовых слов данных

Число битов для данных

Емкость данных для разных режимов

Цифровой

Алфавитно-цифровой

Байтовый

Кандзи

М1

Только обнаружение ошибок

3

20

5

-

-

-

М2

L

5

40

10

6

-

-

М

4

32

8

5

-

-

М3

L

11

84

23

14

9

6

М

9

68

18

11

7

4

М4

L

16

128

35

21

15

9

М

14

112

30

18

13

8

Q

10

80

21

13

9

5

Далее воспользуемся алгоритмом, представленном в ГОСТ (п. 7.4.4). Разбиваем кодовое слово на слоги по две буквы. Получаем следующие комбинации – RZ, NK и AA. Создадим в MS Excel новый пустой Лист. Пример готового результата представлен на рисунке 5.

Рисунок 5 – Лист кодирования исходной информации
Рисунок 5 – Лист кодирования исходной информации

Для автоматизации первого этапа сначала переносим таблицу символов (табл. 1), начиная с ячейки (2, 2). Резервируем восьмую строчку, начиная с ячейки (8, 3) для исходных данных. В ячейку (8,12) заносим число 45 – множитель кода первой буквы кодового слога. В десятой строке ячейки заполнены парами ссылок на слоги исходного слова. Например, в ячейке (10, 3) – =R[-2]C, а в ячейке (10, 10) – =R[-2]C[-2] (рис. 6).

Рисунок 6 – Пример ссылки на ячейку
Рисунок 6 – Пример ссылки на ячейку

В одиннадцатой строчке происходит автоматический поиск кода символа в последовательности символов. Например, в ячейке (11, 3):

=ИНДЕКС(R[-6]C[-1]:R[-6]C[43];ПОИСКПОЗ(R[-1]C;R[-7]C[-1]:R[-7]C[43];0))

где

R[-6]C[-1]:R[-6]C[43] – порядковый номер символа (строка 5 на рис. 5);

R[-1]C – искомый в последовательности символ (в данном случае в ячейке (10, 3));

R[-7]C[-1]:R[-7]C[43] – последовательность символов для поиска (строка 4 на рис. 5).

Заполним ниже таблицу 11 строки со ссылками на соответствующие ячейки:

(11, 3)

=ИНДЕКС(R[-6]C[-1]:R[-6]C[43];ПОИСКПОЗ(R[-1]C;R[-7]C[-1]:R[-7]C[43];0))

(11, 4)

=ИНДЕКС(R[-6]C[-2]:R[-6]C[42];ПОИСКПОЗ(R[-1]C;R[-7]C[-2]:R[-7]C[42];0))

(11, 6)

=ИНДЕКС(R[-6]C[-4]:R[-6]C[40];ПОИСКПОЗ(R[-1]C;R[-7]C[-4]:R[-7]C[40];0))

(11, 7)

=ИНДЕКС(R[-6]C[-5]:R[-6]C[39];ПОИСКПОЗ(R[-1]C;R[-7]C[-5]:R[-7]C[39];0))

(11, 9)

=ИНДЕКС(R[-6]C[-7]:R[-6]C[37];ПОИСКПОЗ(R[-1]C;R[-7]C[-7]:R[-7]C[37];0))

(11, 10)

=ИНДЕКС(R[-6]C[-8]:R[-6]C[36];ПОИСКПОЗ(R[-1]C;R[-7]C[-8]:R[-7]C[36];0))

В строке 13 объединяем ячейки (13, 3) и (13, 4). Также объединяем ячейки (13, 6) и (13, 7), и (13, 9) и (13, 10). В ячейку (13, 3) прописываем:

=R[-2]C*R[-5]C[9]+R[-2]C[1]

где

R[-2]C – ячейка с числом 27 (рис. 5);

R[-5]C[9] – ячейка с числом 45 (рис. 5);

R[-2]C[1] – ячейка с числом 35 (рис. 5);

В результате в ячейке должно появиться число 1250. Аналогичные ссылки на вторую и третью пары букв добавляем в ячейки (13, 6) и (13, 9):

=R[-2]C*R[-5]C[6]+R[-2]C[1]

=R[-2]C*R[-5]C[3]+R[-2]C[1]

Следующий этап – необходимо перевести полученные десятичные числа 1250, 1055 и 460 в двоичное представление. В 15 строке объединяем ячейки с 3 по 9. Аналогично объединяем ячейки в 17 и 19 строках (рис. 5).

В ячейку (15, 3) добавляем:

=ОСНОВАНИЕ(R[-2]C;2;11)

В ячейку (17, 3) добавляем:

=ОСНОВАНИЕ(R[-4]C[3];2;11)

В ячейку (19, 3) добавляем:

=ОСНОВАНИЕ(R[-6]C[6];2;11)

Далее необходимо объединить все три полученные бинарные кодовые последовательности в одну. В 21 строке объединяем ячейки с 3 по 20. В ячейку (21, 3) добавляем:

=R[-6]C&R[-4]C&R[-2]C

Полученная кодовая комбинация (рис. 5):

100111000101000001111100111001100

К полученной кодовой комбинации необходимо добавить служебную информацию: индикатор алфавитно-цифрового режима для вер. М2 и число знаков (в данном случае 6 знаков – RZNKAA). Воспользуемся таблицами 2 и 3 ГОСТ. В таблице индикаторов режима (табл. 3) определяем, что индикатор алфавитно-цифрового режима для вер. М21. В таблице числа битов в индикаторе числа знаков (табл. 4) определяем, что выделяется три бита на описание числа знаков, т.е. число 6 будет представлено как 110.

Таблица 3 – Индикаторы режима для QR Code (Таблица 2 ГОСТ)

Режим

Символы QR Code

Символы Micro QR Code

версия

любой версии

М1

М2

М3

M4

Длина индикатора режима, биты

4

0

1

2

3

ECI

0111

n/a

n/a

n/a

n/a

Числовой

0001

n/a

0

00

000

Алфавитно-цифровой

0010

n/a

1

01

001

Байтовый

0100

n/a

n/a

10

010

Кандзи

1000

n/a

n/a

11

011

Структурированное соединение

0011

n/a

n/a

n/a

n/a

FNC1

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

n/a

n/a

n/a

n/a

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

Ограничитель (конец сообщения)

0000

000

00000

0000000

000000000

Таблица 4 – Число битов в индикаторе числа знаков для QR Code (Таблица 3 ГОСТ)

Версия

Числовой режим

Алфавитно-цифровой режим

Байтовый режим

Режим кандзи

M1

3

n/a

n/a

n/a

М2

4

3

n/a

n/a

М3

5

4

4

3

M4

6

5

5

4

1-9

10

9

8

8

10-26

12

11

16

10

27-40

14

13

16

12

Для проверки воспользуемся функцией (рис. 7). В ячейку (10, 33) добавляем функцию:

=ДЕС.В.ДВ(RC[-1];3)

Рисунок 7 – Служебная информация
Рисунок 7 – Служебная информация

Объединяем служебную информацию и исходный код в единую последовательность:

1 110 100111000101000001111100111001100

Объединяем ячейки (12, 21) – (12, 40). В полученную ячейку (12, 21) добавляем код:

=R[-3]C[11]&R[-2]C[12]&R[9]C[-18]

Результат формирования текущей битовой последовательности представлен на рисунке 8.

Рисунок 8 – Текущий результат битовой последовательности
Рисунок 8 – Текущий результат битовой последовательности

Для дальнейшей работы с кодами Рида-Соломона (2 этап) необходимо сделать полученную последовательность по количеству символов кратной 8, добавить биты ограничители. В текущей битовой последовательности в ячейке (12, 21) ровно 37 символов. Для кратности 8 добавляем три бита ограничителя – 000 (рис. 10):

1110100111000101000001111100111001100 000

В строке 18 объединены ячейки с 21 по 40. В полученную ячейку (18, 21) добавлен следующий код:

=R[-6]C&R[-4]C[5]

В результате итоговая последовательность в ячейке (18, 21) представлена как:

1110100111000101000001111100111001100000

Проверяем по таблице 2 (ГОСТ Таблица 7) насколько получилась правильная комбинация. Напротив строки M2-L в столбце «Число кодовых слов данных» указано число 5, т.е. должно получиться 5 частей по 8 бит – 11101001 11000101 00000111 11001110 01100000. Следовательно, полученная последовательность полностью соответствует требованиям ГОСТ.

Для разделения итоговой битовой комбинации на пять 8-битных последовательностей воспользуемся командой =ПСТР(ссылка на ячейку; позиция первого символа; количество бит). Получаем следующие комбинации (рис. 10):

Диапазон ячеек

Значение

(20, 24)-(20, 29)

=ПСТР(R[-2]C[-3];1;8)

(21, 24)-(21, 29)

=ПСТР(R[-3]C[-3];9;8)

(22, 24)-(22, 29)

=ПСТР(R[-4]C[-3];17;8)

(23, 24)-(23, 29)

=ПСТР(R[-5]C[-3];25;8)

(24, 24)-(24, 29)

=ПСТР(R[-6]C[-3];33;8)

Для визуализации полученного результата перенесем полученную битовую комбинацию в шаблон Micro QR Code вер. М2 (рис. 9).

Рисунок 9 – Черновик Micro QR Code (последовательность)
Рисунок 9 – Черновик Micro QR Code (последовательность)
Рисунок 9b – Черновик Micro QR Code (без последовательности)
Рисунок 9b – Черновик Micro QR Code (без последовательности)

Для перехода ко 2 этапу необходимо перевести полученные 8-битовые комбинации в десятичный вид. Воспользуемся командой =ДВ.В.ДЕС(ссылка на ячейку), получаем последовательность чисел (рис. 10):

233, 197, 7, 206, 96

Диапазон ячеек

Значение

(20, 30)-(20, 31)

=ДВ.В.ДЕС(RC[-6])

(21, 30)-(21, 31)

=ДВ.В.ДЕС(RC[-6])

(22, 30)-(22, 31)

=ДВ.В.ДЕС(RC[-6])

(23, 30)-(23, 31)

=ДВ.В.ДЕС(RC[-6])

(24, 30)-(24, 31)

=ДВ.В.ДЕС(RC[-6])

Рисунок 10 – Итог первого этапа кодирования
Рисунок 10 – Итог первого этапа кодирования

Итак, итоговая комбинация: 233, 197, 7, 206, 96. Можно переходить ко 2 этапу.

Этап 2. Генерация кодовых слов исправления ошибок

Для генерации кодовых слов исправления ошибок необходимо использовать алгоритм Рида-Соломона на поле Галуа GF(28).

Примечание: для самых любопытных, если интересно посмотреть с точки зрения алгебры множеств то, что будет описываться дальше на примере в таблице MS Excel, можно посмотреть/изучить достаточно хороший материал на Хабр:

[1] Код Рида-Соломона

[2] Кодирование Рида-Соломона для чайников

[3] Арифметика полей Галуа для кодирования информации кодами Рида-Соломона

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

Создаем новый Лист в Книге MS Excel. Забегая вперед, демонстрация результата (рис. 11).

Рисунок 11 – Пример полученного результата
Рисунок 11 – Пример полученного результата

Для деления полиномов будем использовать поле Галуа GF(28) и обратное поле Галуа GF(28) – обязательное требование при работе с QR Code в ГОСТ. Можно просто переписать большую таблицу значений в ячейки, но предполагалась автоматизация. Следовательно, воспользуемся простыми функциями для создания полей.

Поле Галуа GF(28) представляет фиксированный набор из 256 чисел в диапазоне от 0 до 255. Сначала зададим простой ряд натуральных чисел от 0 до 255 в строке 2. В ячейке (2, 2) – 0, в (2, 3) – 1, в (2, 4) – 2 и т.д. до ячейки (2, 257) – 255. Заполняем третью строку. Первая часть идет с простыми значениями:

Ячейка

Значение

(3, 2)

1

(3, 3)

2

(3, 4)

=RC[-1]*2

(3, 5)

=RC[-1]*2

(3, 6)

=RC[-1]*2

(3, 7)

=RC[-1]*2

(3, 8)

=RC[-1]*2

(3, 9)

=RC[-1]*2

На этом простая часть закончилась, дальше чуть посложнее. Начиная с ячейки (3, 10) необходимо во все последующие ячейки до (3, 257) добавить следующую функцию:

=ЕСЛИ(2*RC[-1]>254;БИТ.ИСКЛИЛИ(2*RC[-1];285);RC[-1]*2)

где добавлено условие: если значение из предыдущей ячейки умноженное на 2 превышает 254, то необходимо выполнить XOR с числом 285. Почему именно 285 описано в статьях по ссылкам выше. Если число меньше 254, то просто оставляем в текущей ячейке умноженное на 2 полученное значение.

Для контроля полученного результата можно воспользоваться рисунком 11.

Обратное поле Галуа GF(28) аналогично представляет фиксированный набор из 256 чисел в диапазоне от 0 до 255. Сначала зададим простой ряд натуральных чисел от 0 до 255 в шестой строке. В ячейке (6, 2) – 0, в (6, 3) – 1, в (6, 4) – 2 и т.д. до ячейки (6, 257) – 255. Заполняем седьмую строку. В ячейке (7, 2) – ставим прочерк. Данного значения не существует. Ячейки (7, 3) – (7, 257) заполняем функцией:

=ИНДЕКС(R2C2:R2C257;ПОИСКПОЗ(R[-1]C;R3C2:R3C257;0))

где производится поиск по индексу шестой строки соответствующего значения в поле Галуа GF(28). Для контроля полученного результата также можно воспользоваться рисунком 11. В результате оба поля должны быть созданы в полном объеме.

Переходим к основному действию – деление полиномов. Сначала необходимо определить уровень корректирующего полинома. На первом этапе получили максимальное количество бит на поле М2 (рис. 4) – 80 бит. Далее определили последовательность бит исходных данных со служебной информацией (рис. 10) – 5 значений по 8 бит (итого – 40). Следовательно, корректирующий код исправления ошибок также должен состоять из 40 бит (80-40=40 бит) или 5 чисел по 8 бит. И здесь начинаются странности с ГОСТ.

Примечание: не ищите в ГОСТ алгоритма определения необходимого количества бит корректирующего кода исправления ошибок. В оригинале ISO тоже нет. Единственный индикатор добавлен в таблицу 9 ГОСТ, столбик «Число кодовых слов исправления ошибок».

Примечание: все необходимые коэффициенты полиномов можно найти в форме степеней в приложении А ГОСТ, таблица А.1. Но в ГОСТ не представлен механизм применения полиномов. Общее описание алгоритма, т.е. то, что должно получиться, приведено в п. 7.5.2. ГОСТ.

Обращаемся к таблице А.1 ГОСТ. Полином 5 уровня имеет коэффициенты 113, 164, 166, 119, 10.

Все необходимые исходные данные для деления полиномов готовы, переходим к практической составляющей.

Примечание: разные комбинации (длина битовой комбинации исходных данных больше длины битовой комбинации корректирующего полинома или длина битовой комбинации исходных данных меньше длины битовой комбинации корректирующего полинома) имеют разные алгоритмы реализации. Далее будет описан алгоритм, когда длины совпадают.

Возвращаемся к битовой комбинации исходных данных (рис. 10). И переносим в ячейки текущего Листа Книги MS Excel (рис. 11):

Ячейка

Значение

(13, 24)

233

(13, 25)

197

(13, 26)

7

(13, 27)

206

(13, 28)

96

Заполняем 15 строку значениями (коэффициентами) корректирующего полинома (рис. 11):

Ячейка

Значение

(15, 24)

113

(15, 25)

164

(15, 26)

166

(15, 27)

119

(15, 28)

10

Каждый этап деления будет состоять из 4 последовательных шагов. Каждый шаг будет описан отдельно. Переходим на 16 строку. Ячейка (16, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-3]C[1];R6C2:R6C257;0))

где ищем значение первого числа исходного кода (233) в обратном поле Галуа GF(28). Получаем результат – 245.

В ячейки (16, 24)-(16, 28) прописываем следующую функцию:

=ОСТАТ(R[-1]C+R16C23;255)

В результате получаем ряд чисел:

103, 154, 156, 109, 0

Переходим к 17 строке. Ячейки (17, 23)-(17, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

233, 136, 57, 228, 189, 1

Переходим к 18 строке. Ячейки (18, 23)-(18, 28) заполняем следующей функцией:

=R[-5]C[1]

В результате получаем ряд чисел:

233, 197, 7, 206, 96, 0

Переходим к 19 строке. Ячейки (19, 23)-(19, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 77, 62, 42, 221, 1

Первый этап деления выполнен. Все 4 шага описаны. Всего количество этапов будет 5 – по количеству значений исходного кода.

 Переходим на 20 строку. Ячейка (20, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (77) в обратном поле Галуа GF(28). Получаем результат – 145.

В ячейки (20, 24)-(20, 28) прописываем следующую функцию:

=ОСТАТ(R15C+R20C23;255)

В результате получаем ряд чисел:

3, 54, 56, 9, 155

Переходим к 21 строке. Ячейки (21, 23)-(21, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

77, 8, 80, 93, 58, 114

Переходим к 22 строке. Ячейки (22, 23)-(22, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

77, 62, 42, 221, 1, 0

Переходим к 23 строке. Ячейки (23, 23)-(23, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 54, 122, 128, 59, 114

Второй этап деления выполнен.

 Переходим на 24 строку. Ячейка (24, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (54) в обратном поле Галуа GF(28). Получаем результат – 249.

В ячейки (24, 24)-(24, 28) прописываем следующую функцию:

=ОСТАТ(R15C+RC23;255)

В результате получаем ряд чисел:

107, 158, 160, 113, 4

Переходим к 25 строке. Ячейки (25, 23)-(25, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

54, 104, 183, 230, 31, 16

Переходим к 26 строке. Ячейки (26, 23)-(26, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

54, 122, 128, 59, 114, 0

Переходим к 27 строке. Ячейки (27, 23)-(27, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 18, 55, 221, 109, 16

Третий этап деления выполнен.

 Переходим на 28 строку. Ячейка (28, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (18) в обратном поле Галуа GF(28). Получаем результат – 224.

В ячейки (28, 24)-(28, 28) прописываем следующую функцию:

=ОСТАТ(R15C+RC23;255)

В результате получаем ряд чисел:

82, 133, 135, 88, 234

Переходим к 29 строке. Ячейки (29, 23)-(29, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

18, 211, 109, 169, 254, 251

Переходим к 30 строке. Ячейки (30, 23)-(30, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

18, 55, 221, 109, 16, 0

Переходим к 31 строке. Ячейки (31, 23)-(31, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 228, 176, 196, 238, 251

Четвертый этап деления выполнен.

 Переходим на 32 строку. Ячейка (32, 23):

=ИНДЕКС(R7C2:R7C257;ПОИСКПОЗ(R[-1]C[1];R6C2:R6C257;0))

где ищем значение первого числа переходного кода (228) в обратном поле Галуа GF(28). Получаем результат – 156.

В ячейки (32, 24)-(32, 28) прописываем следующую функцию:

=ОСТАТ(R15C+RC23;255)

В результате получаем ряд чисел:

14, 65, 67, 20, 166

Переходим к 33 строке. Ячейки (33, 23)-(33, 28) заполняем следующей функцией:

=ИНДЕКС(R3C2:R3C257;ПОИСКПОЗ(R[-1]C;R2C2:R2C257;0))

В результате получаем ряд чисел:

228, 19, 190, 194, 180, 63

Переходим к 34 строке. Ячейки (34, 23)-(34, 28) заполняем следующей функцией:

=R[-3]C[1]

В результате получаем ряд чисел:

228, 176, 196, 238, 251, 0

Переходим к 35 строке. Ячейки (35, 23)-(35, 28) заполняем следующей функцией:

=БИТ.ИСКЛИЛИ(R[-2]C;R[-1]C)

В результате получаем ряд чисел:

0, 163, 122, 44, 79, 63

Заключительный пятый этап деления выполнен.

Итак, вторая часть битовой комбинации кода получена. Далее необходимо первую и вторую часть перевести в двоичную комбинацию и получить итоговую битовую последовательность.

Переносим две исходные последовательности в столбики в ячейки:

Ячейка

Значение

Ячейка

Значение

(17, 5)-(17, 6)

233

(17, 14)-(17, 15)

163

(18, 5)-(18, 6)

197

(18, 14)-(18, 15)

122

(19, 5)-(19, 6)

7

(19, 14)-(19, 15)

44

(20, 5)-(20, 6)

206

(20, 14)-(20, 15)

79

(21, 5)-(21, 6)

96

(21, 14)-(21, 15)

63

Получаем два столбика двоичных последовательностей (рис. 11):

Ячейка

Значение

Ячейка

Значение

(17, 8)-(17, 11)

=ДЕС.В.ДВ(RC[-3];8)

(17, 17)-(17, 20)

=ДЕС.В.ДВ(RC[-3];8)

(18, 8)-(18, 11)

=ДЕС.В.ДВ(RC[-3];8)

(18, 17)-(18, 20)

=ДЕС.В.ДВ(RC[-3];8)

(19, 8)-(19, 11)

=ДЕС.В.ДВ(RC[-3];8)

(19, 17)-(19, 20)

=ДЕС.В.ДВ(RC[-3];8)

(20, 8)-(20, 11)

=ДЕС.В.ДВ(RC[-3];8)

(20, 17)-(20, 20)

=ДЕС.В.ДВ(RC[-3];8)

(21, 8)-(21, 11)

=ДЕС.В.ДВ(RC[-3];8)

(21, 17)-(21, 20)

=ДЕС.В.ДВ(RC[-3];8)

В 23 строке объединяем ячейки (23, 5)-(23, 11) и (23, 14)-(23, 20). В ячейку (23, 5) добавляем функцию:

=R[-6]C[3]&R[-5]C[3]&R[-4]C[3]&R[-3]C[3]&R[-2]C[3]

И в ячейку (23, 14) добавляем функцию:

=R[-6]C[3]&R[-5]C[3]&R[-4]C[3]&R[-3]C[3]&R[-2]C[3]

В 25 строке объединяем ячейки (25, 5)-(25, 20). В ячейку (25, 5) добавляем функцию:

=R[-2]C&R[-2]C[9]

Пример итогового варианта представлен на рисунке 12.

Рисунок 12 – Итоговый вариант полученной комбинации
Рисунок 12 – Итоговый вариант полученной комбинации

Этап 3. Размещение модулей в матрице символа

Шаблон поиска и шаблоны синхронизации размещают в пустой матрице 13×13, а модули в позиции для информации о формате временно оставляют пустыми. Кодовые слова, полученные на этапах 1 и 2 (табл. 5), размещают в матрице в соответствии с п. 7.7.3 ГОСТ, в результате получают символ, приведенный на рис. 13.

Таблица 5 – Кодовые слова

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

1

1

1

0

1

0

0

1

1

1

0

0

0

1

0

1

0

0

0

0

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

0

1

1

1

1

1

0

0

1

1

1

0

0

1

1

0

0

0

0

0

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

1

0

1

0

0

0

1

1

0

1

1

1

1

0

1

0

0

0

1

0

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

1

1

0

0

0

1

0

0

1

1

1

1

0

0

1

1

1

1

1

1

 

Рисунок 13 – Размещение модулей данных в символе до маскирования данных (последовательность)
Рисунок 13 – Размещение модулей данных в символе до маскирования данных (последовательность)
Рисунок 13 – Размещение модулей данных в символе до маскирования данных (без последовательности)
Рисунок 13 – Размещение модулей данных в символе до маскирования данных (без последовательности)

Этап 4. Выбор шаблона маски данных

Для выбора наиболее удачного варианта применяются шаблоны маски данных согласно п. 7.8.2 ГОСТ по очереди и оценивают результаты по п. 7.8.3 ГОСТ. Рассмотрим последовательно описанный в пунктах ГОСТ процесс для данного примера. Создаем новый Лист в Книге MS Excel.

На рисунке 22 ГОСТ представлены маски для Micro QR Code, вычисляемые по формулам таблицы 10 ГОСТ (табл. 6).

Таблица 6 – Условия генерации шаблона маски данных

Указатель шаблона маски данных для символов QR Code

Указатель шаблона маски данных для символов Micro QR Code

Условие

000

 

(i + j) mod 2 = 0

001

00

i mod 2 = 0

010

 

j mod 3 = 0

011

 

(i + j) mod 3 = 0

100

01

((i div 2) + (j div 3)) mod 2 = 0

101

 

(ij) mod 2 + (ij) mod 3 = 0

110

10

((ij) mod 2 + (ij) mod 3) mod 2 = 0

111

11

((i + j) mod 2 + (i + j) mod 3) mod 2 = 0

Можно процесс наполнения масок бинарными данными автоматизировать, но в данной постановке решено пропустить этап и заполнить маски вручную. Для любопытных, подсказка, как можно автоматизировать (рис. 14).

Рисунок 14 – Подсказка для автоматизации процесса создания масок
Рисунок 14 – Подсказка для автоматизации процесса создания масок

Переносим указанные в табл. 6 маски на новый Лист MS Excel (рис. 15).

Рисунок 15 – Маски для М2
Рисунок 15 – Маски для М2

Примечание: MS Excel не умеет работать с цветами ячеек. Для дальнейшей автоматизации во всех ячейках масок белые биты подписаны нулями (0), черные – единицами (1).

Бинарную матрицу предыдущего этапа (рис. 13) также переводим в бинарный вид (рис. 16).

Рисунок 16 – Бинарная маска исходных данных (справа)
Рисунок 16 – Бинарная маска исходных данных (справа)

Имеются 4 маски и исходник по полученным данным. Позиции верхних левых углов:

  • маска 00 – ячейка (4, 4);

  • маска 01 – ячейка (4, 20);

  • маска 10 – ячейка (20, 4);

  • маска 11 – ячейка (20, 20);

  • исходные данные – ячейка (4, 36).

Добавляем четыре заготовки для будущих маскированных вариантов (рис. 17). Позиции верхних левых углов заготовок (4, 52), (4, 68), (20, 52) и (20, 68).

Рисунок 17 – Заготовка для маскирования данных
Рисунок 17 – Заготовка для маскирования данных

Пример полученного результата представлен на рисунке 18.

Рисунок 18 – Пример расположения заготовок для маскирования М2
Рисунок 18 – Пример расположения заготовок для маскирования М2

В ячейку (5, 61) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];RC[-16])

Если все сделано корректно, то в ячейке должна появиться цифра один (1). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (00).

 В ячейку (5, 77) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];RC[-32])

Если все сделано корректно, то в ячейке должна появиться цифра один (1). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (01).

 В ячейку (21, 61) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];R[-16]C[-16])

Если все сделано корректно, то в ячейке должна появиться цифра один (1). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (10).

 В ячейку (21, 77) добавляем следующую функцию:

=БИТ.ИСКЛИЛИ(RC[-48];R[-16]C[-32])

Если все сделано корректно, то в ячейке должна появиться цифра один (0). Дальше за нижний правый угол выделенной ячейки (магический квадрат MS Excel) заполняем все остальные ячейки матрицы (11).

 Пример результата маскирования представлен на рисунке 19.

Рисунок 19 – Пример результата маскирования
Рисунок 19 – Пример результата маскирования

Следующий этап – оценка символов Micro QR Code (п. 7.8.3.2. ГОСТ). После выполнения операции маскирования данных в области кодирования символа с каждым шаблоном маски данных оценивают результат, подсчитывая множество темных модулей в каждой из двух границ, которые не содержат шаблоны синхронизации. Чем меньше число темных модулей, тем менее приемлемым является результат. В таких символах рекомендуется иметь больше темных модулей на границе, чтобы более эффективно отличать свободную зону от области кодирования.

Для каждого шаблона маски данных подсчитывают число темных модулей в правой и нижней границах символа (исключая последний модуль шаблона синхронизации). Оценку результата подсчета производят следующим образом:

если SUM1 <= SUM2;

то оценка = SUM1 x 16 + SUM2;

если SUM1 > SUM2;

то оценка = SUM1 + SUM2 x 16;

 где SUM– число темных модулей на правой границе;

SUM2 – число темных модулей на нижней границе.

Рисунок 20 – Пример оценки результата маскирования
Рисунок 20 – Пример оценки результата маскирования

Реализуем данную схему на Листе. Пример полученного результата представлен на рисунке 21.

Рисунок 21 – Пример результата расчетов
Рисунок 21 – Пример результата расчетов

Заполняем ячейки определения количества единиц (1) в правом столбике и нижней строчки каждой матрицы:

Ячейка

Функция

(4, 87)

=СЧЁТЕСЛИ(R[1]C[-23]:R[12]C[-23];1)

(4, 88)

=СЧЁТЕСЛИ(R[12]C[-35]:R[12]C[-24];1)

(5, 87)

=СЧЁТЕСЛИ(RC[-7]:R[11]C[-7];1)

(5, 88)

=СЧЁТЕСЛИ(R[11]C[-19]:R[11]C[-8];1)

(6, 87)

=СЧЁТЕСЛИ(R[15]C[-23]:R[26]C[-23];1)

(6, 88)

=СЧЁТЕСЛИ(R[26]C[-35]:R[26]C[-24];1)

(7, 87)

=СЧЁТЕСЛИ(R[14]C[-7]:R[25]C[-7];1)

(7, 88)

=СЧЁТЕСЛИ(R[25]C[-19]:R[25]C[-8];1)

Заполняем ячейки определения критерия оценки для каждой матрицы:

Ячейка

Функция

(4, 89)-(4, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

(5, 89)-(5, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

(6, 89)-(6, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

(7, 89)-(7, 90)

=ЕСЛИ(RC[-1]<RC[-2];RC[-1]*16+RC[-2];RC[-2]*16+RC[-1])

Выбирают шаблон маски, имеющий наибольший результат. Находим максимум из полученных вариантов. В ячейку (8,89)-(8,90) добавляем функцию:

=МАКС(R[-4]C:R[-1]C[1])

Проверяем полученный результат с примером на рисунке 21. В результате должно получиться число 88. Т.е. для данного символа рекомендуется использовать шаблон маски данных с обозначением 11 (табл. 10). Применяем выбранный шаблон маски данных к области кодирования в матрице согласно п. 7.8 ГОСТ.

 Этап 5. Подготовка информации о формате

В качестве исходных данных используются два показателя:

  • для символа версии M2-L номер равен 1, что в двоичном виде данных – 001 по таблице 13 ГОСТ (табл. 7);

  • полученный на 4 этапе шаблон маски – 11.

 Таблица 7 – Номер символа для Micro QR Code

Номер символа

Версия

Уровень исправления ошибок

Двоичный индикатор

0

М1

Только обнаружение

000

1

М2

L

001

2

М2

М

010

3

М3

L

011

4

М3

М

100

5

М4

L

101

6

М4

М

110

7

М4

Q

111

В результате получают биты данных в информации о формате 001 11:

00111

По таблице С.1 ГОСТ (табл. 8) находим соответствующую битовые последовательности информации о формате. Для данного примера – 101101011110111.

Hidden text

Таблица 8 – Надлежащие битовые последовательности информации о формате

Последовательность до маскирования

Последовательность после маскирования (символы Micro QR Code)

Биты данных

Биты исправления ошибок

Двоичная

Шестнадцатеричная

00000

0000000000

100010001000101

4445

00001

0100110111

100000101110010

4172

00010

1001101110

100111000101011

4Е2В

00011

1101011001

100101100011100

4В1С

00100

0111101011

101010110101110

55АЕ

00101

0011011100

101000010011001

5099

00110

1110000101

101111111000000

5FC0

00111

1010110010

101101011110111

5AF7

01000

1111010110

110011110010011

6793

01001

1011100001

110001010100100

62А4

01010

0110111000

110110111111101

6DFD

01011

0010001111

110100011001010

68СА

01100

1000111101

111011001111000

7678

01101

1100001010

111001101001111

734F

01110

0001010011

111110000010110

7С16

01111

0101100100

111100100100001

7921

10000

1010011011

000011011011110

06DE

10001

1110101100

000001111101001

03Е9

10010

0011110101

000110010110000

0CB0

10011

0111000010

000100110000111

0987

10100

1101110000

001011100110101

1735

10101

1001000111

001001000000010

1202

10110

0100011110

001110101011011

1D5B

10111

0000101001

001100001101100

186С

11000

0101001101

010010100001000

2508

11001

0001111010

010000000111111

203F

11010

1100100011

010111101100110

2F66

11011

1000010100

010101001010001

2А51

11100

0010100110

011010011100011

34E3

11101

0110010001

011000111010100

31D4

11110

1011001000

011111010001101

3E8D

11111

1111111111

011101110111010

ЗВВА

Этап 6. Заключительное формирование символа

Добавляют модули информации о формате в позиции, зарезервированные на этапе 3, с 14 бита по 0 бит (рис. 22):

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

1

0

1

1

0

1

0

1

1

1

1

0

1

1

1

Рисунок 22 – Маска заполнения битовые последовательности информации о формате
Рисунок 22 – Маска заполнения битовые последовательности информации о формате

В результате получаем завершенный символ, приведенный на рис. 23.

Рисунок 23 – Окончательный вид символа версии M2-L
Рисунок 23 – Окончательный вид символа версии M2-L

Можно проверить полученный результат на любом онлайн сканере в сети Интернет. Выделяем в MS Excel полученный код и копируем через буфер обмена в MS Word как рисунок. В MS Word сохраняем полученный рисунок как внешний графический файл в формате .png. Загружаем произвольный онлайн сканер (например) и проверяем полученный Micro QR Code.

Комментарии (2)


  1. Litloc Автор
    10.01.2024 09:53

    Ошибку осознал. Спасибо за подсказку! Относительные ссылки в разных версиях Офиса работают / не работают. Подготовил версию с абсолютными ссылками. А как лучше сделать? Новую статью или эту переделать? Гуру, подсказывайте...


  1. Litloc Автор
    10.01.2024 09:53

    Ссылка на метод шифрования / кодирования Александра Сергеевича:

    https://www.shkolazhizni.ru/culture/articles/16866/

    Достаточно известный пример