我正在使用 WinSCard 读取符合 ISO 7816 的智能卡(具体地说,它是 PIV 卡)。该卡上有一张大约 12 KB 的图片。现在,我以 T=1 模式连接并使用 SCardTransmit 函数发送我的 GET DATA APDU 命令,然后是一堆 GET RESPONSE APDU 命令。我最终从卡上获取了所有数据,但需要 40 多次调用 SCardTransmit,因为每次调用只能获取 256 个字节。每个调用大约需要半秒才能完成,因此读取 12 KB 数据最终需要近 20 秒。

我想我可以更快地做到这一点。 NIST 规范规定“通过阅读器的接触界面检索 12.5 KB 数据的时间不得超过 2.0 秒”。该规范引用了扩展长度的 APDU,所以我认为它是受支持的,但它的使用没有记录。我试图弄清楚,但我无法让它工作。

这是当前命令,它返回 256 个字节,状态为 0x61 0x00,这意味着还有更多数据要获取。

new byte[] {
     0x00,               // CLA
     0xCB,               // INS
     0x3F,               // P1
     0xFF,               // P2
     0x05,               // Lc
     0x5C, 0x03,         // Data Field
     0x5F, 0xC1, 0x09,   // ... (Data)
     0x00                // Le
};

ISO-7815-4 规范的第 5.3.2 部分说的是关于编码 Le:



我认为这意味着我的命令应该是这样的:
new byte[] {
     0x00,               // CLA
     0xCB,               // INS
     0x3F,               // P1
     0xFF,               // P2
     0x00, 0x00, 0x05,   // Lc
     0x5C, 0x03,         // Data Field
     0x5F, 0xC1, 0x09,   // ... (Data)
     0x00, 0x00          // Le
};

但这不起作用。我得到响应代码 0x67 0x00,意思是“长度错误”并且没有从卡中检索到数据。想法?

最佳答案

您尝试发送的扩展 APDU 是正确的,但您的卡可能不支持扩展 APDU。卡上的 Java Card 版本应高于 2.2.2 才能发送此类命令。

关于windows - 如何在 Windows 智能卡框架中使用扩展 APDU,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5492843/

10-12 20:56