Декодирование штрихкода ОМС
Структура штрих-код полиса ОМС состоит из 130 байт. Если вы отсканируете данный штрихкод без программ то увидите набор ASCII сервисов
Дело в том, что это так называемое бинарное сжатие, когда строку hex переводят в ASCII символы.
Первый байт – это тип штрих-кода. Типов штрих-кодов всего два: «01» и «02», про тип 01 я не вижу смысла говорить так как он уже не используется
С 2 по 9 байты закодирован ЕНП. Декодируем его просто переводя hex в dec
str(int(string[2:18], 16)).zfill(16)
ФИО
ФИО записано с 10 по 60 байт. Декодируется довольно просто:
- Переводим нашу строку в BIN и разбиваем на массив по 6 символов в каждом
- Затем нацело делим каждый элемент массива на 16 - это будет номер ряда в таблице символов, а потом этот же элемент делим по модулю 16 - это будет номер колонки
- Сопоставляем с таблицей и убираем разделитель "|" и пробелы
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 Кода, как только разберусь с ним обязательно дополню свою программу