Ключи с динамическим кодом: «Факториал» возвращается

Приветствую всех!
Несколько месяцев назад я уже выпускал пост про то, как работали магнитные ключи «Факториал». Сейчас же мы попробуем разобраться с более новой их разработкой.

y8yjlk5xyrwkw2ooq6v6tmyxpn0.jpeg

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

Суть такова


С самого начала внедрения индивидуальных ключей (более совершенных, нежели групповые оптические или магнитные) производители стали задумываться над тем, как бы ещё «защитить» эти метки. Причин для этого было несколько: во-первых, устройства были бы куда более устойчивыми к вскрытию, во-вторых, можно было предоставить возможность прописывать ключи исключительно обслуживающей компании (ведь это значит, что пользователь пойдёт делать копию ключа к ним, а не в лавочку в подземном переходе за куда меньшие деньги).

image

Вот, например, панель Метаком МК20-ТМ4Е. Помимо стандартных iButton, поддерживались также проприетарные токовые ключи Метаком ТМ2002. В своё время такая панель стояла на моём собственном подъезде, и я даже помню, что на тот момент, когда её поставили (точно уже неизвестно, ориентировочно — 2007–2009 год), сделать в моём городе дубликат ключа для неё было очень сложно, так как тогдашние лавочки по копированию умели делать только обычные DS1990A или магнитные для «Факториала», а мне не повезло обзавестись фирменными ТМ2002.

cctdqqe532nsnhrzksv-ybhiw58.jpeg

Цифрал тоже не остался в стороне и выкатил свои ключи DC2000. Хотя по протоколу они чем-то напоминают Метаком ТМ2002, они между собой несовместимы. На фото панель Cyfral CCD2094/TC, уже в двухтысячном году научившаяся «брать» такие ключи.

b3kcwrgyd4eht6phvsnhzxv8zko.jpeg

Но проприетарные ключи тоже научились копировать, поэтому некоторые производители перешли на Mifare с криптозащитой. Вариант этот хоть и не абсолютно идеален (многие такие системы работают на базе Mifare Classic, который вполне успешно вскрывается, также возможен захват ключей при обмене данных между ключом и считывателем), но очень надёжен. Технология эта (равно как и реализация её в устройствах контроля доступа) весьма интересная, и, возможно, я даже выкачу про это всё отдельный пост.

n8ieuf12en8ctbr5nsyu17vazyq.png

Но можно ли сделать ключ, который бы вообще нельзя было скопировать? Скажем, потому что в копировании этого самого ключа нет ни малейшего смысла? Именно что-то подобное и попытался сделать челябинский «Факториал».

Динамические ключи


Что, если сделать так, чтобы при каждом использовании ключа он бы перезаписывался? Например, при записи ключа в память задать для него некий вектор генерации, а затем при каждом прикладывании присваивать коду ключа значение некоторой функции. Такой ключ будет бесполезно клонировать: копия будет открывать, но уже после первого использования перестанет работать оригинал, так как будет создан новый код, который пропишется в использованный ключ, а экземпляр, лежащий в другом месте, останется не при делах, а точнее — с уже недействительным кодом. Таким образом, даже если наделать кучу ключей, рабочим в данный момент может быть только один, остальные же отвалятся после первого же открытия.
Нечто подобное применялось в автосигнализациях для защиты от кодграбберов статичного кода (правда, от более интеллектуальных устройств оно уже не спасало, но это совсем другая история…).

Что было после магнитных ключей?


Наигравшись с пластиковыми заготовками и датчиками Холла, Факториал выпустил модели с более новыми типами ключей.

4eacmrkd2njtnoss5oiafy6skgs.jpeg

Версия с ТМ-ключами почему-то не прижилась, даже в нашем городе встретить её весьма сложно, тогда как магнитные экземпляры всё так же успешно работают.

iwo05k-yretxspyirrs-pzbeucs.jpeg

А вот и предмет нашего обзора — панель с бесконтактным ключом.

kyi_vy7xiemcip5ostcatvwre8k.png

