Как проверить 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-код будет проверен, вы вряд ли добьетесь дальнейшего прогресса без подробной информации о персонализации карты, поэтому можете начать получать ее прямо сейчас.