0

有人可以告诉我如何使用 java 卡在智能卡中写入数据吗?我有这个代码我正在使用 java card 2.2

private void writeName(APDU apdu) throws ISOException
{ 
    apdu.setIncomingAndReceive();
    byte[] apduBuffer = apdu.getBuffer();

    byte j = (byte)apduBuffer[4];

    userName = new byte[j];
    for (byte i=0; i<j; i++)
    {
        userName[(byte)i] = (byte)apduBuffer[5+i];
    }
}
4

1 回答 1

1

如果您使用 JCOP 插件开发 Applet,您可以在 bin/ 目录中看到每个包的 .CAP 文件。现在您需要按依赖顺序安装每个包。假设您的应用程序由包 A、B 和 C 组成,而您的 applet 在 C 包中。B进口A,C进口B。

您需要安装软件包的顺序是 A、B、C。使用 JCOP,这可以通过以下方式完成:

cm> install <pkgAID> package.cap

为这三个包完成此操作后,您将需要安装小程序。这可以通过以下方式实现:

cm> install -q <install params> <pkgAID> <AppletAID> packageC.cap

完成此操作后,您将看到小程序处于 SELECTABLE 状态。您的 JCOP shell 控制台如下所示:

Card Manager AID   :  A000000003000000
Card Manager state :  SECURED

    Application:  SELECTABLE (--------) A00000008710015553
    Application:  SELECTABLE (--------) "2PAY.SYS.DDF01"
    Application:  SELECTABLE (--------) A0004D6946617265
    Application:  SELECTABLE (--------) A0000000041010  

所有那些“模块”(库)的包都显示如下:

    Load File  :      LOADED (--------) A0000002994E6F53
     Module    :                        A0000002994E6F53656C656374
    Load File  :      LOADED (--------) A0000002990410  
     Module    :                        A00000029904101045

现在可以选择所有这些小程序 ini SELECTABLE 状态并与之交互。如果您想使用 A00000008710015553 向 Applet 发送数据,您需要先选择它。交互如下所示:

cm>  /select A00000008710015553
 => 00 A4 04 00 09 A0 00 00 00 87 10 01 55 53 00       ............US.
 (5273 usec)
 <= 90 00                                              ..
Status: No Error

现在,您可以使用 send 命令向上述 Applet 发送数据:

cm>  /send 00200000043131313100
 => 00 20 00 00 04 31 31 31 31 00                      . ...1111.
 (34423 usec)
 <= 90 00                                              ..
Status: No Error

这些都是标准的 GP 命令。我假设您使用的是符合 GP 标准的卡;不过,您对此一无所知。

我个人认为,在深入研究之前,您需要通读一下 JC Runtime Environment 和 JC VM 的工作原理,以及它与 API 和一些 GP 规范的关系。

于 2011-11-27T06:53:45.580 回答