javax.smarcardio未知异常0x1f

时间:2016-08-08 13:44:59

标签: java session smartcard apdu smartcard-reader

我现在正在读卡器。我想从卡片中获取数据。我带了uid。我想要加密数据。所以我想进入安全模式并开始会话。我做了一些事。我发送一个命令apdu来启动会话,但每次返回未知异常0x1f这里是代码。

    TerminalFactory factory = TerminalFactory.getDefault();

    List<CardTerminal> terminals = factory.terminals().list();

    terminal = terminals.get(0);
    card = terminal.connect("T=1");
    CardChannel channel = card.getBasicChannel();
    byte[] c1 = { (byte) 0x80, (byte) 0x72, (byte) 0x80, (byte) 0x00, (byte) 0x18, (byte) 0x5c, (byte) 0xc5,
            (byte) 0x0a, (byte) 0xa2, (byte) 0x5b, (byte) 0x38, (byte) 0x7f, (byte) 0x81, (byte) 0x3a, (byte) 0x3d,
            (byte) 0x1a, (byte) 0x88, (byte) 0x7d, (byte) 0x26, (byte) 0xfc, (byte) 0x2b, (byte) 0xa8, (byte) 0xa7,
            (byte) 0xdd, (byte) 0xdc, (byte) 0x71, (byte) 0xe0, (byte) 0xf3, (byte) 0xc6 };

    ResponseAPDU response = channel.transmit(new CommandAPDU(0xFF, 0x00,0x00,0x00,c1,5,24));

此代码返回6a81(表示不支持函数),

如果我直接发送启动会话命令(84 72 00 00),则此时返回未知异常。

请帮帮我。您不必在代码中找到错误。告诉我如何在智能卡中启动会话。我使用HIDOMNİKEY5021CL。

Exception in thread "main" javax.smartcardio.CardException: sun.security.smartcardio.PCSCException: Unknown error 0x1f
at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:219)
at sun.security.smartcardio.ChannelImpl.transmit(ChannelImpl.java:90)
at CardReader.GetUID.getUID(GetUID.java:48)
at CardReader.GetUID.main(GetUID.java:86)

2 个答案:

答案 0 :(得分:1)

您发送的APDU错误,因为您以错误的方式使用CommandAPDU

new CommandAPDU(0xFF, 0x00,0x00,0x00,c1,5,24)

创建一个从FF000000185CC50AA2...开始的APDU,这不是您(可能)想要的。

请尝试new CommandAPDU(0x84, 0x72,0x00,0x00,c1,5,24)

请参阅CommandAPDU javadocAPDU format description

答案 1 :(得分:0)

我发现了问题。问题是字节类型.net和java。 C#字节类型介于0和255之间,但java字节类型为-127和+128。因此,如果我向java发送高于127的值,则卡解释为负值。