Как отправить APDU на карту Mifare Classic 1k?
То, чего я пытаюсь добиться, это отправить команду APDU на карту MIFARE Classic 1K, чтобы изменить ее клавиши A и B.
Мне удалось установить соединение с картой и использовать ключ по умолчанию (FFFFFFFFFFFF
), чтобы прочитать блок 0 и блок 1. Я использовал приложение HID MifareSamples для него.
Теперь я хотел бы изменить ключ A по умолчанию на что-то другое. Я нашел решение здесь, в stackru ( MIFare Change KEY A и B), которое предполагает, что я должен отправить этот APDU:
Новый ключ A = 00 11 22 33 44 55 Биты доступа не перезаписаны. Ключ B не используется (поэтому FF FF FF FF FF FF)
=> Написать в сектор трейлера 00 11 22 33 44 55 FF 0F 00 FF FF FF FF FF FF FF FF
Я нашел хороший инструмент JSmartCard Explorer, который позволяет отправлять APDU на карты. Затем я прочитал спецификацию PCSC 3.2.2.1.4 Глава "Команда загрузки ключей" и понял, что команда должна выглядеть примерно так:
FF 82 00 00 18 00 11 22 33 44 55 FF 0F 00 FF FF FF FF FF FF FF
Но, к сожалению, инструмент JSmartCard не работает с "Команда не разрешена (без текущей EF)".
Что я делаю не так? Как я могу изменить ключ?
1 ответ
Прежде всего, карты MIFARE Classic не используют команды APDU. Следовательно, вы отправляете APDU не на карту, а на устройство чтения карт (которое переводит их в команды MIFARE Classic). Команды APDU, обрабатываемые читателем, обычно начинаются с байта класса FF
,
В картах MIFARE Classic ключи (A и B) и условия доступа для каждого сектора хранятся в трейлере секторов (последний блок каждого сектора). Карта MIFARE Classic 1K имеет 16 секторов по 4 блока в каждом.
Поэтому, если вы хотите установить ключи и условия доступа для сектора 0, вам необходимо записать их в блок 3 (последний блок сектора 0). Стандарт PC/SC определяет команду записи (UPDATE BINARY) для карт памяти как:
FF D6 XXYY 10 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
куда XXYY
адрес блока и ZZ...
это данные, которые будут записаны в блок.
Формат сектора трейлера (см. Этот ответ для более подробной информации):
<key A> | access bits | general purpose byte | <key B>
Итак, чтобы установить
- ключ A =
00 11 22 33 44 55
- ключ B =
66 77 88 99 AA BB
- биты доступа =
787788
(трейлер сектора доступен для записи только с помощью ключа B; биты доступа /GPB могут быть прочитаны с помощью ключа A или B; блоки данных могут быть записаны с использованием только ключа B; блоки данных могут быть прочитаны с помощью ключа A или B) - GPB установлен в
69
для сектора 0 вы должны использовать следующую команду записи:
FF D6 0003 10 001122334455 787788 69 66778899AABB
Обратите внимание, что вы не можете частично обновить секторный трейлер, вы всегда должны создавать и писать весь секторный трейлер.