Оглавление:

Использование Mifare Ultralight C с RC522 на Arduino: 3 шага
Использование Mifare Ultralight C с RC522 на Arduino: 3 шага

Видео: Использование Mifare Ultralight C с RC522 на Arduino: 3 шага

Видео: Использование Mifare Ultralight C с RC522 на Arduino: 3 шага
Видео: СКУДные карты 2024, Июль
Anonim
Использование Mifare Ultralight C с RC522 на Arduino
Использование Mifare Ultralight C с RC522 на Arduino

Использование технологии RFID для идентификации держателей карт или для получения разрешения на какие-либо действия (открытие дверей и т. Д.) - довольно распространенный подход. В случае самостоятельного применения модуль RC522 широко используется, так как он довольно дешев, и для этого модуля существует много кода.

В большинстве случаев UID карты используется для «идентификации» держателя карты, а карты Mifare Classic используются, поскольку они дешевы и часто включаются при покупке модуля RC522.

Но, как вы, возможно, знаете, система Mifare Classic взламывалась в течение нескольких лет и больше не считается безопасной. Система шифрования Crypto1, используемая классическими картами, может быть преодолена, и это перезаписываемые карты, где данные UID могут быть перепрограммированы (волшебные карты).

Поэтому для любого приложения, имеющего отношение к безопасности, использование карт Mifare Classic не рекомендуется! То же самое относится к (большинству) систем NTAG и Mifare Ultralight.

Таким образом, выбор - либо использовать профессиональную систему, либо попытаться использовать более безопасную систему RFID. Доступные системы: Mifare Ultralight C, Mifare DESFire и Mifare Plus. Поскольку существует множество профессиональных систем, использующих эти более безопасные системы, для сообщества DIY практически не существует решений (есть одно решение DESFire на базе Teensy, которое основано на более дорогой коммутационной плате PN523). Кроме того, карты DESFire довольно дороги. Итак, задача заключалась в том, чтобы найти лучшее и более дешевое решение.

Представленное решение обеспечивает полный доступ к дешевым картам Mifare Ultralight «C» с использованием дешевого китайского DIY-модуля RC522. На основе этого кода безопасный Mifare Ultralight C можно использовать в домашних условиях.

Шаг 1: предварительные условия

Предварительные условия
Предварительные условия

Несмотря на то, что RC522 хорошо спроектирован, в большинстве случаев он плохо собран, поскольку некоторые компоненты имеют плохие размеры. Это приводит к плохой репутации модуля из-за того, что он имеет низкую чувствительность и не все типы карт будут идентифицированы. В частности, Mifare Ultralight C не будет идентифицирован, и на нем невозможно будет прочитать карты.

Основная проблема - это спецификация катушек индуктивности L1 и L2. Как описано на https://ham.marsik.org/2017/04/using-cheap-rc522-nfc-reader-to-read.html. Просто заменив эти катушки индуктивности на соответствующие, например. FERROCORE CW1008-2200 внезапно RC522 показывает, каков его реальный потенциал.

Поэтому перед тем, как попробовать данный код, вы ДОЛЖНЫ ЗАМЕНИТЬ катушки индуктивности. Он просто не будет работать с предустановленными индукторами!

Фоном всего этого является то, что карты Ultralight C довольно энергоемки. Эта энергия обеспечивается радиочастотным полем RC522. Из-за низкой силы тока катушек индуктивности энергетическое поле недостаточно мощное для питания Ultralight C. Другим картам, таким как Mifare Classic, просто требуется меньше энергии, и поэтому они работают довольно стабильно.

Шаг 2: как это работает?

Как это работает?
Как это работает?
Как это работает?
Как это работает?
Как это работает?
Как это работает?
Как это работает?
Как это работает?

Итак, после модификации модуля RC522, как вы можете использовать Mifare Ulralight C в своем приложении?

Хитрость в том, что Mifare Ultralight C поддерживает аутентификацию по паролю на основе шифра 3DES. Используя этот пароль, содержимое карты можно сделать «только для чтения» или полностью невидимым для неавторизованного пользователя.

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

Осторожно: без аутентификации на основе пароля вы все равно не можете доверять карте Mifare Ultralight C, поскольку существуют также «волшебные карты», имитирующие Ultralight C.

Каждая карта, не зависящая от технологии (если используется правильная частота), ответит своим UID при питании от RF-поля и запросит идентификацию. Кроме того, они предоставляют значение SAK, предоставляя минимальную информацию о типе имеющейся карты. К сожалению, все Mifare Ultralight и NTAG идентифицируются как тип syme (SAK = 0x00), включая Mifare Ultralight C. Таким образом, при опросе карт, по крайней мере, значение SAK 0x00 будет указывать на то, что на считывателе может быть Ultralight C..

Чтобы убедиться, что это Ultralight C, на карту можно отправить запрос на зашифрованную аутентификацию. Если это НЕ карта Ultralight C, этот запрос не будет понят, и ответом будет NAK (not-acknolege).

Если это карта Ulralight C, вы получите 8-байтовый ответ. Эти 8 байтов представляют собой случайное число «B» (RndB), зашифрованное ключом, хранящимся на карте, с использованием шифра 3DES.

Этот зашифрованный RndB должен быть расшифрован с использованием того же ключа в программе. Затем это случайное число слегка модифицируется (вращается на один байт → байт 1 перемещается в байт 8, а все остальные байты сдвигаются на один байт ниже, затем называются RndB’). Затем программа генерирует 8-байтовое случайное число «A» (RndA) и присоединяет это RndA к измененному RndB’. Это снова зашифровывается с помощью ключа и отправляется на карту.

