Я пытаюсь прочитать блоки из токена Mifare 1K с помощью смарт-карты python3 lib, но я не получаю данные. Я использую ACR122u-A9.

import smartcard
from smartcard.util import toHexString

COMMAND = [0xFF, 0xCA, 0x00, 0x00, 0x00]
READ_16_BINARY_BLOCKS = [0xFF,0xB0,0x00,0x04,0x10]

sprotocol = smartcard.scard.SCARD_PROTOCOL_T1

reader = smartcard.System.readers()

conn =  reader[0].createConnection()
conn.connect()
result, sw1, sw2 = conn.transmit(COMMAND,protocol = sprotocol)
if (sw1, sw2) == (0x90, 0x0):
    print("The operation completed successfully.")
    #AUTHENTICATE = [0xFF, 0x88, 0x00, BLOCK_NUMBER, 0x60, 0x00]
    AUTHENTICATE = [0xFF, 0x88, 0x00, 0x01, 0x60, 0x00] #Authenticate block 1
    response = conn.transmit(AUTHENTICATE)
    print(response)
    if response[1] == 144:
        print("Authenticated successfully")
        value, sw1,sw2 = conn.transmit(READ_16_BINARY_BLOCKS) #read block 1
        print(value,sw1,sw1)

Но вывод всегда:

output1: операция успешно завершена.

выход2: ([], 144, 0)

output3: Аутентифицирован успешно

выход4: [] 99 99

Последний вывод должен дать мне список шестнадцатеричных данных, но я ничего не получаю, даже пытался прочитать блок 0x00, тоже самое.

Обновление --- Я смог прочитать блок 4 ~ 7, который, как я считаю, является сектором 1, не может прочитать другие сектора.

0
Rafael Lino 5 Дек 2019 в 18:02
В первом предложении вашего вопроса должно быть указано, о какой карте / токене вы говорите.
 – 
guidot
6 Дек 2019 в 11:10
Что значит с какой картой? Я пытаюсь узнать, извините, если мой вопрос недостаточно ясен. Все, что я знаю, это MIFARE Classic 1K, оборудование - ACR122u-A9, а оборудование новое ...
 – 
Rafael Lino
6 Дек 2019 в 15:41
Предлагаю пересмотреть свой вопрос. Часть вывод всегда ... , кажется, больше не удерживается после вашего обновления. В вашем последнем операторе дважды печатается sw1 вместо sw1, sw2. Известно ли, что токен mifare все еще находится в заводском состоянии? В противном случае ключи могут больше не иметь значений по умолчанию, и вы просто получите сообщение об ошибке из-за неправильного ключа. Y Наша команда аутентификации, похоже, не соответствует команде из этого ответа.
 – 
guidot
6 Дек 2019 в 17:05
Спасибо за ответ, @guidot, я делал все неправильно, мне нужно сначала загрузить ключ, затем аутентифицировать сектор и, наконец, прочитать блоки секторов
 – 
Rafael Lino
6 Дек 2019 в 17:21

1 ответ

Я нашел способ чтения секторов / блоков, я не уверен, что это правильный путь, но он отлично работает с ключом A.

import smartcard
from smartcard.util import toHexString
import time

reader = smartcard.System.readers()
if not reader:
    print("No readers")
else:
    conn =  reader[0].createConnection()
    conn.connect()
    #[0xFF, 0x82, 0x00, 0x00, 0x06,KEY(6 bytes)]
    LOADKEY = [0xFF, 0x82, 0x00, 0x00, 0x06,255,255,255,255,255,255]
    response = conn.transmit(LOADKEY)
    if response[1] == 144:
        print("Key A loaded successfully")
        time.sleep(2)
        #auth block
        #[0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, BLOCK, KEY-TYPE, 0x00]
        COMMAND = [0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x60, 0x00]
        response = conn.transmit(COMMAND)
        print(response)
        time.sleep(2)
        #[0xFF, 0xB0, 0x00, BLOCK-NUMBER, 0x10]
        read = [0xFF, 0xB0, 0x00, 0x00, 0x10] #Read block 0
        data, sw1, sw2 = conn.transmit(read)
        print(toHexString(data))
    else:
        print("Wrong key A")
0
Rafael Lino 6 Дек 2019 в 22:14