读取芯片和密码卡上的持卡人姓名和其他信息并不像您想象的那么简单。
它并不像一个简单的 APDU 那样简单,您还需要先完成几个步骤。
首先,您需要执行应用程序选择。
你如何做到这一点,取决于你的卡和你的终端。
有两种标准方式。
对于类型 1,您通常使用选择文件 apdu 调用已知文件名
(注意:我不会在我在这里输入的内容中实现完整的 apdu 句子,因为要尝试和表示的数据太多,如果对这篇文章有足够的关注,那么我可能会写一篇博客文章)
对于大多数 EMV 标准卡,要选择的文件名是“1PAY.SYS.DDF01”或非接触式卡的“2PAY.SYS.DDF01”。
第二种方法涉及保留 AID(应用程序标识符)列表,然后您尝试依次读取该列表,直到您获得一个或多个积极结果。艾滋病是那些看起来像这样的数字:
A00000002501
A0000000031010
A0000000041010
上面 3 个是“amex”、“visa”和万事达卡的部分匹配,都是信用卡。
信用卡/借记卡/忠诚度都有自己的 AID,网上也有非官方的列表可用,但一般来说,要获得最终列表,您需要掏出一些现金并联系全球金融服务机构购买它。
一旦您执行了应用程序选择并从中获取数据,告诉您卡上有什么,您就需要使用返回的内容来读取卡文件标识符。
解码您返回的数据并提取 SFI(短文件标识符),这将告诉您要读取的包含实际应用程序列表的文件的短 ID。
应用程序列表将是一个条目列表,每个条目都遵循相同的基本 BER-TLV(标签长度值)对象,并包含首选语言、AID(如 AID 选择中所述)和一些其他位。
一旦你有了你的申请清单,从每个申请条目中读取目录基本文件,密切关注优先级,优先级告诉你应该将哪个申请结构视为最重要的,例如在我的英国签证借记卡上,我有 2应用程序。
一种用于我的银行自己的私人网络,另一种用于英国和欧洲的“LINK”网络。如果我在我自己的银行自动取款机上使用我的卡,那么他们的应用程序具有优先权,但如果我在其他任何地方使用它,则“LINK”具有优先权。
一旦达到这一点,您就有了一个活动的 AID(来自应用程序选择列表,或者通过扫描您感兴趣的有效 AID 列表),现在是时候执行“最终选择”了
选择具有您选择的 AID 的文件,然后一旦完成,您需要使用 TLV 对象中返回的数据进行该选择以执行 GPO 调用(获取处理选项)
执行此 GPO 调用,这将返回更多 BER-TLV 数据。
制作 GPO 告诉卡您已准备好开始交易,从 GPO 调用返回的数据随后用于使用 PDOL 数据构建“PDOL”(处理数据对象列表),您现在可以提取 AIP 和 AFL (抱歉,不记得那些代表什么 :-))最后,它为我们提供了能够读取 ADS(应用程序数据结构)的短文件标识符
拥有 ADS 后,您不仅拥有持卡人姓名,还拥有 PAN、到期日、发卡机构可自由支配的数据、服务代码、X509 公共证书和大量其他信息。
然而,正如我之前提到的,要真正记录确切的 APDU 流和对各种 TLV 对象的解码分析,我需要使这篇文章长约 20 页!
然而,多年来,我已经编写了几段 .NET 代码来处理这些东西,老实说,无论如何,我一直想写一篇关于它的博客文章已经一年多了 :-)