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

时间:2013-03-26 16:50:17

标签: .net smartcard asp.net-4.5 apdu

我能够连接到卡,现在我需要验证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位PIN的智能卡。它总是7位数。

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

我在这里有基本的CLAINSP1P2LC个字节。 我应该为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 个答案:

答案 0 :(得分:3)

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

当PIN使用带填充的ASCII格式转换时

输入的密码为1357(最小尺寸= 4,最大尺寸= 8位)

  • •左对齐
  • •CCID的默认显示行为
  • •CCID向ICC发送命令

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

当PIN使用BCD右对齐和控制字段时

输入的密码为13579(最小尺寸= 4,最大尺寸= 8位)

  • •正当理由。个人代码包含少于8位数字; 因此,八位数代码的最高位必须为 用零填充。
  • •框架在PIN之前集成了特定的控制字段“01” 转换。
  • •没有消息
  • •CCID向ICC发送命令

    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指的是给定位置的实际引脚编号(左对齐) 因为我有一个7位数的PIN,所以未使用的字节应默认为0xFF

希望有所帮助