APDU命令中的持卡人姓名(ICC卡)

时间:2013-06-25 10:05:09

标签: credit-card smartcard apdu

我们正在从APDU命令中读取签证卡信息,这是我们发送的命令序列

1. 00A404000E315041592E5359532E444446303100
2. 00B2010C00

此时,我们知道我们可以发送Processing Command as     80A80000048302084000但它会给我们一个错误,因此我们跳过此命令并发送READ SFI 1记录。

00B2010C00

有了这个,我们可以获得卡号和过期日期,但我们无法获得持卡人的姓名。所以,如果有人知道发生了什么,请帮助我们。

1 个答案:

答案 0 :(得分:8)

在芯片上阅读持卡人姓名和其他信息& pin卡并不像你想象的那么简单。

它不像一个直接的APDU那么简单,你需要先完成几个步骤。

首先,您需要执行应用程序选择。

如何执行此操作,取决于您的卡和终端。

有两种标准方式。

  • 1)申请文件选择
  • 2)AID扫描

对于类型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代码来处理这些东西多年来,并且老实说,无论如何,我已经写了一篇博客文章已经超过一年了: - )