SELECT FILE APDU

SELECT FILE

终端发送的数据:   00 A4 04 00  0E 命令解释: LC(0E)是终端发送给卡片数据的长度.

                                   31 50 41 59 2E 53 59 53 2E 44 44 46 30 31  解释:终端首先尝试用目录选择方法选择应用,用PSE名“1PAY.SYS.DDF01”向卡片发送SELECT命令。

卡片回应的数据:   6F 1E 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 0C 88 01 01 5F 2D 02 7A 68 9F 11 0101 解释见下表表 B.26。本质的东西:

                                   成功选择PSE后回送的FCI。

 

表 B.23:SELECT命令报文

代码

CLA

‘00’

INS

‘A4’

P1

引用控制参数(见表B-24)

P2

选择选项(见表B-25)

Lc

‘05’ - ‘10’

Data

文件名

Le

‘00’

下表定义了SELECT命令报文的引用控制参数:

表 B.24:SELECT命令引用控制参数

B8

b7

b6

b5

b4

b3

b2

b1

含义

0

 0

0

0

0

 

 

 

 

1

通过名称选择

 

0

0

 

下表定义了SELECT命令报文的选择选项P2:

表 B.25:SELECT命令的可选参数

b8

b7

b6

b5

b4

b3

b2

b1

含义

 

0

0

第一个有或仅有一个

1

0

下一个

B.2.1 命令报文数据域

 应答报文中数据域应包括所选择的PSE、DDF或ADF的FCI。表 B.26、表 B.27和表 B.28定义了本规范所应用的标识。对于本规范所不规定的FCI中回送的附加标签应该被忽略。

下表定义了成功选择PSE后回送的FCI:

表 B.26:选择PSE的应答报文 (FCI)

标识

存在性

‘6F’

FCI模板

M

 

‘84’

DF名(1PAY.SYS.DDF01)

M

‘A5’

FCI数据专用模板

M

 

‘88’

目录基本文件的SFI

M

‘5F2D’

语言选择

O

‘9F11’

发卡行代码表索引

O

‘BF0C’

发卡行自定义数据(FCI)

O

 

‘XXXX’

(第3册规定的标签)

来自从应用提供商、发卡行或IC卡供应商的1个或多个附加(专用)数据元。

O

 

### APDU指令的格式与使用方法 APDU(Application Protocol Data Unit)是智能卡通信中使用的协议数据单元。它定义了主机和智能卡之间的交互方式,通常用于发送命令和接收响应[^1]。 #### 1. APDU的基本结构 APDU分为两种类型:**命令APDU** 和 **响应APDU**。 - **命令APDU** 的结构如下: - **CLA (Class)**: 指令类别字节,用于区分不同的应用或命令类别。 - **INS (Instruction)**: 指令代码,表示具体的命令操作。 - **P1, P2 (Parameters)**: 参数字节,用于进一步描述指令的行为或目标。 - **Lc (Length of Command Data)**: 表示命令数据字段的长度。 - **Data**: 命令数据字段,包含需要传输的数据。 - **Le (Expected Length of Response Data)**: 表示期望的响应数据长度。 ```plaintext +----+----+----+----+-----+-----+ | CLA| INS| P1 | P2 | Lc | Data| Le | +----+----+----+----+-----+-----+ ``` - **响应APDU** 的结构如下: - **Data**: 响应数据字段,包含从智能卡返回的数据。 - **SW1, SW2 (Status Word)**: 状态字,用于指示命令执行的结果。 ```plaintext +-----+----+----+ | Data| SW1| SW2| +-----+----+----+ ``` #### 2. 使用方法 在实际应用中,APDU指令通过特定的接口(如ISO 7816标准定义的接口)发送到智能卡设备。以下是一个简单的例子,展示如何通过APDU指令读取卡片上的文件内容: ```python # 示例:发送APDU指令以选择一个文件 apdu_command = "00 A4 00 00 02 3F 00" # CLA=00, INS=A4, P1=00, P2=00, Lc=02, Data=3F00, Le=未指定 response = send_apdu(apdu_command) # 调用函数发送APDU指令并接收响应 print(response) # 打印响应数据 ``` 上述代码中,`send_apdu` 是一个假设的函数,用于发送APDU指令并接收智能卡的响应。`apdu_command` 是一个十六进制字符串形式的APDU指令,其中各部分的含义如下: - `CLA=00`: 指令类别。 - `INS=A4`: 选择文件指令。 - `P1=00`: 文件选择模式。 - `P2=00`: 不指定后续文件。 - `Lc=02`: 数据字段长度为2字节。 - `Data=3F00`: 文件标识符。 #### 3. 注意事项 - 在设计APDU指令时,必须确保指令符合目标智能卡的应用规范。 - 不同的智能卡可能支持不同的指令集,因此在开发前需查阅相关文档。 - 状态字(SW1, SW2)非常重要,用于判断指令是否成功执行。例如,`9000` 表示成功,而其他值可能表示错误或异常情况[^2]。 ### 示例代码 以下是一个更复杂的APDU指令示例,用于读取指定文件的内容: ```python def read_file(file_id): select_file = f"00 A4 00 00 02 {file_id}" # 构造选择文件的APDU指令 response_select = send_apdu(select_file) if response_select[-4:] == "9000": # 检查状态字是否为9000 read_binary = "00 B0 00 00 10" # 构造读取二进制数据的APDU指令 response_read = send_apdu(read_binary) return response_read[:-4] # 返回数据部分,去掉最后的状态字 else: return "File selection failed" file_content = read_file("3F00") # 调用函数读取文件内容 print(file_content) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值