每个 class 的 APDU 6E00 状态
APDU 6E00 status for every class
我是 APDU 和智能卡通信的新手,我不知道如何成功发送 APDU 命令。例如,当我尝试使用此命令时:
00 A4 00 00 02 3F 00 00
我收到 6E 00
回复。我试图弄清楚我必须为我的卡使用哪个 class,但是对于我在 00-FF
范围内尝试的每个 class,我总是得到 'Class not supported' 错误。
我想这可能与卡中的某些身份验证有关,但我不知道如何正确执行此操作。
我使用了以下 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
不是专家,但看着 the pyscard documentation,我认为您在玩弄错误的字节。在给定的示例(您的代码似乎基于该示例)中,它说
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))
我还找到了一个summary table of commands;希望你觉得它有用。
既然您正在尝试发送 SELECT APDU,为什么不尝试最简单的方法,即选择发行者安全域?
试试这个命令:
00 A4 04 00 00
此时您无需关心身份验证。 SELECT 应该适用于所有安全级别。
问题已解决,我的卡是 I2C 卡,因此 APDU 命令无法使用它。我通过 C++ 让它与 Omnisoft 的同步 API 一起工作。不是我真正想要的,但到目前为止这似乎是唯一的选择。
感谢所有帮助过我的人!
我是 APDU 和智能卡通信的新手,我不知道如何成功发送 APDU 命令。例如,当我尝试使用此命令时:
00 A4 00 00 02 3F 00 00
我收到 6E 00
回复。我试图弄清楚我必须为我的卡使用哪个 class,但是对于我在 00-FF
范围内尝试的每个 class,我总是得到 'Class not supported' 错误。
我想这可能与卡中的某些身份验证有关,但我不知道如何正确执行此操作。
我使用了以下 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
不是专家,但看着 the pyscard documentation,我认为您在玩弄错误的字节。在给定的示例(您的代码似乎基于该示例)中,它说
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))
我还找到了一个summary table of commands;希望你觉得它有用。
既然您正在尝试发送 SELECT APDU,为什么不尝试最简单的方法,即选择发行者安全域?
试试这个命令:
00 A4 04 00 00
此时您无需关心身份验证。 SELECT 应该适用于所有安全级别。
问题已解决,我的卡是 I2C 卡,因此 APDU 命令无法使用它。我通过 C++ 让它与 Omnisoft 的同步 API 一起工作。不是我真正想要的,但到目前为止这似乎是唯一的选择。
感谢所有帮助过我的人!