正致力于一个项目,用于读取和写入智能卡数据。我正在使用的读卡器是来自ACR38U-H1
的{{1}}。按照ACS
命令,我可以访问卡并读取一些数据。但我怀疑我仍然无法读取内部的确切数据,因为我始终得到对命令APDU
APDU
而不是0x6e 0x00, 0x00
的响应。
我做错了什么? 也许问题出在智能卡上?
Python代码:
0x90 0x00
此代码的结果:
#! /usr/bin/env python
from smartcard.scard import *
import smartcard.util
SELECT = [
#0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00
0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05
]
COMMAND = [
0x00, 0xC0, 0x00, 0x00, 0x00, 0x0B
]
try:
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to establish context : ' +
SCardGetErrorMessage(hresult))
print 'Context established!'
try:
hresult, readers = SCardListReaders(hcontext, [])
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to list readers: ' +
SCardGetErrorMessage(hresult))
print 'PCSC Readers:', readers
if len(readers) < 1:
raise Exception('No smart card readers')
reader = readers[0]
print "Using reader:", reader
try:
hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader,
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_T1)
if hresult != SCARD_S_SUCCESS:
raise Exception('Unable to connect: ' +
SCardGetErrorMessage(hresult))
print 'Connected with active protocol', dwActiveProtocol
try:
hresult, response = SCardTransmit(hcard, dwActiveProtocol,
SELECT)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to transmit: ' +
SCardGetErrorMessage(hresult))
print 'Select: ' + smartcard.util.toHexString(response,
smartcard.util.HEX)
#==========================================================================
hresult, response = SCardTransmit(hcard, dwActiveProtocol,
COMMAND)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to transmit: ' +
SCardGetErrorMessage(hresult))
print 'Command: ' + smartcard.util.toHexString(response,
smartcard.util.HEX)
# =========================================================================
finally:
hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to disconnect: ' +
SCardGetErrorMessage(hresult))
print 'Disconnected'
except Exception, message:
print "Exception:", message
finally:
hresult = SCardReleaseContext(hcontext)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to release context: ' +
SCardGetErrorMessage(hresult))
print 'Released context.'
except Exception, message:
print "Exception:", message
开放工具的结果:
Context established!
PCSC Readers: ['ACS ACR38U-CCID 00 00']
Using reader: ACS ACR38U-CCID 00 00
Connected with active protocol 2
Select: 0x6E 0x00
Command: 0x67 0x00
Disconnected
Released context.
答案 0 :(得分:0)
SELECT = [
#0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00
0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05
]
在这里,您似乎正在尝试选择MF(AID = 3F00,注释#命令) OR 命令似乎错误,因为没有AID是1字节长度,请检查您的命令
0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05 // check it.
并且获得6E 00 不支持课程
你的另一个命令是C0 - GET RESPONSE,
COMMAND = [
0x00, 0xC0, 0x00, 0x00, 0x00, 0x0B
]
此命令用于从上一个命令指定的长度的卡中获取响应,其返回代码如-61 XX,APDU序列应该像 CLASS,INS,P1,P2,Le //请检查您的获取响应命令
这里获得响应给出6700,这似乎是正确的,因为之前的命令已经失败并且卡没有任何东西可以返回它,因此无法返回Le数据(0x0B - 假设它是你的Le)
我建议,在发出任何命令之前,要好好理解你的卡,好像它是专有卡所以你应该在发送命令之前知道文件结构/ CLASS字节USED,当你用正确的CLA值拍摄时,希望你不会得到 - CLA不支持错误。
希望此信息有助于识别问题。
答案 1 :(得分:0)
您正在使用SELECT_CARD_TYPE
APDU命令(0xFF00000101),该命令适用于 I2C存储卡(特别是16千位) - 请参阅{中的第9.3.1.1节{3}}
此SELECT_CARD_TYPE
命令(CLA
设置为0xFF
)不会发送到卡但发送给读卡器(由于卡不使用I2C,因此拒绝接收卡)。
您的卡是一张微处理器卡,说reader reference manual,因此您需要使用&#34;正常&#34; ISO 7816 APDU - 应在卡片文档中指定。
尽管如此,T=1 protocol script工具似乎可以阅读(并且以有限的方式模拟)FOMS卡(我还没试过)。
鉴于脚本来源,该卡似乎支持在Smart Card Shell 3和new CardFile()
后面使用的标准ISO 7816-4 SELECT
和READ_BINARY
APDU命令。
免责声明:我既没有使用任何FOMS卡,也没有使用过scsh3工具。