智能卡预个性化和历史字节

Smart Card Pre-Personalization and Historical Bytes

我有一张没有融合的智能卡(我的意思是它没有预先个性化)。它的 ATR=3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 32 52 33 A2.

Q1:What/where是我卡的历史字节?我该如何分析它们?

Q2:在哪里可以找到我的卡的型号?我在网上搜索了它的ATR,但是一无所获!

当您尝试使用诸如 GPJ 之类的工具列出真正空白卡(我的意思是未融合的卡)的小程序时,您会收到以下输出:

>> gpj -list

>> java -jar gpj.jar -list
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
Found card in terminal: ACS CCID USB Reader 0

ATR: 3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 32 52 33 A2

DEBUG: Command  APDU: 00 A4 04 00 07 A0 00 00 01 51 00 00
DEBUG: Response APDU: 6A 82
Failed to select Security Domain GP211 A0 00 00 01 51 00 00 , SW: 6A 82

DEBUG: Command  APDU: 00 A4 04 00 08 A0 00 00 00 18 43 4D 00
DEBUG: Response APDU: 6A 82
Failed to select Security Domain GemaltoXpressPro A0 00 00 00 18 43 4D 00 , SW:6A 82

DEBUG: Command  APDU: 00 A4 04 00 08 A0 00 00 00 03 00 00 00
DEBUG: Response APDU: 6A 82
Failed to select Security Domain OP201a A0 00 00 00 03 00 00 00 , SW: 6A 82

DEBUG: Command  APDU: 00 A4 04 00 07 A0 00 00 00 03 00 00
DEBUG: Response APDU: 6A 82
Failed to select Security Domain OP201b A0 00 00 00 03 00 00 , SW: 6A 82

net.sourceforge.gpj.cardservices.exceptions.GPSecurityDomainSelectionException:Could not select any of the known Security Domains!
at net.sourceforge.gpj.cardservices.GlobalPlatformService.open(Unknown Source)
at net.sourceforge.gpj.cardservices.GlobalPlatformService.main(Unknown Source)

以上输出意味着工具找不到任何 SC 到 select。

我在网上搜索了很多,最后发现我需要一个密钥(Transport-Key)用于Pre-Personalization程序。

让我分享一些知识!

预个性化流程如下(JCOP):

  1. 请求 ATR
  2. 选择命令到 select Root Applet(传输密钥是此 applet 的 AID)
  3. 引导命令
  4. 可以根据需要使用尽可能多的 Read、WRITE、ADMINEXEC、SB_NAT_APPLET_INSTRUCTION 和 AUTH 命令
  5. 保护命令
  6. 融合命令
  7. 重置卡片。

在第 4 步中,我们使用默认设置初始化 IC(配置 IC 所需的生命周期、定义通信行为、ATR and/or ATS 参数或预加载小程序)。

顺便说一句, 我执行了前两个步骤(1 和 2),然后我重置了卡并尝试再次列出小程序:

>> gpj -list

>> java -jar gpj.jar -list
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
Found card in terminal: ACS CCID USB Reader 0

ATR: 3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 32 52 33 A2

DEBUG: Command  APDU: 00 A4 04 00 07 A0 00 00 01 51 00 00
DEBUG: Response APDU: 6F 64 84 08 A0 00 00 01 51 00 00 00 A5 58 9F 65 01 FF 9F 6E 06 47 91 23 47 41 00 73 49 06 07 2A 86 48 86 FC 6B 01 60 0B 06 09 2A 86 48 86 FC 6B 02 02 02 63 09 06 07 2A 86 48 86 FC 6B 03 64 0B 06 09 2A 86 48 86 FC 6B 04 02 55 65 0B 06 09 2B 85 10 86 48 64 02 01 03 66 0C 06 0A 2B 06 01 04 01 2A 02 6E 01 02 90 00
Successfully selected Security Domain GP211 A0 00 00 01 51 00 00

