APDU для получения UID от MIFARE DESFire?

Я новичок в APDU. Я прочитал техническое описание для DESFire. В соответствии с ним имеем:

CLA  = 0x90     
INS  = DESFire CMD Code                                            
P1   = 0x00        
P2   = 0x00
LC   = Length of wrapped Data    
data = DESFire command parameter(s) 
LE   = 0x00

Я хочу получить UID DESFire, но не могу создать для этого командный APDU. Может ли кто-нибудь привести меня в правильном направлении? Я создал этот APDU, но не уверен, что он правильный:

byte[8] cmd_apdu_getUID_part1= {0x90 , 0x93 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00};

И я не понимаю концепцию параметров типа LC и не нахожу INS для получения UID. Это 0x93 ox20 для части 1 UID и 0x95 0x20 для части 2 UID?


person soheyla ab    schedule 23.04.2015    source источник


Ответы (1)


Команды 9x 20 являются частью более низкого протокола ISO 14443-3 и используются во время антиколлизии и активации карты. С другой стороны, обмен APDU происходит на более высоком уровне протокола и только после активации карты. Следовательно, вы не можете использовать эти коды команд в APDU.

Как получить UID с карты DESFire (EV1) зависит от того, какой тип ID вы на самом деле хотите получить:

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

    FF CA 00 00 xx
    

    (где xx равно 00 или ожидаемой длине UID, для DESFire обычно 04 или 07).

  • (Только для DESFire EV1) Получить UID карты, если функция случайного UID карты не активирована: вам нужно будет использовать GetVersion command. Вам нужно будет использовать байт CLA 0x90 для указания обернутой собственной команды, установить INS на код команды 0x60, Lc и DATA не будут присутствовать:

    90 60 00 00 00
    

    Ответ будет выглядеть примерно так

    <7 response data bytes> 91 AF
    

    где код состояния 91 AF указывает, что можно получить больше данных с помощью кода команды, установленного на 0xAF. Поэтому вам нужно отправить еще одну команду:

    90 AF 00 00 00
    

    Ответ будет (опять же) выглядеть примерно так

    <7 response data bytes> 91 AF
    

    поэтому вам нужно отправить еще одну команду 0xAF. Тогда вы получите ответ вида:

    <14 response data bytes> 91 00
    

    где последние 7 байт данных ответа содержат UID. См. parseGetVersion() о том, как анализировать полученные данные.

  • (Только для DESFire EV1) Получить UID карты, если активирована функция случайного UID карты: это намного сложнее. Сначала вам нужно авторизоваться на карте. Только после этого вы можете использовать GetCardUID чтобы получить фактический UID карты. Эта команда будет выглядеть

    90 51 00 00 00
    

    Ответ будет выглядеть примерно так

    <UID (encrypted)> 91 00
    
person Michael Roland    schedule 24.04.2015
comment
Как я могу узнать, что функция random-UID не активирована или активирована? Эта функция для чего используется? И вы должны знать, что я не менял свои карты DESFire и работаю на недоделанной и родной карте без каких-либо изменений. Другой вопрос: Что означает фаза предотвращения столкновений? Можете ли вы объяснить больше об этом? - person soheyla ab; 24.04.2015
comment
А вы мне не подскажете, что такое ЛК и данные? что означают обернутые данные и параметры команды DESFire? - person soheyla ab; 24.04.2015
comment
Я понимаю значение предотвращения столкновений: интеллектуальный механизм предотвращения столкновений позволяет одновременно обрабатывать более одного MIFARE DESFire EV1 в полевых условиях. Алгоритм предотвращения столкновений выбирает каждый MIFARE DESFire EV1 по отдельности и гарантирует, что выполнение транзакции с выбранным MIFARE DESFire EV1 выполняется правильно без повреждения данных в результате других MIFARE DESFire EV1 в поле. ------------------------ Теперь я хочу знать, как я могу активировать функцию случайного UID? Также я не смог найти команду GetCardUID (видел таблицу DESFire). Что это такое? - person soheyla ab; 24.04.2015
comment
@soheylaab Почему вы не отметили этот исчерпывающий ответ как правильный ответ ?! Я думаю, вы всегда забываете проверять ответы! - person Ebrahim Ghasemi; 06.05.2015
comment
Дорогой Майкл, могу я попросить вас сообщить мне, почему нам нужно знать UID? Я имею в виду, в каких ситуациях полезно иметь UID? - person Ebrahim Ghasemi; 06.05.2015
comment
Авраам, я считаю, что UID необходим для аутентификации, точнее, для выполнения диверсификации ключей (на стороне считывателя) и, таким образом, для возможности выполнения аутентификации считыватель‹-›карта. - person Miguel Andres; 25.01.2016