如何读取基于EMV技术的智能VISA卡信息

15
我试图从VISA信用卡读取数据,但无法成功。在互联网资源中,我发现对于MASTER卡,我们可以使用1PAY.SYS.DDF01文件选择PSE目录,然后读取记录。但是对于VISA来说并不是强制性的,当我使用以下文件使用SELECT命令获取PSE目录时,我得到的响应是“6A82”。这意味着该文件系统不支持它。我在EMV 4.2 Book 1(EMV规范)中寻找错误,它说我们必须使用“应用标识符列表”。它说:“终端使用其列表中的下一个AID发出另一个SELECT命令。”
我无法理解这个过程并进一步操作。请问如何获取VISA卡的PSE或AID以获取信用卡详细信息?
谢谢, Shekhar
5个回答

6
首先,PPSE applet不仅仅是为VISA或MasterCard定义的特定内容。它是由EMV定义的,正如你所正确注意到的那样,它用于列出可用支付应用程序的AID。但如果它不存在,则终端会尝试所有支持的AID来构建候选列表。
如果您想选择VISA applet,但您不知道完整的AID,则可以使用部分选择。由于所有VISA AID均以VISA的RID:A0 00 00 00 03开头。您可以尝试发送此命令:
这将返回第一个实例: 00 A4 04 00 05 A0 00 00 00 03 00
如果您在卡上有更多,则会给您更多: 00 A4 04 02 05 A0 00 00 00 03 00

@KamKamen Goranchev,你知道上述命令的响应APDU应该是什么吗? - nish1013
1
如果存在具有给定RID的应用程序,则响应将是状态字61XX。如果是这样,请使用GET RESPONSE命令检索完整的AID。 - David

3
所以问题是你不知道卡上应用程序的AID?除了PSE之外,没有获取它们的方法,你必须首先知道卡上支持哪些应用程序。因此,“AID列表”是你支持的AID列表,这是由你的收单方告诉你的。你可以尝试根据一些标准AID自己创建这个列表,这些标准AID在这里列出:http://en.wikipedia.org/wiki/EMV#Application_selection

1

这对我来说有点奇怪...我的研究表明,对于VISA卡,该应用程序将始终可用,但对于Mastercard卡,它并非强制性的...

无论如何,这是我发送给我的读卡器以选择该应用程序的命令:

//               OP CL P1 P2 LN DATA------------------------------------- EL
//select command 00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00

NSString* str= @"1PAY.SYS.DDF01";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
int datalength = data.length; 
NSMutableData *selectPSECommand = [[NSMutableData alloc] init];

[selectPSECommand appendBytes:"\x00" length:1]; //command class
[selectPSECommand appendBytes:"\xA4" length:1]; //APDU_INSTRUCTION_SELECT_FILE
[selectPSECommand appendBytes:"\x04" length:1]; //select file by name
[selectPSECommand appendBytes:"\x00" length:1]; //First or only occurrence of file
[selectPSECommand appendBytes:&datalength length:1]; //data length
[selectPSECommand appendData:data]; //the data we are sending
[selectPSECommand appendBytes:"\x00" length:1]; //expected response length. here it is 0. We are only selecting a file.

这段代码示例是针对Objective C的。

请将您发送的数据与我发送的数据进行比较,看看它们是否相符。同时,我会继续查看AID列表。

希望能有所帮助。 Ezfrag


0

您可以使用类似this one的AID列表。但是,当遍历列表时,某些卡片会响应“错误”的数据。例如,我曾经遇到过V-Pay VISA卡被读取为Maestro的情况。如果您必须遍历一个大的AID列表来“打开”卡片信息,我建议您添加一个标志以从卡片获取实际的AID,然后返回主方法以使用提供的主AID读取卡片。

像这样:

  1. 通过AID列表读取卡片
  2. 如果返回0x90(成功读取),提取数据
  3. 检查返回的数据是否为AID类型(0x4f)。
  4. 如果是,则清除列表并使用正确的AID再次获取数据,因为您现在知道它是正确的,因为它直接来自卡片。

由于AID通常出现在卡片的第一条记录中,因此该循环确保了最小时间成本下的正确处理过程。


0

当您使用1PAY.SYS.DDF01第一个命令时,卡片将响应内部的2个AID列表,其中第一个存在一些错误,因此您会收到带有返回代码RETRY的6A82错误。您必须在ENRTY Libs中使用一些删除命令,然后再次设置应用程序选择命令,这样它就会自动获取第二个AID,然后您的Visa卡就会成功。


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