Как проверить PIN-код смарт-карты с помощью Python?

Мне нужна ваша помощь, чтобы проверить PIN-код смарт-карты. я использую Python а также pyscard, Я понял, что я должен использовать APDU команда и что я должен отправить его с помощью ScardTransmit() но я не могу найти, какой APDU использовать. Например:

SCardTransmit(hcard,dwActiveProtocol, 
              [0x00, 0x20, 0x00, 0x01, 0x06, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x00])

(т. е. с PIN=123456) вернет просто 6A 88 - Ссылочные данные не найдены

Мне было интересно: есть ли способ получить некоторые подсказки о командах для использования с конкретной смарт-картой, глядя на ее ATR? то есть: команда "20" в поле INS (APDU состоит из CLA, INS P1, P2, DATA) - это то, что ISO определяет для проверки PIN, но как понять, если я делаю что-то не так?

Благодарю.

PS: кстати, при P2="00" получаю 6A 83, запись не найдена.

3 ответа

Это может помочь... когда речь идет о картах GSM, мы всегда используем длину данных 8 байтов, т.е. VERIFY_CHV = [0xA0, 0x20, 0x00, 0x01, 0x08]

Следующие данные PIN-кода дополняются 0xFF в зависимости от фактической длины PIN-кода. т.е. если pin = 123456, тогда LJUST_PIN_HEX = [0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0xFF, 0xFF ]

APDU тогда будет VERIFY_CHV + LJUST_PIN_HEX

Ваш APDU будет правильным, если в приложении смарт-карты (DF, который вы выбрали заранее) был PIN-код с идентификатором 1 (который вы указали в P2). Вы можете установить наиболее значимый бит, чтобы указать команде выполнить поиск PIN 1 в MF.

Какие ПИН-коды существуют (а может и вовсе отсутствовать), и в случае карты, имеющей файловую систему, в которой они живут с DF, определяется персонализацией карты. Без дополнительных подробностей ответы должны быть очень общими, например, попробуйте разные значения P2 (до 0x1F).

С другой стороны, как только PIN-код будет проверен, вы вряд ли добьетесь дальнейшего прогресса без подробной информации о персонализации карты, поэтому можете начать получать ее прямо сейчас.

Другие вопросы по тегам