java - SmartCardIO EMV 读卡器,仅通过 ATR 编号查找我的卡类型

标签 java smartcard emv

我正在开始一个新项目,我是使用 EMV 阅读器和 Javax SmartCardIO 的新手。

我有每种卡的 RID 列表,但是在不知道卡类型的情况下我唯一可以访问的是 ATR,我想知道是否有办法获取 RID 或卡类型仅此信息,欢迎任何帮助。

提前致谢!

编辑:

我尝试用这种方法执行 select PSE 命令:

public static byte[] selectPSE(CardChannel channel) throws CardException {
    byte[] selectPSE = {(byte)0x00, (byte)0xA4, (byte)0x04, (byte)0x00, (byte)0x0E, (byte)0x31, (byte)0x50, (byte)0x41, (byte)0x59, (byte)0x2E, (byte)0x53, (byte)0x59, (byte)0x53, (byte)0x2E, (byte)0x44, (byte)0x44, (byte)0x46, (byte)0x30, (byte)0x31};
    CommandAPDU command = new CommandAPDU(selectPSE);
    ResponseAPDU response = channel.transmit(command);
    System.out.println(response.getBytes());
    return response.getBytes();
}

但是,它只适用于 AMEX 和 Visa,我在使用两张万事达卡(信用卡和借记卡)时遇到错误 6a82。

这看起来很奇怪,据我所知,所有主要的发卡机构(包括万事达卡)都使用 1PAY.SYS.DDF01,我可以通过 AID 的尝试和错误获得我想要的信息,但我不认为这是是最好的解决方案。

最佳答案

AID(应用程序 ID)= RID(已注册的应用程序 ID)|| PIX(属性(property)申请扩展)

识别卡上安装了哪些应用程序的最佳方法是选择PSE。详细说明在EMV Book 1, 12 Application Selection, 12.3.2 Using the PSE .

您可以在图 17 中找到完整算法:使用目录的终端逻辑。

快速算法:

1) 命令选择 PSE 或 PPSE。

  Send: 00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00

  Responce will will contain:
   '6F' FCI Template M
      '84' DF Name M
      'A5' FCI Proprietary Template M
        '88' SFI of the Directory Elementary File M
        '5F2D' Language Preference O
        '9F11' Issuer Code Table Index O
        'BF0C' FCI Issuer Discretionary Data O

在这里您可以找到 PSE 的 SFI

2) 命令ReadRecord 1 SFI X

 Send: 00 B2 01 0C 00

  Receive list of tag. 
   '70' Application Elementary File (AEF) Data Template                
      '61' Application Template                                           
        '70' Application Elementary File (AEF) Data Template                
          '61' Application Template                                           
            '4F' Application Identifier (AID)
            '50' Application Label
            ...  and so on

在此处查找标记“4F” 应用程序标识符 (AID)。您可以从中提取和比较 RID。

你还可以:

1) 获取自己的AID列表,依次从中选择应用。

2) 选择默认或下一个应用程序并从响应中获取 AID。

关于java - SmartCardIO EMV 读卡器,仅通过 ATR 编号查找我的卡类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297722/

相关文章:

java - 如何将java连接到网站/虚拟主机数据库

java - 包含 List 的 Spring 绑定(bind)映射

java - 获取 Int 中的 Float 部分

.net - 如何在 .Net 中使用 PKCS #1 v1.5 编码数据

smartcard - 通过 SFI 选择智能卡上的 EF

apdu - 通过PDOL为EMV卡(APDU)生成 "GET PROCESSING OPTIONS"(GPO)

android - 解析 CVM 列表 : when to show pin pad after getting CVM list in SFI, 需要任何命令

java - UnsatisfiedLinkError 用 SWIG 包装 C++ DLL 以允许 Java 开发人员使用它

ssh - Debian 上的 GPG key 转发

c# - 解码 EMV TLV 数据