С появлением таких панелей начали выпускаться и контроллеры доступа с такими ключами. Отдельно стоящих считывателей магнитных ключей «Факториал» не выпускал, вместо них чаще всего ставились просто панели без коммутаторов. Увы, такой считыватель найти мне пока не удалось.

bgk393jr6n3sfdf4h0qviskklro.jpeg

Буквально год-другой назад появились и IP-домофоны. Такой панели у меня нет, так что подробно рассмотреть всё это не выйдет. Но ключи здесь используются точно такие же (проверялось прикладыванием заготовки).

nlytreetpjr3zym75yhy2pwshb4.jpeg

krwc-wdmiwjdv6z6mwshaflcyii.jpeg

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

Обзор оборудования


Появившиеся в начале десятых годов бесконтактные «Факториалы» вызвали серьёзное бурление в сообществе по ключам. Ещё бы — ключи крайне неохотно поддавались копированию. Дубликаты либо не открывали вообще, либо открывали, но выходило, что после пары открытий оригинал немедленно и бесповоротно дох. Совсем везучим удавалось запороть сразу оба ключа. Пытаясь остановить непреднамеренную порчу ключей, Факториал даже пробовал расклеить объявления с запретом открывать чем-либо кроме штатной метки.
Тогда кто-то даже хотел раздобыть такую панель на опыты, чтобы наконец разобраться, как же оно работает. Но детального описания никто так и не увидел. Поэтому самое время восполнить это упущение.

fkfjjh5sfgg0qfhtec8jbfv9ary.jpeg

А вот и наш экземпляр. Панель в каких-то разводах, которые мне не удалось оттереть даже растворителем. Снизу выходит жгут проводов, распиновка их идентична магнитному. В моём экземпляре часть их откушена почти под корень, но, понятное дело, это не проблема.

rum1j4htf6zuvdf_534tahhk5f8.jpeg

Обратная сторона. Электроника закрыта двумя металлическими крышками.

kpaask4kalxk7zhryi2x0cuwqhu.jpeg

Откручиваем их. Плата очень похожа на таковую у магнитного. Отличие в том, что на ней также присутствует микросхема EEPROM, в которой записаны ключи. Настройки же, как и в случае с магнитным, хранятся в памяти контроллера.

c7cswxioqimv4tm34ppsiykcfnw.jpeg

Снимем плату. Под ней находится блок кнопок. Судя по пайке, его меняли в кустарных условиях — заводская плата такой неаккуратной не выглядит. Выводы кнопок с обратной стороны не пропаяны.

2_83ad8zk6jswcwm74mpkkgvqru.jpeg

Сами кнопки. Судя по луже канифоли, кнопка вызова впоследствии тоже перепаивалась…

omzd-0xqdccwss9kcv2quzaejmg.jpeg

А вот и обратная сторона платы. Всё тот же контроллер ATMega16, всё те же индикаторы, всё то же самое, что мы видели внутри магнитного. Наибольший интерес сейчас представляет цепь RFID-считывателя. Основан он на некой микросхеме в корпусе QFN. После долгого рассматривания платы под разными углами и под разным освещением маркировку таки удалось прочитать — это чип TRF7961 от Texas Instruments. Что это такое — поговорим чуть позже.

pr0iaptmjlendv5xvhz3ovm7sks.jpeg

Считыватель в виде вклеенной в корпус платы. На ней расположены печатная катушка и резонансный конденсатор. Всё вместе это образует колебательный контур на 13,56 МГц, на частоте которого и работают используемые тут метки. От считывателя к плате идёт коаксиальный кабель, тонкий белый провод питает красный светодиод подсветки.

thufgx071kujgdvc6e9qvzgyxjq.jpeg

ghwxh6kkjxl5nzm-rhrkjrh_plo.jpeg

oah8dgmkpcgjppe8kbl_okrit7s.jpeg

n3smfrxgw91hrmam7j4a3pkz44k.jpeg

Штатный блок питания. Внутри трансформатор с двумя обмотками на пятнадцать вольт. На холостом ходу каждая из обмоток выдаёт по семнадцать вольт.

