正在解密来自 iPhone6 的 APDU 响应

Decrypting APDU response from iPhone6

我在 android phone,

中从 android 应用程序传输了以下 APDU 命令

send: 00 A4 04 00 07 A0 00 00 00 03 10 10 00

通过 NFC 发送给 iPhone 6 并得到以下响应,

resp: 6F 39 84 07 A0 00 00 00 03 10 10 A5 2E 9F 38 1B 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 4E 14 BF 0C 0D 9F 4D 02 14 01 9F 5A 05 11 08 40 08 40 90 00

现在,我一直在尝试使用各种来源对此进行解密,但令人困惑的部分是了解这是 PKPaymenttoken 数据(我们在 apple pay 响应中收到)还是只是加密的卡数据来自iPhone6.

的存折

我将这个结果与我从 PassKit-框架-> paymentAuthorizationViewController 方法-> payment.token 字符串得到的响应进行了比较,两者完全不同。所以我想这不是对 Apple Pay 的象征性回应。我担心的是,

  1. 这是加密卡数据本身吗?可以直接解密得到卡的详细信息吗? (毕竟,Apple会轻易给出卡的详细信息吗?)

  2. 我的最终要求是在 Android phone 中接受来自 iPhone6 的 NFC 付款。那么我的 APDU 请求是否是从 iPhone6 (Passbook) 获取卡数据的正确请求?

如有任何想法,我们将不胜感激。谢谢。

它不是加密数据,它只是 FCI 信息

您发送的APDU:
00 A4 04 00 07 A0 00 00 00 03 10 10 00.
P1=0x04 表示您正在通过 DF 名称选择 MF,P2=0x00 表示 returns FCI 信息。

你的回复6F 39 84 07 A0 00 00 00 03 10 10 A5 2E 9F 38 1B 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 4E 14 BF 0C 0D 9F 4D 02 14 01 9F 5A 05 11 08 40 08 40 90 00

您的回复说明如下:
6F->其FCI模板(即一组控制参数和管理数据)。
39->6F标签长度,这些字节是6F标签数据 84 07 A0 00 00 00 03 10 10 A5 2E 9F 38 1B 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 4E 14 BF 0C 0D 9F 4D 02 14 01 9F 5A 05 11 08 40 08 40 90 00
84 表示 DF 名称的标签
07 是长度
A0 00 00 00 03 10 10 个数据值即 DF 名称
A5 是以 BER-TLV
编码的专有信息标签 2E 是长度
9F 38 1B 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 4E 14 BF 0C 0D 9F 4D 02 14 01 9F 5A 08 0 40-11> 0 A5 标签值

这是加密卡数据本身吗?可以直接解密得到卡的详细信息吗?

没有也没有。正如 Anand 在他们的回答中正确指出的那样,这是响应您的 SELECT(通过 AID/DF 名称)命令返回的 FCI 模板与状态字 9000(表示成功)。

FCI 模板是遵循基本编码规则 (BER) 的 TLV(标签长度值)编码数据结构。所以你的 FCI

6F 39 84 07 A0 00 00 00 03 10 10 A5 2E 9F 38 1B 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 4E 14 BF 0C 0D 9F 4D 02 14 01 9F 5A 05 11 08 40 08 40

解码为(参见 http://www.emvlab.org/tlvutils/):

6F [39]   File Control Information (FCI) Template
    84 [07]   Dedicated File (DF) Name
        A0000000031010    (full AID of the application that you just selected)
    A5 [2E]   File Control Information (FCI) Proprietary Template
        9F38 [1B]   Processing Options Data Object List (PDOL)
            9F66 04
            9F02 06
            9F03 06
            9F1A 02
            95 05
            5F2A 02
            9A 03
            9C 01
            9F37 04
            9F4E 14
    BF0C [0D]   File Control Information (FCI) Issuer Discretionary Data
        9F4D [02]   Log Entry
            1401    (Transaction log file with at most 1 record is available at SFI 0x14)
        9F5A [05]   Application Program Identifier (Program ID)
            1108400840

我的最终要求是接受付款[...]。那么我的 APDU 请求是否是从 iPhone6 获取卡数据的正确请求?

部分是的。选择应用程序后,您将需要执行 EMV 支付交易(遵循非接触式支付系统的 EMV 规范,您可以从 http://www.emvco.com/ 获得)。但是,请注意,这并不像获得一些 "card data" 那么容易。您将需要从非接触式 "card"(即 iPhone)检索一些静态卡数据。此外,您还需要让 iPhone 生成一些动态交易 cryptogram/transaction 授权码。然后您可以使用此数据来清除交易。

我尝试借助这个 link

https://github.com/devnied/EMV-NFC-Paycard-Enrollment

确实有效。它直接从 iPhone 中给出设备帐号。无需解密即可获取此设备帐号。

如何使用这个库

this 下载库 link

使用下面的代码

IProvider prov = new YourProvider();
// Create parser (true for contactless false otherwise)
EMVParser parser = new EMVParser(prov, true);
// Read card
EMVCard card = parser.readEmvCard();

您将在 card 对象中获得卡的详细信息。

回答你的两大问题

  1. 这只是对APDU命令的响应,如果你使用我提到的库,你将通过任何网关直接获取支付所需的卡详细信息。

  2. 第一个答案也是你第二个问题的答案,你可以使用图书馆从 android phone 中阅读 iphone 6。所以只需两步集成图书馆 - >获取卡详细信息 - >转发到支付网关。通过这种方法,您不需要将任何私钥发送到网关,只需像正常的卡支付处理一样发送卡的详细信息。