编写验证PIN的APDU命令时出现问题

3

我正在尝试使用javax.smartcardio API发送一个验证(pin)命令。我的Pin码是12345678。

根据我在网上找到的一些示例,我尝试使用以下APDU:

00 20 00 83 08 01 02 03 04 05 06 07 08

但结果是:69 84 (参考数据无效)
我也尝试过以下方法:
00 20 00 83 08 12 34 56 78

但我仍然收到相同的错误。
根据我的SmartCart规格,该卡支持:
- ISO 7816智能卡类型A、B和C(5V,3V,1.8V) - 兼容通信协议T=0、T=1 - 支持PPS(协议和参数选择)
我有些绝望,因为我找不到出路。你能建议我对我的APDU进行一些更改或者采用完全不同的方法(另一个库或语言来连接我的智能卡)吗?

将“invalidated”更改为“invalid”,并进行了一些格式调整。该卡规范非常通用,本身并没有说明如何处理PIN,除了它可能会使用VERIFY命令。第五个字节是命令数据(PIN)的长度,因此您的第二次尝试显然是无效的。 - Maarten Bodewes
1个回答

7

由于您的卡是ISO 7816标准,请参考以下链接的6.12章节中的APDU。

您需要做的是:

  1. 检查所使用的参考数据(P2)。对于PIN码,通常为“01”或“81”。但是,请再次确认正确的代码来自于您的卡供应商。
  2. 在执行实际的VERIFY命令之前,请先尝试获取剩余尝试次数。这将有助于您避免锁定PIN码,因为每次错误验证都会减少您的剩余尝试次数。可以通过设置Lc ='00'并删除命令数据来完成此操作。响应为SW1 ='63'和SW2 ='CX',其中X表示剩余尝试次数。APDU命令示例:00 20 00 81 00
  3. 您需要将您的PIN码转换为ASCII十六进制字节。因此,如果您的PIN码为12345678,则APDU为00 20 00 81 08 31 32 33 34 35 36 37 38

感谢您的回复。我发现发送00 20 00 83 00会产生结果“63 CF”,并返回字符串“非易失性存储器已更改”。看起来进展了一步。然而,尝试使用00 20 00 83 08 31 32 33 34 35 36 37 38输入PIN仍然返回“:69 84”“参考数据无效”。我可以假设至少我猜对了正确的参考数据(P2)吗?谢谢! - user2824073
不,你不能假设那样。实际上,这表明它是不正确的很好的指示。而且,在这种情况下很重要的是,它是“参考数据无效”而不是“参考数据失效”。 - Maarten Bodewes
谢谢。好的,P2参考数据并未被卡片供应商公开,所以我的唯一机会就是用一些代码循环从00到99来猜测它。希望我能找到一些线索。 - user2824073
1
实际上,合理的范围是0x01..0x1F和0x81..0x9F。 - guidot
非常感谢,我已经将它设置为正确的值0x90。我还有一个问题,但我会开一个单独的线程来讨论。 - user2824073
@user2824073:没问题,当然可以。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接