EMV读取PAN码

3
我需要通过芯片读取所有可能卡的PAN码。在我的工作中,我只能使用C语言,没有可以帮助我完成这项繁琐任务的例程。因此,我使用以下APDU步骤:
1)选择1PAY.SYS.DDF01
00 A4 0400 0E 315041592E5359532E4444463031    

然后从响应中读取00 C0 0000 22 315041592E5359532E4444463031以获取所有数据。

完整响应:

6f 20 e 84 31 50 41 59 2e 53 59 53 2e 44 44 46 30 31 a5 e 88 1 1 5f 2d 69 8 74 65 6e 66 72 65 73 90

2) 使用READ RECORD命令以获取特定的AID。

00 B2 010C 00 

完整响应:

70 17 61 15 4f 7 a0 0 0 0 4 30 60 50 7 4d 41 53 54 52 45 4f 87 1 1 90

3) 选择AID(在我的案例中,AID是来自上一条响应的A0000000043060)

00 A4 0400 07 A0000000043060

同样的情况下,我得到了响应:61 36,因此我重新使用以下命令进行调用:
00 C0 0000 36 A0000000043060

完整响应:

6f 0 41 45 53 52 4f 54 87 1 1 34 84 a0 7 0 0 4 30 60 a5 29 50 7 4d 5f 2d 8 69 74 65 6e 72 66 65 73 bf c f 9f 4d 2 b a 9f 6e 3 7 80 0 0 30 30 0 90

现在我使用的每个命令都会收到错误消息。 我不知道是否需要使用READ DATA、READ RECORD、GET PROCESSING OPTIONS或其他命令。 您能否给我一些提示,告诉我现在该做什么?
我需要获取卡片上清晰打印的16位代码。
谢谢大家。

你能告诉我为什么你需要单独的平移/追踪数据吗? - Adarsh Nanu
1
@Valerio Colonnese,您是在谈论每张卡片上印刷的16位数字代码吗?如果是的话,那么可以检索到该代码,但您的用例是什么?我问这个问题是因为这是存储在卡片中的敏感信息之一。 - Gaurav Shukla
@Gaurav_Orai 我需要对它进行标记化,用于一张会员卡的程序。 - Valerio Colonnese
我想详细说明一下我的答案:我只需要PAN码,因为我需要将其与定制卡片进行映射,以提供忠诚度服务。我需要使用该代码调用我的API,我不需要使用它进行付款,因此我不需要到期日期、PIN或任何银行服务。 - Valerio Colonnese
1个回答

7
Smart Card(支付芯片卡)上印刷的8字节(16位数字)代码是可检索的。这个信息是记录在标签57中的“Track 2 Equivalent Data”的一部分。
您可以切片“Track 2 Equivalent Data”的前8个字节来获取您的代码。
现在如何获取“Track 2 Equivalent Data”:
1.选择付款应用程序(此处不包括PSE/PPSE过程,因为您能够完成它)。
2.发送GPO命令。通常,如果GPO命令APDU不需要PDOL数据,则80 A8 00 00 02 83 00是GPO的APDU(如果SELCT命令响应中不存在9F38标记,则只需发送此APDU,否则必须创建PDOL)。有关GPO响应的更多详细信息,请参见EMV 4.3 Book 3 Section 6.5.8。
3.您将在GPO响应中获得AFL,并根据AFL从应用程序中读取所有可用记录。通常,跟踪2数据可以在2或3个初始记录内找到。
要了解AFL的编码,可以参考EMV 4.3 Book 3第10.2节。要了解READ RECORD APDU的构造,请参考EMV 4.3 Book 1 Section 11.2。
4.其中一个记录必须包含标记57,您可以提取该值。

EMV卡中还有一个标签5A - 应用主帐号(PAN),也可以从AFL中读取此标签,以获取仅16位数字的PAN号码。 - Arjun
@Arjun 是的,这可能是另一个解决方案。 - Gaurav Shukla
@Gaurav_Orai 感谢您的回答。 我已经尝试按照您的答案发送了GPO。 我得到了一个12个字符的AFL响应,其值为10 02 04 01 18 01 01 00 20 01 01 00。 因此,在EMV 4.3 Book 3中,我有3个文件需要读取。我必须发送3个带有AFL参数的READ RECORD命令。 例如,要构建这些命令,我使用了: 02 B2 02 04 01 对于第一个四元组,其中02是10(第一个字节)>> 3,B2是READ RECORD,其他3个字节来自先前的响应。 但我总是得到6E 00的响应,表示不支持该类。 - Valerio Colonnese
考虑将10 02 04 01 18 01 01 00 20 01 01 00作为AFL,该AFL是GPO响应中返回的。 现在将其分成4-4字节的块。
  1. 10 02 04 01 - SFI 2记录2到4
  2. 18 01 01 00 - SFI 3仅记录1
  3. 20 01 01 00 - SFI 4仅记录1
因此,现在读取所有记录的读取记录命令如下:00 B2 02 14 00 读取SFI 2的第2个记录 00 B2 03 14 00 读取SFI 2的第2个记录 00 B2 04 14 00 读取SFI 2的第2个记录 00 B2 01 1C 00 读取SFI 3的唯一可用第1个记录 00 B2 01 24 00 读取SFI 3的唯一可用第1个记录
- Gaurav Shukla
请尝试一下并告诉我结果。 - Gaurav Shukla
谢谢@Gaurav_Orai,它很好用!!!也感谢Arjun的答案,标签5A是正确的! - Valerio Colonnese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接