Ключи


Что обычно представляется при упоминании RFID на 13,56 МГц? Самым популярным стандартом на такой частоте является Mifare. Он же является частью ISO 14443, куда также входят метки NTAG и платёжные карты.

-vfnaakz-rnbvk-wfsrr7_awjq4.png

Здесь же используются метки Tag-It от Texas Instruments. Хотя они работают на той же частоте, они относятся к другому (к слову, не менее обширному) стандарту — ISO 15693. На скриншоте характеристики типичных таких меток. Так же, как и у Mifare, у этих меток есть неизменяемый UID и пользовательская память. Именно для работы с такими метками в домофоне и установлен чип от TI.

TI-256


Среди всего разнообразия Tag-It нас интересуют метки TI-256. Именно такие и используются в предмете нашего обзора.

i9vipfj08ftnfferyitvcsrctt8.png

Каждая такая метка имеет двести пятьдесят шесть бит пользовательской памяти, а также неизменяемый UID. Память поделена на восемь блоков по четыре байта, на каждый блок может быть установлен пароль. Tag-It имеет также ряд команд, свойственных именно меткам производства Texas Instruments, но конкретно данная модель их не поддерживает, поэтому в данной статье рассматриваться всё это не будет.

Ещё про ключи


qa9pjwsgmdb5oth20vdgn1iwjcg.png

hhnmc3qozndp4rudxuf5no-_zwq.png

Оригинальных ключей найти мне не удалось. Так что показываю их фотографии из интернета.

rspibw3spqiaftpec061s8gqimm.jpeg

На просторах удалось найти аналоги, использующие в себе те же самые метки Tag-It. По виду они ничем не отличаются от заготовок EM-Marine, но на самом деле это, конечно, не они. Также на фото видна оптическая заготовка.

Считыватель


Для полноценных экспериментов нужен считыватель, который в состоянии работать с метками типа ISO 15693. И всё не так просто, как может показаться: распространённые экземпляры обычно «берут» только Mifare. Со встраиваемыми всё аналогично: «народный» MFRC522, что идёт в комплекте практически с каждым набором для Arduino, а также несколько более продвинутый PN532 ISO 15693 тоже не видят.

cq4yfipiy0b8c6yn_ifwv2dq37s.jpeg

Но выход таки есть: PN5180. Экземпляр этот является не совсем дешёвым удовольствием, но прекрасно работает как с ISO 14443, так и с ISO 15693, что нам и надо.

t8bvmwevliwh5hd35oha4uxzgs4.png

А вот схема подключения к Arduino (со страницы библиотеки). Модуль для работы требует два напряжения питания (5 В для радиочастотных цепей и 3,3 В для цифровых), а также согласования уровней. Хотя существуют схемы с прямым подключением, делать так не рекомендую, так как есть риск того, что модуль сдохнет.
Проще всего будет использовать ESP32, STM32 или любой другой МК с уровнями 3,3 В.
Я подключил к ESP32, чтобы не использовать преобразование уровней. Программа получилась вот такая:

#include 
#include 

#define PN5180_NSS  12
#define PN5180_BUSY 13
#define PN5180_RST  14

PN5180ISO15693 nfc(PN5180_NSS, PN5180_BUSY, PN5180_RST);

void setup() {
  Serial.begin(115200);
  nfc.begin();
  Serial.println("PN5180 init");
  nfc.reset();
  Serial.println("PN5180 reset");
  nfc.setupRF();
  Serial.println("RF is turned on!");
}

