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

时间:2015-01-04 12:10:24

标签: smartcard javacard globalplatform jcop

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

Q1:我的卡的历史字节是什么/在哪里?我如何分析它们?

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。

我在互联网上搜索了很多,最后发现我需要一个用于预个性化程序的密钥( Transport-Key )。

让我分享一些知识!

预个性化程序如下(对于JCOP):

  1. ATR的要求
  2. 选择命令以选择Root Applet(Transport-Key是此applet的AID)
  3. 启动命令
  4. 尽可能多的Read,WRITE,ADMINEXEC,SB_NAT_APPLET_INSTRUCTION和AUTH命令
  5. PROTECT命令
  6. 加密命令
  7. 重置卡片。
  8. 在步骤4中,我们使用默认设置初始化IC(配置IC所需的生命周期,定义通信行为,ATR和/或ATS参数或预加载Applet)。

    顺便说一句, 我做了前两个步骤(1& 2),然后我重置了卡片,我试图再次列出applets:

    >> 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 命令!

    问题3:为什么外部身份验证失败?因为我没有设置SD键?

    我尝试使用 OpenSC Tool 选择此applet:

    >> 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..
    

    问题4:此输出的含义是什么?

    在下面,您还可以在 get-data 脚本之后看到 GP Shell 的输出:

    .:: 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
    
    .::
    

    问题5:此输出的含义是什么?我怎么分析它?

3 个答案:

答案 0 :(得分:7)

Q1:我的卡的历史字节是什么/在哪里?我如何分析它们?

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

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

A2:你不需要做任何事情,因为这个网站让你轻松一切:)恭喜,它认出你的卡!它是NXP JCOP v2.4.x

问题3:为什么外部身份验证失败?因为我没有设置SD密钥?

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

问题4:此输出的含义是什么?

A4:如果您想继续使用Java卡,阅读全球平台文档非常重要。在选择命令的响应消息中返回的数据字段在GP文档的第9.9.3.1节中说明。

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

6F 64 84 08 A0 00 00 01 51 00 00 00 A5 58 9F 65 od .. .... Q ....氙
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 ...高清... f ... + ...
01 2A 02 6E 01 02

标记6F:文件控制信息(FCI模板)[强制性] - &gt; 64

标记84:应用程序/文件AID [强制] - &gt; 08 A0 00 00 01 51 00 00 00

标记A5:专有数据[必填] - &gt; 58

标记9F65:命令消息中的最大数据长度字段[必填] - &gt; 01 FF

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

标记73:安全域管理数据[可选] - &gt; 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

问题5:此输出的含义是什么?我怎么分析它?

A5:检查此wiki for Global Platform以了解所有GP命令,然后自行分析输出

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

答案 1 :(得分:2)

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

在您的情况下,包含9个历史字节包含简单的ASCII文本&#39; JCOP242R3&#39;,这可能有助于您入门。

答案 2 :(得分:1)

答案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 **) 历史字节分析: ---根据ISO / IEC 7816-3格式字节T0中的位4到1(在您的ATR中,即 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?

是什么意思?