DEBUG: Command  APDU: 80 50 00 00 08 E7 41 23 4E F5 3B EB E3
DEBUG: Response APDU: 00 00 41 98 00 17 14 97 42 48 FF 02 00 00 BA FF B1 51 C8 BD F1 69 59 8D 80 D6 72 66 90 00

javax.smartcardio.CardException: Card cryptogram invalid.at net.sourceforge.gpj.cardservices.GlobalPlatformService.openSecureChannel(Unknown Source)
at net.sourceforge.gpj.cardservices.GlobalPlatformService.main
(Unknown Source)

如您所见,出现了一个带有 AID=A0 00 00 01 51 00 00 的小程序。但是我无法成功执行 EXTERNAL AUTHENTCAT 命令!

Q3:为什么外部认证失败?因为我没有设置SD Keys?

我尝试使用 OpenSC 工具 select 这个小程序:

>> opensc-tool -s 00A4040007A0000001510000

Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 07 A0 00 00 01 51 00 00
Received (SW1=0x90, SW2=0x00):
6F 64 84 08 A0 00 00 01 51 00 00 00 A5 58 9F 65 od......Q....X.e
01 FF 9F 6E 06 47 91 23 47 41 00 73 49 06 07 2A ...n.G.#GA.sI..*
86 48 86 FC 6B 01 60 0B 06 09 2A 86 48 86 FC 6B .H..k.`...*.H..k
02 02 02 63 09 06 07 2A 86 48 86 FC 6B 03 64 0B ...c...*.H..k.d.
06 09 2A 86 48 86 FC 6B 04 02 55 65 0B 06 09 2B ..*.H..k..Ue...+
85 10 86 48 64 02 01 03 66 0C 06 0A 2B 06 01 04 ...Hd...f...+...
01 2A 02 6E 01 02                               .*.n..

Q4:这个输出是什么意思?

在下面你可以看到 GP Shellget-data 脚本之后的输出:

.:: gpshell get_data.txt

establish_context
enable_trace
enable_timer
card_connect
command time: 281 ms
get_data -identifier 9F7F
Command --> 80CA9F7F00
Wrapped command --> 80CA9F7F00
Response <-- 9F7F2A4790507547912347410041980017149742484812420500000000143E24303
137313400000000000000009000
9F7F2A4790507547912347410041980017149742484812420500000000143E243031373134000000
0000000000
command time: 62 ms
get_data -identifier 66
Command --> 80CA006600
Wrapped command --> 80CA006600
Response <-- 664B734906072A864886FC6B01600B06092A864886FC6B020202630906072A86488
6FC6B03640B06092A864886FC6B040255650B06092B8510864864020103660C060A2B060104012A0
26E01029000
664B734906072A864886FC6B01600B06092A864886FC6B020202630906072A864886FC6B03640B06
092A864886FC6B040255650B06092B8510864864020103660C060A2B060104012A026E0102
command time: 47 ms
card_disconnect
command time: 141 ms
release_context
command time: 0 ms

.::

Q5:这个输出是什么意思?我该如何分析它?

ATR 主要用于与 reader 建立通信。虽然可以通过经验和大量比较数据对这些信息进行一些映射,但这并不能保证。 ISO 7816-3 描述了 ATR 的编码,其中可能还包含一些 历史字节 (未被 reader 评估,因此通常用于简单的可检索标识)。

在您的案例中,包含 9 个历史字节,包含简单的 ASCII 文本 'JCOP242R3',这可能有助于您入门。

Q1:What/where是我卡的历史字节?我该如何分析它们?

A1: 您可以在this site中输入一个ATR,它会为您解析。基于此,您卡的历史字节为 4A 43 4F 50 32 34 32 52 33

Q2:在哪里可以找到我的卡的型号?我在网上搜索了它的ATR,但是一无所获!

A2: 你不需要做任何事情,因为这个网站让一切变得简单:) 恭喜,它识别了你的卡! NXP JCOP v2.4.x.

Q3:为什么外部认证失败?因为我没有设置SD Keys?

A3:错误是Card cryptogram invalid。从卡端和 gpj 端使用的密钥似乎不同。您需要知道卡中设置了哪些键并为 gpj 设置相同。

Q4:这个输出是什么意思?

A4: 如果您想继续使用 Java 卡片,请务必阅读全球平台文档。 select命令的响应报文中返回的数据字段在GP文档9.9.3.1节有解释。

根据您的结果,我将每个部分分开,然后在下面列出每个标签。请注意,加粗的十六进制字节是标签。

6F 64 84 08 A0 00 00 01 51 00 00 00 A5 58 9F 65 od......Q....X.e
01 FF 9F 6E 06 47 91 23 47 41 00 73 49 06 07 2A ...n.G.#GA.sI..*
86 48 86 FC 6B 01 60 0B 06 09 2A 86 48 86 FC 6B.H..k.`....H..k
02 02 02 63 09 06 07 2A 86 48 86 FC 6B 03 64 0B ...c...
.H..k.d.
06 09 2A 86 48 86 FC 6B 04 02 55 65 0B 06 09 2B ..*.H..k..Ue...+
85 10 86 48 64 02 01 03 66 0C 06 0A 2B 06 01 04 ...HD...f...+...
01 2A 02 6E 01 02

