pcsc-sharp Аутентификация Mifare

Я использую библиотеку pcsc-sharp для связи со считывателем ACR122U и чтения/ запись информации на карты MIFARE Classic 1k.

После знакомства с библиотекой и концепцией APDU я могу использовать UID карты в качестве идентификатора в своих приложениях. Теперь мне нужно установить свои собственные идентификаторы на карту. Поэтому я прочитал несколько руководств по MIFARE NXP (например, MF1S70YYX_V1), а также получил некоторую информацию о ИСО 7816-4.

Мне известно о необходимости аутентификации перед доступом к памяти карты для выполнения операций чтения/записи, и я знаю стандартное значение ключа.

Я скачал примеры pcsc-sharp с GitHub и запустил пример Mifare1kTest. I работает, но card.LoadKey в строке 36 не работает. Значения ответа команды Apdu в LoadKey: SW1=99 SW2=0, которые я не могу найти ни в одной документации. Комментирование раздела «создать новое исключение» заставляет пример работать.

Теперь мой вопрос заключается в том, какие значения являются правильными для передачи в Card.LoadKey, соответственно, какие значения являются правильными для использования для параметров в команде Apdu. Что подразумевается под «номером ключа» (номер сектора — комбинация секторов/блоков)? Нужен ли вызов LoadKey, если пример работает?


person Matthias Fuchs    schedule 05.01.2017    source источник
comment
Обычно все в диапазоне 9xxx означает успех, а xxx — дополнительная информация. Если я правильно помню, обертка APDU поместит ответ MiFare в слово состояния (но эй, я запрограммировал интерфейс за один день, несколько лет назад, мой разум уже не так молод). Вы пробовали, если загрузка ключа прошла успешно с помощью ключа?   -  person Maarten Bodewes    schedule 06.01.2017
comment
Ключ должен быть загружен в энергозависимую часть памяти считывателя. Пример передает 'KeyStructure,NonVolalatileMemory'. Выполнение так, как описано Mr Heart в ответе ниже примера, работает. Результаты для SW1/SW2 90 00. Большое спасибо.   -  person Matthias Fuchs    schedule 09.01.2017


Ответы (1)


Ваш вопрос широк, но это должно сработать для вас. Код поясняется комментариями

var loadKeySuccessful = card.LoadKey(
    KeyStructure.VolatileMemory,
    0x00, // first key slot
    new byte[] {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} // key
);
person Mr Heart    schedule 06.01.2017
comment
Спасибо за ответ. Ты прав. загрузка ключа в энергозависимую память решила проблему. Это также описано в Руководстве по программированию приложений ACR122U, но я как-то пропустил это. - person Matthias Fuchs; 09.01.2017
comment
@MatthiasFuchs, если это правильный ответ, отметьте его как правильный, чтобы помочь другим людям искать решения. - person Mr Heart; 11.01.2017