每个班级的 APDU 6E00 状态



我是APDU和智能卡通信的新手,我不知道如何成功发送APDU命令。例如,当我尝试此命令时:

00 A4 00 00 02 3F 00 00

我得到了6E 00的回应。我试图弄清楚我必须为我的卡使用哪个类,但是对于我在00-FF范围内尝试的每个类,我总是收到"不支持类"错误。

我想这可能与卡中的某些身份验证有关,但我不知道如何做到这一点。

我使用了以下Python(pyscard)代码:

from smartcard.System import readers
from smartcard.util import toHexString
r = readers()
con = r[0].createConnection()
con.connect()
for c in range(0x00, 0xFF):
    comm = [c, 0xA4, 0x00, 0x00, 0x02, 0x3F00, 0x00]
    data, sw1, sw2 = con.transmit(comm)
    if sw1 != 0x6e:
        print comm
        print 'Response:'
        print data, 'n'
        print 'Status:'
        print '%x %x' % (sw1, sw2)

编辑:卡的 ATR 3B 04 49 32 43 2E

解决了这个问题

,我的卡是 I2C 卡,所以 APDU 命令无法使用它。我通过C++与Omnisoft的同步API一起工作。不是我真正想到的,但到目前为止,这似乎是唯一的选择。

感谢所有帮助过我的人!

不是专家,但查看 pyscard 文档,我认为您使用的是错误的字节。在给定的示例(您的代码似乎基于该示例)中,它说

SELECT = [0xA0, 0xA4, 0x00, 0x00, 0x02]
DF_TELECOM = [0x7F, 0x10]
data, sw1, sw2 = connection.transmit( SELECT + DF_TELECOM )

它看起来像A0 A4 00 00 02是命令(不应修改),7F 10标识要与之通信的卡的类型(根据您拥有的卡类型,几乎可以肯定是不同的)。

请尝试:

from itertools import product
for x,y in product(range(256), repeat=2):
    data, sw1, sw2 = con.transmit([0xA0, 0xA4, 0x00, 0x00, 0x02, x, y])
    if sw1 != 0x6e:
        print("Your card responds to {:02X} {:02X}".format(x, y))
        print("Response: {}".format(data))
        print("Status: {:02X} {:02X}".format(sw1, sw2))

我还找到了一个命令摘要表;希望你觉得它有用。

既然您正在尝试发送 SELECT APDU,为什么不尝试最简单的方法,即选择颁发者安全域?

试试这个命令:

00 A4 04 00 00

此时,您无需担心身份验证。SELECT 应该适用于所有安全级别。

最新更新