Карта расшифровывает сообщение и проверяет, подходит ли RndB’к ранее сгенерированному RndB на карте. Если они совпадают, карта теперь знает, что программа знает ключ.

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

Затем программа расшифрует ответ карты и проверит, совпадают ли исходный RndA и ответный RndA. ТОЛЬКО ТОГДА оба объекта (программа и карта) знают, что они разделяют знания одного и того же ключа.

Этот процесс используется только для аутентификации. Все дальнейшее общение всегда осуществляется «открытым текстом».

Хотя существуют карты «magic Ultralight C», где можно изменить UID, сам ключ не может быть получен с карты, а шифр 3DES довольно безопасен. Ключ - это 16-байтовый ключ, поэтому метод грубой силы для получения ключа займет некоторое время.

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

При использовании карты Ultralight C

Карта Ultralight C имеет несколько встроенных функций безопасности:

  1. Память одноразового программирования (OTP). В эту область можно записывать биты, шина не удаляется.
  2. 16-битный односторонний счетчик. Этот счетчик может только увеличиваться при обращении.
  3. Защита от «записи» или «чтения / записи» страниц в памяти. Эти страницы можно читать или изменять только в случае аутентификации с помощью ключа.
  4. Замораживание / блокировка отдельных страниц для защиты от любых изменений.

Ни использование OTP, ни 16-битный счетчик, ни использование бита блокировки не реализованы в данном коде, но могут быть легко реализованы на основе информации, приведенной в https://www.nxp.com/docs/en/data- лист / MF0ICU2.pd…

Поскольку защита с помощью ключа имеет важное значение для использования Mifare Ultralight C, все соответствующие функции присутствуют.

Все команды используются в последовательном мониторе с «только новой строкой» и со скоростью 115200 бод.

  • «Auth 49454D4B41455242214E4143554F5946» запросит аутентификацию с использованием данного ключа (в данном случае стандартного ключа Mifare Ultralight C).
  • «Dump» сбрасывает содержимое карты, насколько они видны. В случае, если страницы защищены ключом, эти страницы могут быть не видны до предыдущей аутентификации с помощью ключа. В первых двух столбцах указывается, заблокированы ли страницы или ограничен доступ.
  • «NewKey 49454D4B41455242214E4143554F5946» запишет новый ключ на карту. Ключ записан на страницы с 44 по 47. Это будет работать, только если эти страницы не заблокированы и не защищены без предварительной аутентификации.
  • «wchar 10 hello world» напишет «hello world», начиная со страницы 10. Опять же, это только работы страниц не заблокированы и не защищены без предыдущей аутентификации. При попытке написать выше страницы 39 или ниже страницы 4 это вызовет ошибка или данные игнорируются, поскольку эти страницы не являются пользовательской памятью.
  • «Whex 045ACBF44688» будет записывать шестнадцатеричные значения прямо в память, при этом применяются предыдущие условия.
  • «Защитить 30» защищает все страницы, начиная со страницы 30 и выше. В зависимости от разрешения эти страницы могут быть изменены или прочитаны только после предварительной аутентификации с помощью ключа. Использование «защиты» со значениями выше 47 сделает все страницы «незащищенными», ВКЛЮЧАЯ КЛЮЧ на страницах 44-47 (которые можно только изменить, но нельзя прочитать). Чтобы предотвратить изменение ключа, защита должна начинаться как минимум со страницы 44.
  • «Setpbit 0» устанавливает бит защиты и решает, будут ли защищенные страницы доступны только для чтения («setpbit 1») или не могут быть ни прочитаны, ни записаны («setpbit 0») без предварительной аутентификации с помощью ключа.

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

Шаг 3: Важно

  1. Программа различает типы Ultralight, читая страницы 43 и 44. Если страница 43 читается, а страница 44 нет, это, скорее всего, Ultralight C. НО, если вы защищаете страницу 43 от чтения / записи, карта больше не распознается как Ultralight C (ни на что не влияет) Надлежащая идентификация Ultralight должна выполняться с помощью аутентификации с помощью ключа (я не реализовал это из соображений стабильности).
  2. Перед использованием команд «setpbit» и «protect» необходимо использовать команду «dump», иначе статус защиты страниц не будет известен.
  3. Если вы защищаете первые страницы своей карты от «чтения / записи», она больше не будет работать с этой программой, так как первая страница постоянно читается, чтобы увидеть, есть ли еще карта. Поскольку первые две страницы все равно доступны только для чтения (там хранится UID), защищать их нет смысла.

Проблемы со стабильностью

Этот код использует «стандартную» библиотеку RC522 для Arduino и библиотеку 3DES с https://github.com/Octoate/ArduinoDES. В то время как библиотека RC522 используется довольно часто, библиотека 3DES не так широко распространена и ее необходимо устанавливать вручную.

Код был протестирован на Arduino Uno. Но во время написания я столкнулся с множеством странных проблем со стабильностью. Почему-то либо мои навыки программирования не очень хороши, одна из используемых библиотек нестабильна, либо смешивание библиотек - не лучшая идея.

Помните об этом при использовании кода !!!

Его изменение или использование только его частей может привести к странному поведению, например к сбою, распечатке странных вещей или получению тайм-аутов или NAK при чтении с карты. Это может произойти в любом месте кода (это стоило мне многих часов отладки). Если вы найдете причину (ы) для этого, пожалуйста, дайте мне подсказку.

Рекомендуемые: