Расшифровка DataMatrix кода с пачки сигарет (табачная продукция)

07.06.20

Разработка - Защита ПО и шифрование

Разбор считанного DataMatrix кода с пачки сигарет - какие символы за что отвечают. Декодирование МРЦ

Сразу оговорюсь, что данный код не претендует на краткость или оптимальность. Он лишь призван показать состав кода DATAMATRIX с пачки табачной продукции и, главным образом, алгоритм кодирования значения максимальной розничной цены (МРЦ) в этом самом коде.

Итак. При считывании 2D-сканером кода DATAMATRIX с пачки, мы получаем строку.

Пример с реальной упаковки: "046062030980264!2zVAAADD8JV/x", где:

1. первые 14 символов (цифры) "04606203098026" - содержат код товара (GTIN);

2. следующие 7 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "4!2zVAA" - индивидуальный серийный номер упаковки табачной продукции;

3. следующие 4 символа (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "ADD8" - максимальная розничная цена (МРЦ) в копейках закодированная по строке из 80 символов "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"%&'*+-./_,:;=<>?";

4. последние 4 символа (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "JV/x" - код проверки

Процедура РасшифроватьDataMatrixСПачкиСигарет()
	//Считываем содержание кода DataMatrix с пачки сигарет
	//Описание содержания кода:
	// - первая группа состоит из 14 цифр и содержит код товара;
	// - вторая группа состоит из 7 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) и содержит индивидуальный серийный номер упаковки табачной продукции;
	// - третья группа состоит из 4 символов (цифр,строчных и прописных букв латинского алфавита, а также специальных символов) и содержит в перекодированном виде максимальную розничную цену потребительской упаковки с точностью до одной копейки;
	// - четвертая группа состоит из 4 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) и содержит код проверки.	
	
	//В данном случае содержание кода указано явно, для примера
	СодержаниеКодаDATAMATRIX = "046062030980264!2zVAAADD8JV/x";
	//Выделяем код товара - первые 14 символов
	ИдентификаторGTIN = Лев(СодержаниеКодаDATAMATRIX,14);
	//Выделяем серийный номер упаковки - 7 символов после кода товара
	СерийныйНомер = Сред(СодержаниеКодаDATAMATRIX,15,7);
	//Выделяем МРЦ в зашифрованном виде - 4 символа после серийного номера упаковки
	МРЦИзШтрихКода = Сред(СодержаниеКодаDATAMATRIX,22,4);
	//Выделяем код проверки - последние 4 символа
	КодПроверки = Прав(СодержаниеКодаDATAMATRIX,4);
	//Получаем МРЦ в десятиричном виде (в копейках)
	ДесятичноеЧислоМРЦ = ПолучитьДесятичноеМРЦ(МРЦИзШтрихКода);
	//Если получили десятичное значение МРЦ в копейках, пересчитываем в рубли 
	Если ДесятичноеЧислоМРЦ <> Неопределено Тогда
		МРЦ = ДесятичноеЧислоМРЦ/100;
	КонецЕсли;
КонецПроцедуры

//Функция декодирования максимальной розничной цены с пачки (табачная продукция). Алгоритм кодирования.
Функция ПолучитьДесятичноеМРЦ(МРЦИзШтрихКода)
	//Строка кодирования МРЦ
	//ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"%&'*+-./_,:;=<>?
	//!!!ВАЖНО
	//!!!Если строка кодирования устанавливается не в коде,
	//!!!а в значении реквизита (константы, справочники и т.п.,
	//!!!то строку брать из комментария,
	//!!!т.к. в значении переменной СтрокаКодирования в коде функции присутствуют лишние кавычки
	СтрокаКодирования = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!""%&'*+-./_,:;=<>?";
	ДлинаСтрокиКодирования = СтрДлина(СтрокаКодирования);
	ДлинаЦеныИзШтрихКода = СтрДлина(МРЦИзШтрихКода);
	ДесятичноеЧисло = 0;
	Для Сч = 1 По ДлинаЦеныИзШтрихКода Цикл
		ТекМножитель = Pow(ДлинаСтрокиКодирования,ДлинаЦеныИзШтрихКода-Сч);
		ТекСимвол = Сред(МРЦИзШтрихКода,Сч,1);
		ПозицияСимволаВСтрокеКодирования = Найти(СтрокаКодирования,ТекСимвол);
		Если ПозицияСимволаВСтрокеКодирования = 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		ТекМножимое = ПозицияСимволаВСтрокеКодирования-1;
		ДесятичноеЧисло = ДесятичноеЧисло + ТекМножимое*ТекМножитель;
	КонецЦикла;
	Возврат ДесятичноеЧисло;
КонецФункции

 

DataMatrix Честный ЗНАК МРЦ кодировка программирование торговое оборудование

См. также

Защита ПО и шифрование Программист Платформа 1С v8.3 1С:Бухгалтерия 3.0 Абонемент ($m)

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

1 стартмани

09.02.2023    2724    11    aximo    5    

2

Защита ПО и шифрование Программист Абонемент ($m)

Для установки защиты pdf документа, полученного в 1С, написано консольное приложение на c#., использующее одну зависимость pdfSharp.dll. В результате работы приложения ограничены операции над документом и записаны метаданные. С помощью аргументов командной строки можно управлять работой приложения.

2 стартмани

30.01.2023    2142    2    olevlasam    3    

3

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Универсальный синтаксический анализатор ASN.1, который может декодировать любую допустимую структуру ASN.1 DER или BER, независимо от того, закодирована ли она в кодировке Base64 (распознаются необработанные base64, защита PEM и begin-base64) или в шестнадцатеричном кодировании.

1 стартмани

04.12.2022    3584    16    keyn5565`    0    

14

Защита ПО и шифрование Программист Платформа 1С v8.3 Абонемент ($m)

Демонстрация возможностей шифрования строки на основе мастер-пароля в 1С Предприятие 8.3.19. AES без zip файла, RSA, PKDF2. (c использованием библиотеки С# через com).

2 стартмани

31.08.2022    4470    9    vit59    2    

6

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка, позволяющая запутывать и шифровать байт-код, поставлять модули без исходных текстов и т.д. Работает только в файловом варианте с версии платформы 8.3.22.1368 из-за конструктора ГенераторСлучайныхЧисел, поскольку алгоритм был изменён.

10 стартмани

16.06.2022    12751    106    ZhokhovM    12    

45

Защита ПО и шифрование Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

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

2 стартмани

09.03.2022    6144    3    ge_ni    9    

2

Защита ПО и шифрование Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

27.12.2021    5105    2    idm80    12    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. CnupT 70 07.06.20 17:24 Сейчас в теме
Спасибо за статью, долгое время искал как выковырнуть МРЦ из DataMatrix, в итоге решил проблему найдя код в типовой рознице

Функция МРЦКодаМаркировкиТабачнойПачки(КодМаркировки) Экспорт
	
	ДлинаКода = СтрДлина(КодМаркировки);
	
	Если ДлинаКода <> 29 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	СтрокаМРЦ = Сред(КодМаркировки, 22, 4);
	
	Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789!""%&'*+-./_,:;=<>?";
	
	МРЦ    = 0;
	Индекс = 1;
	Пока Индекс <= 4 Цикл
		
		Символ = Сред(СтрокаМРЦ, Индекс, 1);
		ИндексСимвола = СтрНайти(Алфавит, Символ) - 1;
		Если ИндексСимвола < 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		
		МРЦ = МРЦ + Pow(80, 4 - Индекс) * ИндексСимвола;
		
		Индекс = Индекс + 1;
		
	КонецЦикла;
	
	// Если цена <= 5000 и нет копеек, то высокая вероятность, что это реальное МРЦ.
	Если МРЦ <= 500000
		И МРЦ%100 = 0 Тогда
		Возврат МРЦ / 100;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции
Показать
2. Tasselhof 21 07.06.20 21:08 Сейчас в теме
(1) Да, у нас конфигурация самописная, розницы под рукой не оказалось, пришлось самому изобретать.
В моем случае, функцию раскодирования сделал универсальной и строку кодирования передаю вторым параметром. Мало ли кому в голову придет еще "что-то" и "чем-то" кодировать в дальнейшем. Очень уж у нас все динамично =)
Функция мфРаскодироватьЧисло(ЗакодированнаяСтрока,СтрокаКодирования)
	Результат = 0;
	ДлинаСтрокиКодирования = СтрДлина(СтрокаКодирования);
	ДлинаЗакодированнойСтроки = СтрДлина(ЗакодированнаяСтрока);
	Для Сч = 1 По ДлинаЗакодированнойСтроки Цикл
		ТекМножитель = Pow(ДлинаСтрокиКодирования,ДлинаЗакодированнойСтроки-Сч);
		ТекСимвол = Сред(ЗакодированнаяСтрока,Сч,1);
		ПозицияСимволаВСтрокеКодирования = Найти(СтрокаКодирования,ТекСимвол);
		Если ПозицияСимволаВСтрокеКодирования = 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		ТекМножимое = ПозицияСимволаВСтрокеКодирования-1;
		Результат = Результат + ТекМножимое*ТекМножитель;
	КонецЦикла;
	Возврат Результат;
КонецФункции

Показать
3. mrsmrv 127 08.06.20 07:23 Сейчас в теме
Приятный бонус от современной платформы, что можно играться со сколь угодно большими числами. Раньше, лет 7 назад это не позволялось.
4. Renewal 17.06.20 10:03 Сейчас в теме
Почему-то МРЦ при раскодировании получается с копейками.
Например:
040129228509420000K?'AC0o2B9j - 169.74, на пачке -170,
00000046207821%aGl2c*ABgoNzGX - 68.94, на пачке вообще указана 90.
5. Tasselhof 21 18.06.20 20:36 Сейчас в теме
(4) Не везде МРЦ прописана. По части закона не скажу, почему кто-то вставляет МРЦ, а кто-то нет. Для того и сделана проверка в Рознице, если цена не заоблачная и делится без остатка - это МРЦ, иначе МРЦ не определено.
    Если МРЦ <= 500000
        И МРЦ%100 = 0 Тогда
        Возврат МРЦ / 100;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
6. Renewal 19.06.20 06:26 Сейчас в теме
(5) Это понятно. Тем не менее, в мобильном приложении "Честного знака" МРЦ определяется корректно.
9. Tasselhof 21 29.06.20 20:15 Сейчас в теме
(6) Проверил ваши коды - у меня МРЦ определяет правильно, где-то у вас ошибка в коде
10. Renewal 30.06.20 16:40 Сейчас в теме
(9) Оказалось, что ошибка не в коде, а что драйвер сканера передает марку заглавными буквами.
12. StiVitS 85 10.10.24 15:30 Сейчас в теме
(4) на вашем примере 040129228509420000K?'AC0o2B9j
Ниже написал комментарий, в обработке берутся последние 4 символа (2B9j), а должны браться предыдущие 4 (AC0o) будет 170
7. zurprog 29.06.20 13:26 Сейчас в теме
Ошибка в :
Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789!""%&'*+-./_,:;=<>?"

два знака "

Правильная строка : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567­89!"%&'*+-./_,:;=<>?
8. Tasselhof 21 29.06.20 20:08 Сейчас в теме
(7) Внимательнее читайте комментарий к коду, там это описано
11. StiVitS 85 10.10.24 15:26 Сейчас в теме
Расписал наверное верно:
1. первые 14 символов (цифры) "04606203098026" - содержат код товара (GTIN);

2. следующие 7 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "4!2zVAA" - индивидуальный серийный номер упаковки табачной продукции;

3. следующие 4 символа (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "ADD8" - максимальная розничная цена (МРЦ) в копейках закодированная по строке из 80 символов "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789!"%&'*+-./_,:;=<>?";

4. последние 4 символа (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "JV/x" - код проверки

Но в обработке если без криптохвоста берешь последние 4 символа, а это "код проверки" нужно брать предыдущие 4 символа
Оставьте свое сообщение