0

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

00 A4 00 00 02 3F 00 00

我得到6E 00回应。我试图弄清楚我必须为我的卡使用哪个类,但是对于我在 range 中尝试的每个类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

4

3 回答 3

2

解决了这个问题,我的卡是 I2C 卡,所以 APDU 命令不能用它。我通过 C++ 让它与 Omnisoft 的同步 API 一起工作。不是我的想法,但到目前为止,这似乎是唯一的选择。

感谢所有帮助过我的人!

于 2015-01-20T15:18:37.317 回答
0

Not an expert, but looking at the pyscard documentation, I think you are playing with the wrong bytes. In the given example (which your code appears to be based on), it says

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

where it looks like A0 A4 00 00 02 is the command (which should not be modified) and 7F 10 identifies the type of card to talk to (which is almost certainly different depending on what sort of card you have).

Try instead:

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))

I also found a summary table of commands; hope you find it useful.

于 2015-01-10T22:04:25.137 回答
0

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

试试这个命令:

00 A4 04 00 00

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

于 2015-01-11T09:14:40.193 回答