发布:admin2025-05-21 01:15:15 9668条浏览分类:世界杯怎么画
公交卡的结构
1.SELECT 选择MF (可不选)
可以不选默认也会被选中,但是可以通过这个指令获得文件控制信息FCI 发送 00A4 0000 02 3F00 接收 6f 12 84 0e 31 50 55 42 2e 53 59 53 2e 44 44 46 30 31 a5 00 6F:文件控制信息模板,84:DF名称 ,A5:文件控制信息专用数据 88:短文件标识符(SFI) 所以DF名称 315055422e5356532e4444463031 即:1PUB.SYS.DDF01
2.READ RECORD 读目录文件
发送 00B2 01 0C 00 返回 70 11 61 0f 4f 09 a00000000386980701 50 02 3f01 这里 01是记录号,接下来我读了02 03都有返回,读04的时候提示记录未找到。 响应是电子存折/钱包规范中的SELECT ADF 的响应 这里一共读到3条记录 4F 是 应用标识符AID a00000000386980701 a00000000386980702 a00000000386980703 50 是应用标签 3F01 3F02 3F03
3.SELECT 选择应用 3F01
发送 00A0 0000 02 3F01 返回6f 2e (FCI模板) 84 09 a00000000386980701 (84 DF名) a5 21 (a5 FCI专用模板) 9f0c 1e (9FOC :发卡机构自定义数据,JT/T xxx手册上写的是BF0C) 84753100000000000000 发卡机构代码 31 应用类型标识 00 发卡机构应用版本号 3100000020915087 应用帐户(卡号) 20151010 应用启用日期 20651010 应用有效日期 0000 发卡机构自定义代码
4.GET BALANCE 读取余额
发送 805C 00 02 04 返回 00 00 16 c8 我这张卡余额是 16C8 16C8 换算成10进制就是5832,再除与100,余额就是58.32
5.READ RECORD 读交易明细 (0x18)
发送 00B2 01 C4 00 返回 0018 000000 00000111 09 310001050306 20160109164459 发送参数 P2 = 0xC4(11000 100) 11000 是0x18 即 交易明细文件 切割一下返回的数据 data[0:1] 交易编号 data[2,4] 不清楚 data[5,8] 交易金额(和上一步算余额的方法一样) data[9] 交易类型(充值(0x06)还是刷卡(0x09) data[10,15] 终端机器编号 data[16,22] 交易日期,最后一次交易日期是 2016-01-09 16:44:59
继续发送命令依次读取记录 00B2 01 C4 00 00B2 02 C4 00 00B2 03 C4 00 … 00B2 0A C4 00 测试发现最多可以读取10条交易记录,大于10条就会返回记录未找到(6A83)
6.READ BINARY读公用应用基本数据文件(0x15)
发送 00B0 95 001E 返回 8475310000000000 00 00 31003100000020915087 20151010 20651010 00 00 发送参数 P2 = 0x95= 100 10101 ,10101=0x15即公共应用基本文件 拆分一下数据
data[0:7] 8475310000000000:发卡方标识 data[8] 00 :应用标识(表示保留) data[9] 00 :发卡方应用版本 data[10:19] 31003100000020915087:卡片序列号(与卡片上的编号一致) data[20:23] 20151010 : 起始日期 data[24:27] 20651010 : 有效日期 data[28:29] 0000 : 发卡方自定义的FCI数据
7.其他文件
尝试了读取IC卡文件结构中的其他文件 持卡人基本信息文件0x16 发送 00B0 9700 00 返回 不满足安全状态(6982)
管理信息文件 0x17 P2 = 0xBC(10111 100) 发送 00B2 01 BC 00 00B2 02 BC 00 … 00B2 0A BC 00 测试可以读到9条记录(到 0x09) 数据是变长记录,有全0的也有非全0的,不知道是些什么东西,没仔细研究