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

标签 smartcard javacard globalplatform jcop

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

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

问题2:在哪里可以找到我的卡的型号?我在网上搜索了它的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 可供选择。

我在互联网上搜索了很多,最后发现我需要一个 key (Transport-Key)来进行预个性化过程。

让我分享一些知识!

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

  1. ATR 请求
  2. 选择命令以选择根小程序(Transport-Key 是该小程序的 AID)
  3. 启动命令
  4. 可以根据需要执行任意数量的 Read、WRITE、ADMINEXEC、SB_NAT_APPLET_INSTRUCTION 和 AUTH 命令
  5. 保护命令
  6. 融合命令
  7. 重置卡。

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

顺便说一句, 我执行了前两个步骤(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命令!

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

我尝试使用OpenSC Tool选择此小程序:

>> 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:这个输出的含义是什么?

在下面您还可以看到 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

.::

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

最佳答案

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

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

问题2:在哪里可以找到我的卡的型号?我在网上搜索了它的ATR,但没有找到!

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

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

A3:错误是卡密码无效。看来卡侧和 gpj 侧使用的 key 是不同的。您需要知道卡中设置了哪些 key ,并为 gpj 设置相同的 key 。

Q4:这个输出的含义是什么?

A4:如果您想继续从事 Java Cards 工作,阅读 Global 平台文档非常重要。 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:应用程序/文件 AID [强制] --> 08 A0 00 00 01 51 00 00 00

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

标签 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 06 0A 2B 06 01 04 01 2A 02 6E 01 02

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

A5:检查这个wiki for Global Platform以便学习所有 GP 命令,然后自己分析输出

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

关于smartcard - 智能卡预个性化和历史字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27765335/

相关文章:

authentication - Mifare 认证

Java HttpClient 使用智能卡进行身份验证

java - 从智能卡读取数据(CNS/CNR)

javacard - 能否跨安全域访问 Java Card 可共享接口(interface)?

nfc - pcsc-lite 和 libnfc 的区别

android - Android 上是否有 javax.smartcardio 类似物?

java - 如何在 Java Card 中使用 Sim Toolkit 的 url 启动浏览器

java - 如何从自定义 Java 桌面应用程序启动 NXP 产品 JCOPShell (jcshell.bat)

javacard - 为什么我不能从我的 JavaCard 中删除未使用的包?

java - ACR122U - 传输 APDU 时出现 InvalidDeviceStateException