java - 如何使用java卡向智能卡写入数据?举例说明

标签 java byte smartcard javacard apdu

有人可以告诉我如何使用java卡向智能卡写入数据吗? 我有这个代码 我正在使用java卡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];
    }
}

最佳答案

如果您使用 JCOP 插件来开发 Applet,您可以在 bin/目录中看到每个包的 .CAP 文件。现在您需要按照依赖关系的顺序安装每个包。假设您的应用程序由包 A、B 和 C 组成,而您的小程序位于 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

现在可以选择所有处于 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

现在,您可以使用发送命令向上述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 运行时环境和 JC VM 的工作原理以及它与 API 和一些 GP 规范的关系。

关于java - 如何使用java卡向智能卡写入数据?举例说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8283869/

相关文章:

windows - Windows 中智能卡通信的建立

stream - 计算出字节内容

java - 使用 Java 将十六进制转储的字符串表示形式转换为字节数组?

java - JVM以编程方式获取堆中最大的对象

java - Spring Batch FlatFileItemWriter 仅在第二次运行后处理数据

.net - 如何在 .NET 中将自定义类型保存为二进制数据?

smartcard - 编码用于验证 PIN 的 APDU 命令时出现问题

rsa - 如何重用现有私钥以使用智能卡和 PKCS#11 生成数字签名

java - XMLStreamReader 问题

java - 作为参数传递的类/Activity 实例在将其分配给类范围变量并使用它时为空