March 1, 2023

Декодирование штрихкода ОМС

Структура штрих-код полиса ОМС состоит из 130 байт. Если вы отсканируете данный штрихкод без программ то увидите набор ASCII сервисов

Дело в том, что это так называемое бинарное сжатие, когда строку hex переводят в ASCII символы.

Первый байт – это тип штрих-кода. Типов штрих-кодов всего два: «01» и «02», про тип 01 я не вижу смысла говорить так как он уже не используется

Единый номер полиса

С 2 по 9 байты закодирован ЕНП. Декодируем его просто переводя hex в dec

str(int(string[2:18], 16)).zfill(16)

ФИО

ФИО записано с 10 по 60 байт. Декодируется довольно просто:

  1. Переводим нашу строку в BIN и разбиваем на массив по 6 символов в каждом
  2. Затем нацело делим каждый элемент массива на 16 - это будет номер ряда в таблице символов, а потом этот же элемент делим по модулю 16 - это будет номер колонки
  3. Сопоставляем с таблицей и убираем разделитель "|" и пробелы
snpChar = []
s = hextobin(snpBuffer)
s = [s[i:i+6] for i in range(0,len(s),6)]
for i in s:
	snpChar.append(self.charTable[int(int(i, 2)/16)][int(int(i, 2)%16)])
snpChar = "".join(snpChar).strip().split("|")
last = snpChar[0]
first = snpChar[1]
middle = snpChar[2]

Дата рождения и прочее

Пол хранится в 61 байте, если единица то пол мужской, а если 2 то женский.

Дата рождения и дата окончания действия полиса кодируется количеством дней от 01.01.1900 до даты рождения/окончания полиса. Даты записаны в двух символах, декодирование идет по тому же принципу, что и номер полиса (hex -> dec).

ЭЦП

Точной информации и описания данных на этот счет нет, но по моим догадкам в 65 байте лежит номер параметров ГОСТ 34.10-2012, а все остальное сам приватный ключ (raw), имея эти данные мы можем восстановить ASN1 структуру ключа.

'-----BEGIN PRIVATE KEY-----\n{}\n-----END PRIVATE KEY-----\n'.format(fill(standard_b64encode(bytes.fromhex("3068020100302106082A85030701010102301506092A85030701020102" + string[:2] + "06082A850307010102030440" + string[2:])).decode("ascii"), 64))

На этом у меня всё! Программа лежит на Github. Сейчас вроде как вышел цифровой полис ОМС в виде QR Кода, как только разберусь с ним обязательно дополню свою программу

Программа

Мой Telegram канал