使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器

Posted

技术标签:

【中文标题】使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器【英文标题】:Sending APDU commands to Write Data to a smartCard Reader using java smartcardio functions 【发布时间】:2020-08-19 05:00:46 【问题描述】:

我正在尝试使用 java smartcardIO 函数将数据写入 HID Omnikey 5122 设备中的非接触式卡。

我需要插入卡片的数据是00 01 02 03

我试图通过 channel.transmit 函数发送的 APDU 命令是 FF D6 00 04 04 00 01 02 03 其中:

FF 是 CLS D6 是 INS 00 是 P1 04 是 P2 04 是要更新的字节数 00 01 02 03 是我需要插入的数据。

我无法通过以下函数正确构建 APDU 命令。有人可以帮我弄这个吗。我正在使用 java smartcardio 库中提供的函数。

ResponseAPDU respApdu = channel.transmit(           
                          new CommandAPDU(0xFF,0xD6,0x00,0x04,0x04,
                                          new byte[] (byte) 0x00, 
                                          (byte) 0x01, 
                                          (byte)0x02,
                                          (byte)0x03));

我收到语法错误,例如构造函数命令的参数无效。

【问题讨论】:

欢迎来到 Stack Overflow。您能否将堆栈跟踪的错误消息粘贴给我们?还有一个完整的minimal, reproducible example 将帮助用户追踪您的问题。感谢您的合作! 【参考方案1】:

您似乎正在尝试发送 UPDATE BINARY APDU 来更新偏移量 4 处的透明文件(这是您在 P1-P2 中提供的)。您必须使用 00h 的 CLA 字节(如果该文件操作不需要使用安全消息传递)。 由于 P1-P2 在您的情况下没有指定短文件标识符,因此您当前选择的文件具有

与 READ/UPDATE BINARY 命令兼容 文件大小 >=9 byres。

【讨论】:

您能否告诉我,如何在下面的 APDU 调用中添加 00h 的 CLA 字节的信息。 ResponseAPDU respApdu = channel.transmit(new CommandAPDU(0xFF,0xD6,0x00,0x04,0x04, new byte[] (byte) 0x00, (byte) 0x01, (byte)0x02, (byte)0x03));跨度> 对不起 Suni,我把缩写弄混了。我使用 CLA 与 CLS 同义。 (0x00, 0xD6, ...)

以上是关于使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器的主要内容,如果未能解决你的问题,请参考以下文章

使用 smartcardio 签署文件

使用 javax.smartcardio 时 DESfire EV1 为 PPS 命令包装 APDU 的问题

如何使用 smartcardio 和 Java 控制 ACR122 上的 LED?

带有 Java 9 和 ClassPath 的 javax.smartcardio

如何在 Android 上使用 javax.smartcardio 包?

在 Android 上使用 javax.smartcardio 包?