芯片 EMV - 为每张智能卡获取 AFL
Chip EMV - Getting AFL for every smart card
继续自:
我在 C 中工作,所以我没有 Java 工具和自动解析 APDU 命令响应的所有函数。
我想读取所有类型的智能卡。
我必须解析 GET PROCESSING OPTIONS 的响应并获取每张卡的 AFL(访问文件定位器)。
我有三张卡,分别代表三种不同的情况:
- A) HelloBank:
77 12 82 2 38 0 94 c 10 2 4 1 18 1 1 0 20 1 1 0 90
- B) 贝宝:
77 12 82 2 39 0 94 c 18 1 1 0 20 1 1 0 28 1 3 1 90
- C) 邮政支付:
80 a 1c 0 8 1 1 0 18 1 2 0 90
案例 A)
我有三个不同的 AFL:10 2 4 1
、18 1 1 0
、20 1 1 0
所以我发送 00 B2 SFI P2 00
,其中 SFI 是 10>>3(10 是第一个 AFL 的第一个字节),P2 是 SFI<<3|4 这样我就得到了我卡的正确 PAN 代码。
案例 B)
我有三个不同的 AFL:18 1 1 0
、20 1 1 0
、28 1 3 1
。
所以我发送 00 B2 SFI P2 00
以与案例 A 相同的方式构建,但我收到每个 AFL 的响应 6A 83。
案例 C)
我有两个不同的 AFL:8 1 1 0
、18 1 2 0
但我无法自动解析它们,因为没有与先前响应相同的 TAG。
如果我使用那些 AFL 它有效,我可以获得卡的 PAN 代码。
如何制定通用的方法来读取正确的 AFL,以及如何使用这些 AFL 发出正确的命令?
下面是AFL的解码:
您通常会得到 4 字节的倍数的 AFL。将完整的 AFL 分成 4 个字节的块。让我们以 1 Chunk 为例:
AABBCCDD
AA -> SFI(解码说明如下)
BB -> 该 SFI 下的第一个记录
CC -> 在此 SFI 下的最后记录
DD -> 离线数据认证涉及的记录(暂不供您使用)
以你为例 10 02 04 01 18 01 01 00 20 01 10 00
块是 10 02 04 01、18 01 01 00、20 01 10 00
10 02 04 01 -->
Taking 1st Byte 10 : 00010000 Take initial 5 bits from MSB --> 00010 表示 2 : 表示 SFI 2
获取第 2 个字节 02:SFI 2 下的第一个记录是 02
获取第 3 个字节 04:SFI 2 下的最后记录是 04
不包括4字节解释,因为没有用
摘要:SFI 2 包含记录 2 到 4
读取记录命令将如何形成:
APDU 结构:CLA INS P1 P2 LE
共济会 00
INS B2
P1 (Rec No)02 (SInce in this SFI 2 initial record is 02)
P2 (SFI) SFI 02 : 以5位二进制数00010表示SFI,然后在末尾附加100 : 00010100 : In Hex 14
所以 P2 是 14
LE 00
读取 SFI 2 Rec 2 的 APDU:00 B2 02 14 00
读取 SFI 2 Rec 3 的 APDU:00 B2 03 14 00
读取 SFI 2 Rec 4 的 APDU:00 B2 04 14 00
现在,如果您尝试阅读 Rec 5,由于此 Rec 不存在,在这种情况下您将获得 SW 6A83。
对所有块使用相同的过程来识别可用的记录和 SFI
通过这种机制,您可以编写函数来解析 AFL
继续自:
我在 C 中工作,所以我没有 Java 工具和自动解析 APDU 命令响应的所有函数。 我想读取所有类型的智能卡。 我必须解析 GET PROCESSING OPTIONS 的响应并获取每张卡的 AFL(访问文件定位器)。
我有三张卡,分别代表三种不同的情况:
- A) HelloBank:
77 12 82 2 38 0 94 c 10 2 4 1 18 1 1 0 20 1 1 0 90
- B) 贝宝:
77 12 82 2 39 0 94 c 18 1 1 0 20 1 1 0 28 1 3 1 90
- C) 邮政支付:
80 a 1c 0 8 1 1 0 18 1 2 0 90
案例 A)
我有三个不同的 AFL:10 2 4 1
、18 1 1 0
、20 1 1 0
所以我发送 00 B2 SFI P2 00
,其中 SFI 是 10>>3(10 是第一个 AFL 的第一个字节),P2 是 SFI<<3|4 这样我就得到了我卡的正确 PAN 代码。
案例 B)
我有三个不同的 AFL:18 1 1 0
、20 1 1 0
、28 1 3 1
。
所以我发送 00 B2 SFI P2 00
以与案例 A 相同的方式构建,但我收到每个 AFL 的响应 6A 83。
案例 C)
我有两个不同的 AFL:8 1 1 0
、18 1 2 0
但我无法自动解析它们,因为没有与先前响应相同的 TAG。
如果我使用那些 AFL 它有效,我可以获得卡的 PAN 代码。
如何制定通用的方法来读取正确的 AFL,以及如何使用这些 AFL 发出正确的命令?
下面是AFL的解码:
您通常会得到 4 字节的倍数的 AFL。将完整的 AFL 分成 4 个字节的块。让我们以 1 Chunk 为例: AABBCCDD
AA -> SFI(解码说明如下)
BB -> 该 SFI 下的第一个记录
CC -> 在此 SFI 下的最后记录
DD -> 离线数据认证涉及的记录(暂不供您使用)
以你为例 10 02 04 01 18 01 01 00 20 01 10 00
块是 10 02 04 01、18 01 01 00、20 01 10 00
10 02 04 01 --> Taking 1st Byte 10 : 00010000 Take initial 5 bits from MSB --> 00010 表示 2 : 表示 SFI 2
获取第 2 个字节 02:SFI 2 下的第一个记录是 02
获取第 3 个字节 04:SFI 2 下的最后记录是 04
不包括4字节解释,因为没有用
摘要:SFI 2 包含记录 2 到 4
读取记录命令将如何形成:
APDU 结构:CLA INS P1 P2 LE
共济会 00
INS B2
P1 (Rec No)02 (SInce in this SFI 2 initial record is 02)
P2 (SFI) SFI 02 : 以5位二进制数00010表示SFI,然后在末尾附加100 : 00010100 : In Hex 14 所以 P2 是 14
LE 00
读取 SFI 2 Rec 2 的 APDU:00 B2 02 14 00
读取 SFI 2 Rec 3 的 APDU:00 B2 03 14 00
读取 SFI 2 Rec 4 的 APDU:00 B2 04 14 00
现在,如果您尝试阅读 Rec 5,由于此 Rec 不存在,在这种情况下您将获得 SW 6A83。
对所有块使用相同的过程来识别可用的记录和 SFI 通过这种机制,您可以编写函数来解析 AFL