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