2013-05-30 64 views
1

我正在尝试使用c#验证和更改金雅拓.net卡的PIN。但是,当我试图验证,使用 -使用c金雅拓.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)

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

+0

状态字总是以十六进制数指定,因此不真正需要的27033值。 –

回答

1

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

我已看过NETSmartcardFramework.chmNET Smartcard Framework SDK内提供。不知道要使用什么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); 

但是,你需要在此之前,使用构造PIN(byte[],int,int,int)PIN(string,int)初始化密码,如果密码isBlocked()isVerified()做检查。

一些有趣的文章和指南:

+0

嗯,请注意,据我所知,6999不是由ISO 7816定义的状态字,因此您正在查看特定于.NET和/或Gemalto的专有状态字。 –

+0

@owlstead:正确。只有在ISO 7816-4中定义的SW1 = '69' – David

1

注意,虽然您的PIN码参考状态的具体参照,从P2标识符零表示:“卡就知道所寻址的PIN“。这可能需要额外的先前发送的命令,例如SET模式中的管理安全EN环境或某个安全环境对象或类似环境。特别是对于以下更改参考数据,我会建议明确说明ID。

0

PIN验证解释为。你可以试试这个代码而不是你的。在我看来很好。

0

你想验证PIN码发送APDU,没错。查找文档IDPrime .NET智能卡 - 集成指南(APDU编码和Hivecodes)。根据这一文件APDU的方法verifyPIN(见表16 - Hivecodes为V5)应该是这样的(例如,对于角色USER = 0×01和PIN = 1234)为:

80C200001BD800056F00C04B4E7FBD506B00044D53434D010000000431323334 

说明:

APDU = APDU报头+有效负载APDU

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

  • 80C20000 - 总是相同B(十六进制) - 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是506B为VeryfiyPin方法(参见DOC)
  • 0004 - 服务名称长度(0004)
  • 4D53434D - UTF8编码的服务名称(服务名称 - MSCM(4D53434D ))
  • 01 - 用户角色(USER = 0×01,ADMIN = 0×02,每个人都= 0×03)
  • 00000004 - 数据大小(在此情况下的PIN的长度等于4)
  • 31323334 - PIN = 1234
  • 的十六进制值

如果PIN码是正确的你应该得到9000的回应。

为PIN = 12345又如:

80C200001CD800056F00C04B4E7FBD506B00044D53434D01000000053132333435