2016-09-08 6 views
1

Я недавно перешел на программирование смарт-карт.Как получить доступ к блокам памяти MIFARE 1k с помощью считывателя Gemalto Prox-SU?

Я использую считыватель Gemalto Prox-SU и имею несколько доступных карт MIFARE Classic 1k на машине Ubuntu 16.04. Я установил считыватель Gemalto Prox-SU и заставил читателя обнаружить карту через скрипт на python, используя Ludovic Russeau's pyscard.

Мне удалось написать сценарий, который отправляет APDU на подключение считывателя/карты. Я могу прочитать ATR, отправить команду GetData, чтобы прочитать серийный номер карты и пытались отправить несколько APDU на карту, чтобы попытаться прочитать блоки памяти карты. Однако, помимо команд LoadKey, все остальное возвращается «0x6982: состояние безопасности не удовлетворено»

Я знаю, что я должен отправить команду общей аутентификации перед каждым чтением и записью, как указано в руководстве, но даже с общей аутентификацией команда возвращает «статус безопасности не удовлетворен». Из того, что я читал, это должно быть очень просто. Что мне не хватает? Как настроить мой сценарий, чтобы проверка подлинности прошла успешно, и я могу читать данные из блоков памяти?

ответ

0

Типичный поток для чтения Mifare Classic 1K карты с читателем Prox-SU (см manual) является:

  1. Загрузить ключ аутентификации. Например, если ваша карта читается с помощью ключа A со значением по умолчанию («транспортный ключ») в FF FF FF FF FF FF, можно использовать следующую команду НАГРУЗКА KEY:

     
    FF 82 00 50 06 FFFFFFFFFFFF 
         ^^ ^^ ^^^^^^^^^^^^ 
         | |    \-- Key 
         | | 
         | \------------------ Key slot 80 (0x50) 
         | 
         \--------------------- Key in RAM (0x00) 
    

    Это хранит ключ FF FF FF FF FF FF в первый ключевой паз (0x50) в энергозависимой памяти (ОЗУ) считывателя.

  2. Аутентификация в секторе с использованием команды GENERAL AUTHENTICATE. Eventhough вы проверить подлинность всего сектора необходимо обратиться к сектору номер блока (как правило, первый блок сектора):

     
    FF 86 00 00 05 01 0004 60 50 
            ^^^^ ^^ ^^ 
            | | \-- Key slot 80 (0x50) 
            | | 
            | \----- Key type (0x60 = Key A, 0x61 = Key B) 
            | 
            \-------- Block number (block 4) 
    
  3. Наконец, вы можете прочитать блок с помощью бинарной команды READ:

     
    FF B0 0004 10 
         ^^^^ 
         \-------- Block number (block 4) 
    

Если вы получили код статуса 69 82 во ОБЩЕЙ AUTHENTICATE, это, скорее всего, указывает на то, что вы пытаетесь аутентификации с неправильным ключом.

+0

Вы сказали: «Если ваша карта читается с помощью клавиши A со значением по умолчанию (« транспортный ключ ») FF FF FF FF FF FF, вы должны использовать следующую команду LOAD KEY». Это сработало, и, насколько мой первоначальный вопрос был задуман, это решило проблемы. Однако, если возникла новая проблема. Как узнать, читается ли карта только с помощью ключа А? Возможно ли это позже? –

+0

@GugaFigueiredo В каждом секторе есть две клавиши (клавиша A и клавиша B). Блоки в каждом секторе могут быть сконфигурированы так, чтобы быть читаемыми и/или записываться с помощью любой клавиши A или клавиши B. Клавиши и биты, которые конфигурируют условия доступа, сохраняются в последнем блоке каждого сектора («трейлер сектора»). Трейлер сектора доступен так же, как и любой другой блок (за исключением того, что значение ключей замаскировано из данных, возвращаемых во время команды чтения). –