#python #key #mifare #pyscard #acr1252
Вопрос:
Мы получаем карты Mifare 4k от поставщика, который предварительно кодирует каждый трейлер сектора следующим образом:
FFFFFFFFFFFFFF078069FFFFFFFFFFFF
При этом поставщик устанавливает бит доступа FF0780
, а ключ чтения (Ключ A) и ключ записи (ключ B) остаются заводскими по умолчанию FFFFFFFFFFFF
При попытке записать новый ключ чтения(ключ A) и ключ записи (ключ B) и бит доступа с помощью pyscard и кодера ACR1252 я получаю код ответа «99», который является недокументированным кодом ошибки. Я предполагаю, что это происходит потому, что бит доступа был изменен, так как пустые карты непосредственно с завода не генерируют эту ошибку.
В этом примере мы обновляем блок прицепа таким образом, чтобы клавиши A и B были FFFFFFFFFFFF
одинаковыми, а бит доступа — 787788
:
write_data = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x77, 0x88, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
write_key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# load write key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x82, 0x00, 0x01, 0x06, *write_key])
# authenticate write key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, block, 0x61, 0x01])
# write data
_, response_code, _ = cardservice.connection.transmit([0xFF, 0xD6, 0x00, block, 0x10, *write_data])
Есть идеи, почему код ответа 99 возвращается для карты, на которой поставщик установил бит доступа?
Примечание: аутентификация работает нормально, просто не удается выполнить шаг записи.
Ответ №1:
Оказывается, бит доступа, впоследствии установленный поставщиком ff0780
, означает, что вам необходимо аутентифицировать ключ read_key (ключ A) для записи в блок трейлера. Очень нелогично, но работает для карты Mifare 4K, где бит доступа ранее был установлен на ff0780
:
write_data = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x77, 0x88, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
read_key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# load read key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x82, 0x00, 0x00, 0x06, *read_key])
# authenticate read key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, block, 0x60, 0x00])
# write data
_, response_code, _ = cardservice.connection.transmit([0xFF, 0xD6, 0x00, block, 0x10, *write_data])
Я также обнаружил, что вам необходимо подтвердить подлинность ключа непосредственно перед написанием. Проверка подлинности обоих ключей, чтение, а затем запись вернули один и тот же 99
код ответа. Кроме того, похоже, что код ошибки 99
каскадируется из микросхемы Mifare, в отличие от считывателя карт, поэтому код ошибки 99
не отображается в документации ACR1252.
Я нашел следующие документы полезными:
- Интерфейс прикладного программирования ACR1252 https://www.acs.com.hk/en/products/342/acr1252u-usb-nfc-reader-iii-nfc-forum-certified-reader/
- Примечания к приложению Mifare 4K https://www.nxp.com/products/rfid-nfc/mifare-hf/mifare-classic/mifare-classic-ev1-1k-4k:MF1S50YYX_V1?tab=Documentation_Tab