Изменение ключей Mifare 4K в конечном блоке возвращает ошибку «99» с использованием ACR1252 и pyscard

#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.

Я нашел следующие документы полезными: