如何使用APDU将PIN验证代码发送到智能卡——使用.NET

4

我已经成功连接到卡片,现在需要验证PIN码,但我不知道使用哪个代码进行验证。

// Verify PIN
//HERE IS WHAT I´M NOT SURE WHAT TO USE - Just an Example
byte[] pin = new byte[] { 0x31, 0x32, 0x33, 0x34, 0xFF, 0xFF, 0xFF, 0xFF };
APDUParam apduParam = new APDUParam();
apduParam.Data = pin;
apduVerifyCHV.Update(apduParam);
apduResp = iCard.Transmit(apduVerifyCHV);

这是一张智能卡,使用7位数字密码。密码始终为7位。

**Example:**
{CLA, INS, P1, P2, Lc, b1, b2, b3, b4, b5, b6, b7}

我这里有基本的 CLA, INS, P1, P2, LC 字节。 对于7位数字的PIN码,我应该设置+3字节还是6字节? PIN码应该使用实际值还是0xFF值?

Ex. {CLA, INS, P1, P2, Lc, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +7 Bytes

在规范中,我找到了8位数字的最小值和最大值,以及4到12字节的最小值和最大值的示例...

1个回答

4

这比我想象的要简单...

使用填充的ASCII格式转换PIN码

输入的PIN码为1357(最小4位,最大8位)

  • • 左对齐
  • • CCID的默认显示行为
  • • CCID向IC卡发送指令

    CLA INS P1 P2 Lc 31 33 35 37 FF FF FF FF

使用BCD右对齐和控制域的PIN码

输入的PIN码为13579(最小4位,最大8位)

  • • 右对齐。个人代码不足8位数,因此8位代码的最高有效数字必须填充零。
  • • 在PIN码转换之前,该帧集成了一个特定的控制域“01”。
  • • 没有消息
  • • CCID向IC卡发送指令

    CLA INS P1 P2 Lc 01 00 01 35 79

所以,我需要设置正确的值。在我的情况下,使用左对齐的ASCII方法:

0x00 0x20 0x00 0x01 0x08 0x30 0x31 0x34 0x37 0x34 0x31 0x30 0xFF

3 - 表示填充

3x - x 表示给定位置上实际引脚号(左对齐),因为我的PIN码有7位数字,未使用的字节将默认设置为0xFF。

希望这能帮助某些人。


1
主机应用程序需要执行填充操作相当不常见,因为通常有效字符集不受限制,0xFF 是合法字符。此外,最大长度在外部并不一定已知。如果只允许数字,则 ISO 9564 定义了一些变体。 - guidot
大家好,有人能提供包含“验证PIN”和“验证ADM”命令的标准参考吗?这些命令是在ETSI、ISO还是3GPP中定义的? - Dr. Essen
@Ac3_DeXt3R ISO/IEC 7816-4。它被放在了一个170美元的付费墙后面。 - Space Bear

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