void loop() {

  uint8_t uid[8];
  Serial.print("\r\nPut the card\r\n");
  ISO15693ErrorCode rc = nfc.getInventory(uid);
  while (rc != ISO15693_EC_OK) rc = nfc.getInventory(uid);
  uint8_t readBuffer[4];
  Serial.print("UID: ");
  for(int i = 0; i < 8; i++) {
    if (uid[i] < 16) Serial.print("0");
    Serial.print(uid[i], HEX); 
    Serial.print(' ');
  }
  Serial.print('\n');
  for (int no = 0; no < 8; no++) {
    rc = nfc.readSingleBlock(uid, no, readBuffer, 4);
    if (ISO15693_EC_OK != rc) {
      Serial.print(F("Error in readSingleBlock #"));
      Serial.print(no);
      Serial.print(": ");
      Serial.println(nfc.strerror(rc));
      return;
    }
    Serial.print(F("Read block #"));
    Serial.print(no);
    Serial.print(": ");
    for (int i = 0; i < 4; i++) {
      if (readBuffer[i] < 16) Serial.print("0");
      Serial.print(readBuffer[i], HEX);
      Serial.print(" ");
    }
    Serial.print(" ");
    for (int i = 0; i < 4; i++) {
      if (isprint(readBuffer[i])) {
        Serial.print((char)readBuffer[i]);
      }
      else Serial.print(".");
    }
    Serial.println();
  }
  Serial.print("\r\nRevove card\r\n");
  while (rc == ISO15693_EC_OK) rc = nfc.getInventory(uid);
}

Записываем ключ


Ну что же, всё необходимое у нас есть, а это значит, что можно начинать эксперименты. Итак, чтобы прописать ключ в панели, необходимо сделать примерно следующее:

  1. Нажатием кнопки с обратной стороны или удержанием любой цифры и последующим вводом пароля войти в сервисное меню.
  2. Выбрать режим записи ключей, нажав »8» и «Вызов».
  3. Выбрать номер квартиры, на которую будет прописан ключ.
  4. Выбрать номер ячейки (от 1 до 9).
  5. Приложить ключ.
  6. Нажать «Вызов» для возврата к выбору квартиры или «Сброс» для выхода.


Вживую это выглядит примерно так.

Память


Теперь разберёмся с тем, как хранятся ключи в памяти.
После записи ключа в конец EEPROM домофона добавились следующие данные:

87 60 72 A6 91 0C


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

UID: 87 60 72 A6 41 C1 07 E0 
Read block #0: FF FF FF A6  ....
Read block #1: A3 1F 14 A6  ....
Read block #2: 00 00 00 A6  ....
Read block #3: 00 00 00 A6  ....
Read block #4: 00 00 00 A6  ....
Read block #5: 00 00 00 A6  ....
Read block #6: D0 D1 1F A6  ....
Read block #7: 11 68 91 A6  .h..


Как можно видеть, первые четыре байта записи о ключе в EEPROM — старшие четыре байта UID, оставшиеся два отведены под тот самый счётчик.
Теперь проведём серию прикладываний, после каждого раза будем считывать память и ключ.

Попытка №1
Память: 87 60 72 A6 B2 0C

Ключ: 
UID: 87 60 72 A6 41 C1 07 E0 
Read block #0: FF FF FF A6  ....
Read block #1: A3 1F 14 A6  ....
Read block #2: 00 00 00 A6  ....
Read block #3: 00 00 00 A6  ....
Read block #4: 00 00 00 A6  ....
Read block #5: 00 00 00 A6  ....
Read block #6: D0 D1 1F A6  ....
Read block #7: 4F 4D FF A6  OM..

Попытка №2
Память: 87 60 72 A6 F6 0C

Ключ:
UID: 87 60 72 A6 41 C1 07 E0 
Read block #0: FF FF FF A6  ....
Read block #1: A3 1F 14 A6  ....
Read block #2: 00 00 00 A6  ....
Read block #3: 00 00 00 A6  ....
Read block #4: 00 00 00 A6  ....
Read block #5: 00 00 00 A6  ....
Read block #6: D0 D1 1F A6  ....
Read block #7: 11 6B BD A6  .k..

Попытка №3
Память: 87 60 72 A6 F4 0C

Ключ:
UID: 87 60 72 A6 41 C1 07 E0 
Read block #0: FF FF FF A6  ....
Read block #1: A3 1F 14 A6  ....
Read block #2: 00 00 00 A6  ....
Read block #3: 00 00 00 A6  ....
Read block #4: 00 00 00 A6  ....
Read block #5: 00 00 00 A6  ....
Read block #6: D0 D1 1F A6  ....
Read block #7: CB 93 EA A6  ....

