1

我正在尝试使用 c# 验证和更改 gemalto .net 卡的 pin。但是当我尝试验证时,使用 -

byte cla_verify = 0;
byte p2_pinReference = 0x80;
CardCommandAPDU quickVerify = new CardCommandAPDU(cla_verify, 0x20, 0x00, p2_pinReference, CardHex.ToByteArray("FFFFFFFFFFFFFFFF"));
CardResponseAPDU aRespAPDU = aCard.SendCommand(quickVerify);

它正在返回 - SW 27033 (RSP 6999)

任何想法。我在做什么错?

4

4 回答 4

1

状态字69XX表示:命令不允许。

我查看了NET Smartcard Framework SDK中提供的NETSmartcardFramework.chm。不知道要使用什么 CLA、INS、P1、dan P2 和 Lc。相反,PIN 验证已包含在 PIN 类中。

要验证 PIN 值,您可以使用

// PIN Class members
// PIN.Verify Method

public void Verify(byte[],int,int);
public void Verify(string);

但在此之前,您需要使用构造函数初始化 PINPIN(byte[],int,int,int)PIN(string,int)并检查 PINisBlocked()isVerified().

一些有趣的文章和指南:

于 2013-05-30T18:29:42.583 回答
1

请注意,虽然您的 PIN 参考说明了特定参考,但 P2 中的标识符零表示:“卡应知道寻址的 PIN”。这可能需要其他先前发送的命令,例如 SET 模式下的管理安全环境,或某个安全环境对象或类似的。特别是对于以下更改参考数据,我建议明确说明 ID。

于 2013-05-31T06:44:20.027 回答
0

您想验证发送 APDU 的 PIN,对。查找文档 IDPrime .NET 智能卡 - 集成指南(APDU 编码和 Hivecodes)。根据此文档,方法 verifyPIN 的 APDU(参见表 16 - V5 的 Hivecodes)应如下所示(角色 USER = 0x01 和 PIN=1234 的示例):

80C200001BD800056F00C04B4E7FBD506B00044D53434D010000000431323334

解释:

APDU = APDU 报头 + APDU 有效负载

APDU 标头等于80C20000 1B其中:

  • 80C20000 - 始终相同
  • 1B(十六进制)- 27(十进制)是 1 字节的有效载荷长度。

APDU 有效负载等于D8 0005 6F 00C04B4E 7FBD 506B 0004 4D53434D 01 00000004 31323334其中:

  • D8 - 没什么可改变的
  • 0005 - 服务端口号(2 个字节)
  • 6F - 没什么可改变的
  • 00C04B4E - 服务命名空间 Hivecode(4 字节)
  • 7FBD - 服务类型 Hivecode(2 个字节)
  • 506B - 方法 Hivecode,它是 VeryfiyPin 方法的 506B(参见 doc)
  • 0004 - 服务名称长度 (0004)
  • 4D53434D - UTF8 编码的服务名称(服务名称 - MSCM (4D53434D))
  • 01 - 用户角色 (USER = 0x01, ADMIN = 0x02, EVERYONE = 0x03)
  • 00000004 - 数据大小(在这种情况下,PIN 长度等于 4)
  • 31323334 - PIN 的十六进制值 = 1234

如果 PIN 正确,您应该得到 9000 作为响应。

PIN = 12345 的另一个示例:

80C200001CD800056F00C04B4E7FBD506B00044D53434D01000000053132333435
于 2016-12-08T07:36:32.293 回答
0

PIN 验证在此处进行了说明。您可以尝试使用此代码而不是您的代码。在我看来很好。

于 2016-03-18T06:00:12.420 回答