标签6F:文件控制信息(FCI模板)[强制]--> 64

标签 84: Application/File AID [强制] --> 08 A0 00 00 01 51 00 00 00

标签A5:专有数据[强制]--> 58

Tag 9F65:命令消息中数据字段的最大长度[强制]--> 01 FF

标签9F6E:应用生产生命周期数据[可选]--> 06 47 91 23 47 41 00

标签73:安全域管理数据[可选]--> 49 06 07 2A 86 48 86 FC 6B 01 60 0B 06 09 2A 86 48 86 FC 6B 02 02 02 63 09 06 07 2A 86 48 86 FC 6B 03 64 0B 06 09 2A 86 48 86 FC 6B 04 02 55 65 0B 06 09 2B 85 10 86 48 64 02 01 03 66 0C 02 0A 06A 2B 02 06 0A 2B 01 02

Q5:这个输出是什么意思?我该如何分析它?

A5:勾选这个wiki for Global Platform为了学习所有GP命令然后自己分析输出

最后请永远不要再问这么长的问题 :( 请打破部分并将每个部分作为一个单独的问题提出,谢谢 :)

答案1:根据你的卡ATR(3B F9 13 00 00 81 31 FE 45 4A 43 4F 50 32 34 32 52 33 A2)你的历史字节是**( 4A 43 4F 50 32 34 32 52 33**) Historical bytes analysing:---根据ISO/IEC 7816-3 Bit 4 to 1 in Format byte T0(in your ATR ie F9) 告诉可用的历史字节数,即总共 9 个历史字节可用。

您的 ATR 描述如下

TS = 0x3B   Direct Convention
T0 = 0xF9   Y(1): b1111, K: 9 (historical bytes)
TA(1) = 0x13    Fi=372, Di=4, 93 cycles/ETU (43010 bits/s at 4.00 MHz, 53763 bits/s for fMax=5 MHz)
TB(1) = 0x00    VPP is not electrically connected
TC(1) = 0x00    Extra guard time: 0
TD(1) = 0x81    Y(i+1) = b1000, Protocol T=1
----
TD(2) = 0x31    Y(i+1) = b0011, Protocol T=1
----
TA(3) = 0xFE    IFSC: 254
TB(3) = 0x45    Block Waiting Integer: 4 - Character Waiting Integer: 5
----
Historical bytes    4A 43 4F 50 32 34 32 52 33
Category indicator byte: 0x4A   (proprietary format) "JCOP242R3"
TCK = 0xA2  correct checksum

回答2:卡片模式l是什么意思?