Попытка №4
Память: 87 60 72 A6 F7 0C

Ключ:
UID: 87 60 72 A6 41 C1 07 E0 
Read block #0: FF FF FF A6  ....
Read block #1: A3 1F 14 A6  ....
Read block #2: 00 00 00 A6  ....
Read block #3: 00 00 00 A6  ....
Read block #4: 00 00 00 A6  ....
Read block #5: 00 00 00 A6  ....
Read block #6: D0 D1 1F A6  ....
Read block #7: 95 57 B6 A6  .W..

Попытка №5
Память: 87 60 72 A6 EF 0C

Ключ:
UID: 87 60 72 A6 41 C1 07 E0 
Read block #0: FF FF FF A6  ....
Read block #1: A3 1F 14 A6  ....
Read block #2: 00 00 00 A6  ....
Read block #3: 00 00 00 A6  ....
Read block #4: 00 00 00 A6  ....
Read block #5: 00 00 00 A6  ....
Read block #6: D0 D1 1F A6  ....
Read block #7: 13 3D DB A6  .=..


Как видно, каждый раз меняется предпоследний байт записи о ключе в EEPROM (причём последний всегда равен 0Ch). В ключе же перезаписывается седьмой блок, содержимое нулевого, первого и шестого остаётся неизменным. При этом заметно, что эти значения — не являются просто счётчиком, а формируются по некоторому алгоритму, причём данные в ключе и в памяти не совпадают.

Как быстро сдохнет оригинал?


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

Я проводил несколько опытов: с копией и оригиналом, а также с одним ключом и перезаписью памяти, где я зашивал данные, приведённые тут ранее, и пробовал прикладывать ключ. Во всех случаях домофон удалось открыть при данных, отстающих от актуальных на одно прикладывание (причём перезаписываются блоки уже другими значениями, нежели могли бы получиться). Получается, что домофон основывается не только на память, но и на данные ключа. Увы, алгоритм генерации и проверки этих значений мне неизвестен, так что о том, как это реализовано, можно только догадываться.

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

Так можно ли всё-таки копировать эти ключи?


На самом деле — да. Но только при одном условии: оригинал после копирования использоваться не будет.

rngu-s1icsv79lulnr5axcoiq50.png

Первые бесконтактные ключи «Факториала» имели крайне неудачную конструкцию из хрупкого пластика, отчего часто трескались и рассыпались. Если перезаписать такой ключ на другую заготовку, то он вполне будет открывать, просто сломанный оригинал работать уже не будет.
Если же попробовать заблокировать страницы памяти для перезаписи, то после первого открывания ключ сдохнет, не получив актуальных данных.

Ресурс памяти


Многие заинтересуются:, а не износится ли EEPROM от постоянных открываний? Производитель заявляет около ста тысяч циклов перезаписи (что для метки, что для EEPROM), то есть если прикладывать ключ десять раз в день, то памяти хватит на двадцать семь лет, что вполне приемлемо.

Вот как-то так


Как можно заметить, ключи «Факториала» весьма хорошо защищены. Даже если бы алгоритм был известен, сделать дубликат ключа всё равно оставалось бы невозможным. Помимо простой перезаписи блоков существуют системы на базе Mifare с динамическим ключом шифрования, так что можно с уверенностью сказать, что технология эта оказалась вполне удачной. Более того, на бесконтактный «Факториал» нельзя записать и универсальный ключ (у меня нет сведений о том, есть ли тут бэкдоры в виде жёстко прописанных кодов), так как по сути метка привязывается к панели и при попытке записать её на другой домофон она начнёт открывать его, тогда как предыдущий видеть её перестанет. Можно с уверенностью сказать, что на момент своего появления «Факториал» был едва ли не самым защищённым среди всех подобных устройств.
Такие дела.

Ссылки


Другие мои посты про ключи, домофоны, считыватели и прочие подобные устройства


mxuanbovcusqgmqdgugvpnql8vq.jpeg

© Habrahabr.ru