芯片 EMV - 为每张智能卡获取 AFL

Chip EMV - Getting AFL for every smart card

继续自:

我在 C 中工作,所以我没有 Java 工具和自动解析 APDU 命令响应的所有函数。 我想读取所有类型的智能卡。 我必须解析 GET PROCESSING OPTIONS 的响应并获取每张卡的 AFL(访问文件定位器)。

我有三张卡,分别代表三种不同的情况:

案例 A)

我有三个不同的 AFL:10 2 4 118 1 1 020 1 1 0 所以我发送 00 B2 SFI P2 00,其中 SFI 是 10>>3(10 是第一个 AFL 的第一个字节),P2 是 SFI<<3|4 这样我就得到了我卡的正确 PAN 代码。

案例 B)

我有三个不同的 AFL:18 1 1 020 1 1 028 1 3 1。 所以我发送 00 B2 SFI P2 00 以与案例 A 相同的方式构建,但我收到每个 AFL 的响应 6A 83。

案例 C) 我有两个不同的 AFL:8 1 1 018 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