|
|
# APDU指令速查手册(解卡业务专用)
## 一、指令类别(CLA)速查
| CLA | 含义 | 说明 |
|-----|------|------|
| 00 | ISO 7816-4标准指令 | 最常用 |
| 80 | 私有指令(GSM/支付) | SIM卡、金融卡 |
| 84 | 安全相关指令 | 认证、密钥管理 |
| A0 | 电信应用指令 | SIM卡特有 |
| B0 | 非标准扩展指令 | 厂商特定 |
## 二、核心指令代码(INS)全集
### 2.1 文件操作指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| A4 | SELECT | 选择文件 | `00 A4 P1 P2 Lc [文件标识符]` |
| B0 | READ BINARY | 读二进制文件 | `00 B0 P1 P2 Le` |
| B1 | WRITE BINARY | 写二进制文件 | `00 B1 P1 P2 Lc [数据]` |
| B2 | READ RECORD | 读记录文件 | `00 B2 P1 P2 Le` |
| B3 | WRITE RECORD | 写记录文件 | `00 B3 P1 P2 Lc [数据]` |
| D0 | WRITE BINARY | 更新二进制(扩展) | `00 D0 P1 P2 Lc [数据]` |
| D2 | WRITE RECORD | 更新记录(扩展) | `00 D2 P1 P2 Lc [数据]` |
| D6 | UPDATE BINARY | 更新二进制 | `00 D6 P1 P2 Lc [数据]` |
| DC | UPDATE RECORD | 更新记录 | `00 DC P1 P2 Lc [数据]` |
| E2 | APPEND RECORD | 追加记录 | `00 E2 P1 P2 Lc [数据]` |
### 2.2 数据操作指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| B2 | READ RECORD | 读记录(同上) | `00 B2 P1 P2 Le` |
| CA | GET DATA | 获取数据对象 | `00 CA P1 P2 Le` |
| DA | PUT DATA | 写入数据对象 | `00 DA P1 P2 Lc [数据]` |
| CB | GET NEXT DATA | 获取下一个数据对象 | `00 CB P1 P2 Le` |
| C0 | GET RESPONSE | 获取响应数据 | `00 C0 00 00 Le` |
### 2.3 安全控制指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| 20 | VERIFY | 验证PIN/密码 | `00 20 P1 P2 Lc [PIN]` |
| 22 | MANAGE SECURITY ENVIRONMENT | 管理安全环境 | `00 22 P1 P2 Lc [数据]` |
| 24 | CHANGE REFERENCE DATA | 修改参考数据 | `00 24 P1 P2 Lc [数据]` |
| 26 | DISABLE VERIFICATION REQUIREMENT | 禁用验证要求 | `00 26 P1 P2 Lc [数据]` |
| 28 | ENABLE VERIFICATION REQUIREMENT | 启用验证要求 | `00 28 P1 P2 Lc [数据]` |
| 2A | PERFORM SECURITY OPERATION | 执行安全操作 | `00 2A P1 P2 Lc [数据]` |
| 2C | RESET RETRY COUNTER | 重置重试计数器 | `00 2C P1 P2 Lc [数据]` |
| 84 | GET CHALLENGE | 获取随机数 | `00 84 00 00 Le` |
| 88 | INTERNAL AUTHENTICATE | 内部认证 | `00 88 00 00 Lc [挑战数据]` |
| 82 | EXTERNAL AUTHENTICATE | 外部认证 | `00 82 00 00 Lc [认证数据]` |
### 2.4 卡片管理指令
| INS | 指令名称 | 功能 | 典型APDU格式 |
|-----|----------|------|--------------|
| 44 | ACTIVATE FILE | 激活文件 | `00 44 P1 P2 00` |
| 46 | DEACTIVATE FILE | 停用文件 | `00 46 P1 P2 00` |
| 70 | MANAGE CHANNEL | 管理逻辑通道 | `00 70 P1 P2 Lc [数据]` |
| 73 | MANAGE SECURITY ENVIRONMENT | 管理安全环境(扩展) | `00 73 P1 P2 Lc [数据]` |
| 75 | MANAGE MEMORY | 管理内存 | `00 75 P1 P2 Lc [数据]` |
| A4 | SELECT(同上) | 选择文件 | `00 A4 P1 P2 Lc [文件标识符]` |
| F2 | STATUS | 获取状态信息 | `00 F2 P1 P2 Le` |
| F3 | TERMINATE CARD USAGE | 终止卡片使用 | `00 F3 P1 P2 00` |
| FA | TERMINATE DF | 终止DF | `00 FA P1 P2 00` |
| FE | TERMINATE EF | 终止EF | `00 FE P1 P2 00` |
## 三、SELECT指令P1参数详解
| P1值 | 选择模式 | 说明 |
|------|----------|------|
| 00 | 通过文件标识符选择 | 最常用 |
| 01 | 选择父DF | 返回上一级目录 |
| 02 | 通过文件标识符选择子DF | 在当前DF下选择 |
| 03 | 通过路径选择 | 使用完整路径 |
| 04 | 通过DF名称选择 | 按应用名称选择 |
| 08 | 从MF开始选择 | 绝对路径选择 |
| 09 | 从当前DF开始选择 | 相对路径选择 |
| 0C | 获取子文件列表 | 探索目录内容 |
## 四、READ/WRITE指令P1P2编码规则
### 4.1 READ BINARY (B0/B1)
```
P1: b8 b7 b6 b5 b4 b3 b2 b1
└─────┬─────┘ │
偏移高位 SFI标志(0=偏移,1=SFI)
当b8=0时:偏移量 = (P1<<8) | P2
当b8=1时:SFI = P1低5位,偏移量 = P2
```
### 4.2 READ RECORD (B2/B3)
```
P1: 记录号(00=下一条,01-FF=具体记录)
P2: b8 b7 b6 b5 b4 b3 b2 b1
└─┬──┘ │ └─────┬─────┘
模式选择 保留 包含标识符 SFI
模式选择:
00 - 按记录号读取
01 - 读取第一条记录
10 - 读取最后一条记录
11 - 按记录标识符读取
```
## 五、GET DATA常用P1P2组合
| P1P2 | 数据对象 | 说明 |
|------|----------|------|
| 0000 | 保留 | |
| 0001 | 卡片数据对象 | |
| 0002 | 当前目录的AID | |
| 0003 | 制造商特定数据 | |
| 0004 | 卡片发行者数据 | |
| 0005 | 卡片持有者数据 | |
| 0006 | 图像 | |
| 0007 | 应用程序相关数据 | |
| 0008 | 卡片能力 | |
| 0009 | 逻辑通道信息 | |
| 000A | 当前环境 | |
| 000B | 接口设备能力 | |
| 000C | 算法信息 | |
| 000D | 访问控制规则 | |
| 000E | 安全环境 | |
| 000F | 数字签名 | |
| 0010 | 公钥证书 | |
| 0011 | PIN状态 | |
| 0012 | 安全消息计数器 | |
| 0013 | 安全消息时间戳 | |
| 0014 | 安全消息随机数 | |
| 0015 | 日志格式 | |
| 0016 | 日志数据 | |
| 0017 | 持卡者证件 | |
| 0018 | 跟踪数据 | |
| 0019 | 交易计数器 | |
| 001A | 交易日期 | |
| 001B | 交易时间 | |
| 001C | 交易金额 | |
| 001D | 交易货币代码 | |
| 001E | 交易类型 | |
| 001F | 商户名称 | |
| 0020 | 商户国家代码 | |
| 0021 | 商户类别代码 | |
| 0022 | 终端国家代码 | |
| 0023 | 终端能力 | |
| 0024 | 终端类型 | |
| 0025 | 接口设备序列号 | |
| 0026 | 应用交互特征 | |
| 0027 | 应用生命周期状态 | |
| 0028 | 应用优先级 | |
| 0029 | 应用选择指示器 | |
| 002A | 应用用途控制 | |
| 002B | 应用版本 | |
| 002C | 应用有效日期 | |
| 002D | 应用失效日期 | |
| 002E | 应用图像 | |
| 002F | 应用标签 | |
| 0030 | 应用首选名称 | |
| 0031 | 应用交易计数器 | |
| 0032 | 最后在线ATC寄存器 | |
| 0033 | PIN尝试计数器 | |
| 0034 | 生物特征数据 | |
| 0035 | 生物特征模板 | |
| 0036 | 生物特征匹配结果 | |
| 0037 | 安全支持模板 | |
| 0038 | 卡风险管理数据对象列表1 | |
| 0039 | 卡风险管理数据对象列表2 | |
| 003A | 持卡者验证方法列表 | |
| 003B | 持卡者验证方法结果 | |
| 003C | 发卡行认证数据 | |
| 003D | 应用文件定位器 | |
| 003E | 应用主账号 | |
| 003F | 应用主账号序列号 | |
| 0040 | 应用过期日期 | |
| 0041 | 应用生效日期 | |
| 0042 | 应用主账号PAN | |
| 0043 | 卡片持有者姓名 | |
| 0044 | 磁条2等效数据 | |
| 0045 | 磁条3等效数据 | |
| 0046 | 应用主账号PAN | |
| 0047 | 卡片持有者姓名扩展 | |
| 0048 | 应用密码 | |
| 0049 | 银行标识代码 | |
| 004A | 发卡行国家代码 | |
| 004B | 发卡行标识 | |
| 004C | 卡片序列号 | |
| 004D | 服务代码 | |
| 004E | 应用模板 | |
| 004F | 应用标识符 | |
| 0050 | 应用标签 | |
| 0051 | 应用首选名称 | |
| 0052 | 应用优先级指示器 | |
| 0053 | 发卡行代码表索引 | |
| 0054 | 应用主账号PAN | |
| 0055 | 日志条目 | |
| 0056 | 磁条1等效数据 | |
| 0057 | 磁条2等效数据 | |
| 0058 | 磁条3等效数据 | |
| 0059 | 卡片持有者证件数据 | |
| 005A | 应用主账号PAN | |
| 005B | 跟踪1数据 | |
| 005C | 跟踪2数据 | |
| 005D | 跟踪3数据 | |
| 005E | 卡片持有者证件类型 | |
| 005F | 卡片持有者证件号码 | |
| 0060 | 卡片持有者证件有效期 | |
| 0061 | 卡片持有者证件发证机关 | |
| 0062 | 卡片持有者证件发证国家 | |
| 0063 | 卡片持有者证件发证地点 | |
| 0064 | 卡片持有者证件发证日期 | |
| 0065 | 生物特征数据组模板 | |
| 0066 | 生物特征信息组模板 | |
| 0067 | 生物特征持有者模板 | |
| 0068 | 存储容量 | |
| 0069 | 可用内存 | |
| 006A | 最大文件大小 | |
| 006B | 文件标识符 | |
| 006C | 短文件标识符 | |
| 006D | 文件大小 | |
| 006E | 总文件大小 | |
| 006F | PIN长度 | |
| 0070 | 安全属性 | |
| 0071 | 安全环境 | |
| 0072 | 数字签名 | |
| 0073 | 公钥 | |
| 0074 | 私钥 | |
| 0075 | 密钥信息 | |
| 0076 | 密钥组件 | |
| 0077 | 密钥检查值 | |
| 0078 | 密钥版本 | |
| 0079 | 密钥标识符 | |
| 007A | 密钥用途 | |
| 007B | 密钥算法 | |
| 007C | 密钥长度 | |
| 007D | 密钥有效期 | |
| 007E | 密钥状态 | |
| 007F | 密钥数据 | |
| 0080 | 扩展头列表 | |
| 0081 | 日志格式 | |
| 0082 | 日志数据 | |
| 0083 | 持卡者证件 | |
| 0084 | 跟踪数据 | |
| 0085 | 交易计数器 | |
| 0086 | 交易日期 | |
| 0087 | 交易时间 | |
| 0088 | 交易金额 | |
| 0089 | 交易货币代码 | |
| 008A | 交易类型 | |
| 008B | 商户名称 | |
| 008C | 商户国家代码 | |
| 008D | 商户类别代码 | |
| 008E | 终端国家代码 | |
| 008F | 终端能力 | |
| 0090 | 终端类型 | |
| 0091 | 接口设备序列号 | |
| 0092 | 应用交互特征 | |
| 0093 | 应用生命周期状态 | |
| 0094 | 应用优先级 | |
| 0095 | 应用选择指示器 | |
| 0096 | 应用用途控制 | |
| 0097 | 应用版本 | |
| 0098 | 应用有效日期 | |
| 0099 | 应用失效日期 | |
| 009A | 应用图像 | |
| 009B | 应用标签 | |
| 009C | 应用首选名称 | |
| 009D | 应用交易计数器 | |
| 009E | 最后在线ATC寄存器 | |
| 009F | PIN尝试计数器 | |
## 六、解卡常用指令组合
### 6.1 文件系统探索
```bash
# 1. 选择MF
00A40000023F00
# 2. 尝试获取文件列表
00A4000C00
# 3. 尝试常见文件标识符
00A40000020001 # 常见系统文件
00A40000020002
00A40000022F00 # DIR文件
00A40000022F01 # ATR文件
# 4. 通过SFI快速读取(如果已知)
00B0850000 # 读取SFI=5
00B0860000 # 读取SFI=6
```
### 6.2 安全状态探测
```bash
# 1. 检查PIN状态
00CA9F17 # 获取PIN尝试计数器
# 2. 尝试默认PIN
0020000004FFFFFFFF # 验证PIN(PIN=FFFF)
002000000400000000 # 验证PIN(PIN=0000)
002000000412345678 # 验证PIN(PIN=12345678)
# 3. 获取安全环境信息
00CA9F06 # 获取安全环境
00CA9F07 # 获取算法信息
```
### 6.3 数据提取
```bash
# 1. 读取关键数据对象
00CA9F36 # 获取交易计数器
00CA9F13 # 获取最后交易日期
00CA9F1A # 获取商户国家代码
00CA9F1B # 获取交易货币代码
# 2. 读取应用数据
00CA4F00 # 获取应用标识符
00CA5000 # 获取应用标签
00CA9F38 # 获取PDOL
```
## 七、状态字(SW1SW2)关键代码
### 7.1 成功类
| SW1SW2 | 含义 |
|--------|------|
| 9000 | 成功 |
| 6100-61FF | 有XX字节数据待取(发送GET RESPONSE) |
| 6200 | 警告:状态未改变 |
| 6281 | 警告:回送数据可能损坏 |
| 6282 | 警告:文件长度小于Le |
| 6283 | 警告:选中的文件无效 |
| 6284 | 警告:FCI格式不符合ISO 7816 |
### 7.2 错误类(解卡重点关注)
| SW1SW2 | 含义 | 解卡意义 |
|--------|------|----------|
| 6300 | 认证失败 | PIN验证失败 |
| 63CX | 验证失败,剩余X次尝试 | PIN尝试次数信息 |
| 6700 | 长度错误 | Lc/Le值错误 |
| 6981 | 命令与文件结构不兼容 | 文件类型错误 |
| 6982 | 安全状态不满足 | 需要先认证 |
| 6983 | 认证方法锁定 | PIN被锁定 |
| 6984 | 引用数据无效 | 密钥/PIN错误 |
| 6985 | 使用条件不满足 | 条件未满足 |
| 6986 | 命令不允许(无当前EF) | 未SELECT文件 |
| 6987 | 安全报文数据项丢失 | 安全通信问题 |
| 6988 | 安全报文数据项不正确 | MAC/加密错误 |
| 6A80 | 数据域参数不正确 | 数据格式错误 |
| 6A81 | 功能不支持 | 指令不支持 |
| 6A82 | 文件未找到 | 文件不存在 |
| 6A83 | 记录未找到 | 记录不存在 |
| 6A84 | 文件空间不足 | 存储已满 |
| 6A85 | Lc与TLV结构不一致 | 长度不匹配 |
| 6A86 | P1P2参数不正确 | 参数错误 |
| 6A87 | Lc与P1P2不一致 | 长度参数冲突 |
| 6A88 | 引用数据未找到 | 密钥/PIN不存在 |
| 6A89 | 文件已存在 | 重复创建 |
| 6A8A | DF名称已存在 | 重复DF |
| 6D00 | INS不支持 | 指令代码错误 |
| 6E00 | CLA不支持 | 类别代码错误 |
| 6F00 | 未知错误 | 一般错误 |
## 八、非标准扩展指令(厂商特定)
### 8.1 MIFARE Classic相关
| INS | 功能 | 说明 |
|-----|------|------|
| C0 | MIFARE Classic认证 | `FF C0 00 块号 06 [密钥]` |
| C1 | MIFARE Classic读块 | `FF C1 00 块号 10` |
| C2 | MIFARE Classic写块 | `FF C2 00 块号 10 [数据]` |
### 8.2 特殊功能指令
| INS | 功能 | 说明 |
|-----|------|------|
| B2 | READ RECORD(扩展) | 某些卡片支持更多模式 |
| D6 | UPDATE BINARY(扩展) | |
| DA | PUT DATA(扩展) | |
| E4 | ERASE BINARY | 擦除二进制文件 |
| E6 | ERASE RECORD | 擦除记录 |
## 九、实用速查表
### 9.1 常用文件标识符
| 文件ID | 类型 | 用途 |
|--------|------|------|
| 3F00 | MF | 主文件 |
| 2F00 | EF | DIR文件(应用列表) |
| 2F01 | EF | ATR文件 |
| 2F02 | EF | 卡片发行者数据 |
| 0001-001F | EF | 系统文件 |
| 0100-01FF | EF | 用户文件 |
| 1000-10FF | DF | 应用目录 |
### 9.2 常用SFI范围
| SFI | 用途 |
|-----|------|
| 1-10 | 系统文件 |
| 11-20 | 密钥文件 |
| 21-30 | 用户数据文件 |
### 9.3 解卡工作流程指令序列
```bash
# 阶段1:卡片识别
00A40000023F00 # 选择MF
00A4000C00 # 获取文件列表
00CA4F00 # 获取AID
# 阶段2:文件系统探索
00A40000022F00 # 选择DIR文件
00B0000000 # 读取DIR内容
00A4000002XXXX # 遍历发现的文件
# 阶段3:安全测试
0020000004FFFFFFFF # 测试默认PIN
00CA9F17 # 检查PIN计数器
0084000008 # 获取挑战值
# 阶段4:数据提取
00B2010C00 # 读取记录1
00B2020C00 # 读取记录2
00CA9F36 # 获取交易计数器
```
|
|