使用ISODEP与APDU命令读取德国Sparkasse Girocard数据遇错求助
读取德国Sparkasse Girocard数据的问题解决
错误码6F44的原因
状态码6F44表示选择的应用不存在,核心问题是你使用的AID不正确。Sparkasse的Girocard属于EMV标准借记卡,不同应用(GIROcard、Visa Debit、Mastercard Debit)对应不同AID,你之前使用的D27600002547410100是旧版GIROcard的AID,当前主流卡片已更新为新版AID。
修正SELECT命令的AID
尝试以下几个Sparkasse Girocard常用的AID:
- GIROcard官方AID:
D27600002547410200 - Visa Debit AID:
A0000000031010 - Mastercard Debit AID:
A0000000041010
修正后的SELECT命令示例(以GIROcard AID为例):
byte[] SELECT = { (byte) 0x00, // CLA 指令类别 (byte) 0xA4, // INS 选择应用指令 (byte) 0x04, // P1 按AID选择 (byte) 0x00, // P2 无附加限定 (byte) 0x09, // Lc AID长度 (byte) 0xD2,0x76,0x00,0x00,0x25,0x47,0x41,0x02,0x00, // 新版GIROcard AID (byte) 0x00 // Le 请求返回所有数据 };
成功选择应用后的后续命令
当SELECT命令返回9000后,按以下步骤获取卡片数据:
- 获取处理选项(GET PROCESSING OPTIONS)
初始化应用并获取后续操作所需参数:byte[] GET_PO = { (byte) 0x80, // CLA (byte) 0xA8, // INS (byte) 0x00, // P1 (byte) 0x00, // P2 (byte) 0x02, // Lc (byte) 0x83,0x00, // 数据域:请求所有可选数据 (byte) 0x00 // Le }; byte[] poResult = tag.transceive(GET_PO); - 读取卡片记录(READ RECORD)
读取账户信息、交易记录等数据,示例读取SFI(短文件标识符)为1的第一条记录:byte[] READ_RECORD = { (byte) 0x00, // CLA (byte) 0xB2, // INS 读取记录指令 (byte) 0x01, // P1 记录号 (byte) 0x0C, // P2 SFI=1,返回完整记录 (byte) 0x00 // Le }; byte[] recordResult = tag.transceive(READ_RECORD);
进阶排查:获取所有可用应用列表
如果上述AID都无法返回9000,可以发送空AID选择命令,让卡片返回所有支持的应用AID列表,再从中选择正确的:
byte[] SELECT_ALL = { (byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x00, // Lc=0,不指定AID (byte) 0x00 }; byte[] appList = tag.transceive(SELECT_ALL);
解析返回的数据,提取每个应用的AID字段即可。
内容的提问来源于stack exchange,提问作者skynet
相关产品推荐
相关产品推荐

