APDU命令使用Samsung Galaxy S4从Visa Wave NFC签证中读取信用卡数据

时间:2014-07-08 11:46:32

标签: android nfc apdu contactless-smartcard emv

  byte[] APDUCommand = { 
            (byte) 0x00, // CLA Class           
            (byte) 0xA4, // INS Instruction     
            (byte) 0x04, // P1  Parameter 1
            (byte) 0x00, // P2  Parameter 2
            (byte) 0x0A, // Length
            0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID
        };


    Intent intent = getIntent();
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    IsoDep iso = IsoDep.get(tag);        
    iso.connect();

    byte[] result = iso.transceive(APDUCommand);

我使用上述代码使用samsung galaxy s4阅读VisaPayWave NFC卡详细信息(持卡人姓名,有效期,卡号等)。我得到的输出是[106,-126]。我认为我使用的APDU命令不正确。请建议正确的命令。

3 个答案:

答案 0 :(得分:2)

更改您的APDU命令定义

byte[] APDUCommand = { 
        (byte) 0x00, // CLA Class           
        (byte) 0xA4, // INS Instruction     
        (byte) 0x04, // P1  Parameter 1
        (byte) 0x00, // P2  Parameter 2
        (byte) 0x07, // Length
        (byte) 0xA0,0x00,0x00,0x00,0x03,0x10,0x10 // AID
    };

答案 1 :(得分:1)

lletami所述,Visa payWave通常可以使用AID A0000000031010进行选择。所以你可以使用APDU

00 A4 04 00 07 A0000000031010 00

选择payWave应用程序。

在非接触式EMV支付卡上,您还可以选择PPSE(邻近支付系统环境)来检索可用应用程序列表(及其AID):

00 A4 04 00 0E 325041592E5359532E4444463031 00

选择EMV支付应用程序只是第一步。您需要发出几个其他命令才能获得可读的信用卡数据(请参阅this answer)。

例如,您可以发出GET PROCESSING OPTIONS命令(例如this answerthis answerthis answer)。

和/或您可以发出READ RECORD命令以从已知的基本文件中获取数据。 E.g。

00 B2 01 0C 00

阅读EF 1的记录1,

00 B2 02 0C 00

读取EF 1的记录2,或

00 B2 01 14 00

阅读EF 2等的记录1

您可以从http://www.emvco.com/获取付款系统的EMV规范,以了解可能的命令和数据结构。

答案 2 :(得分:0)

您的回复代码[106,-126]更好地表示为十六进制,而不是暗示任何有符号值。

实际上它将是6A82 - 它形成APDU响应代码的SW1和SW2。 6A82对应于“错误的参数P1 P2;未找到文件”。有关详细信息,请参阅EMV Book 1。即卡上找不到“0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31” - 但“0xA0,0x00,0x00,0x00,0x03,0x10,0x10”应为。

正如lletami所说,你的APDU命令需要重建,包括使用'压缩数字'的AID(如EMV第1册中所述),非常类似于二进制编码的十进制。