使用不同SC系列探测智能卡:清除SC状态的命令

我希望从不同供应商,不同用途,不同APDU的一堆智能卡中读取一些基本信息。 例如:国家识别智能卡,EMV(支付),手机SIM,javacard等……

我写了一个Java应用程序。 让我用SC系列ABCDE和相同名称调用5个子程序,每个子程序都有正确的APDU来读取一个特定SC系列的基本信息。

不幸的是,我发布例程的顺序会影响成功的结果。

示例:使用子程序ABCDE,我可以读取ABCD类型的SC,而不是E.

如果我将执行顺序更改为EABCD,我可以读取E但现在我的C类型的SC失败了。

我理解:一些SC丢弃外国APDU ……其他SC“挂起”。

是否有基本命令来清理智能卡(和读卡器)的状态?

那么子程序的执行顺序不会改变输出?

复位B复位C复位D复位等…

是ATR吗? 它对每种SC都是强制性的吗?

您可以使用Card.disconnect()方法重置卡(请注意这一点 )。

但是(恕我直言)最好的方法是使用卡ATR(由Card.getATR()给出)来猜测正确的卡片系列(如果可能的话)。 这种方式也快得多。 我使用这种方法处理几种不同的非接触式卡产品的演示,并且它运行良好。


一些额外的(随机)笔记:

  • 研究所有家庭的文件 – 肯定必须有这种行为的原因。 尝试跳过一些子程序和/或它们的APDU命令来固定它。

  • 此外,一些APDU可能在意外发送时导致问题(例如,锁定的密码或锁定的认证尝试)。 你应该知道你在做什么。

  • 大多数产品系列都有一些可靠的检测方法 – 如果有的话,请参阅文档。

  • 如果任何先前调用的子例程使用SELECT来更改所选应用程序/文件并成功,则它将保持选中状态。 考虑在每个子例程的开头使用显式SELECT (例如,选择预期的AID或主文件)。

  • DESFire卡离开本机模式并在接收到非本机命令APDU时进入包装模式(这可能与您使用javax.smartcardio时通常的ISO包装命令不同)。

祝你好运!

您描述的行为听起来很奇怪,因为智能卡读卡器不应该在不同的智能卡之间保持状态。

但是,我不知道重启智能卡读卡器的任何通用命令。 例如HID OMNIKEY阅读器,您可以使用专有APDU FF 70 07 6B 08 A2 06 A1 04 A9 02 83 00 00重新启动(参见此处 [7.6.3],虽然本指南说它适用于OMNIKEY 5022阅读器,但它适用于许多人更多OMNIKEY读者)。 因此,对于您的读者,您将不得不研究类似的专有APDU的互联网。

请记住,读取器重启也很可能会导致USB读取器重新枚举。