javax.smarcardio 未知异常 0x1f

Posted

技术标签:

【中文标题】javax.smarcardio 未知异常 0x1f【英文标题】:javax.smarcardio unknown exception 0x1f 【发布时间】:2016-08-08 13:44:59 【问题描述】:

我现在正在研究读卡器。我想从卡中获取数据。我拿了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)返回未知异常。

请帮助我。您不必在代码中查找错误。告诉我如何在智能卡中开始会话。我使用 HID OMNİKEY 5021 CL。

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)

【问题讨论】:

您要访问哪种类型的卡?卡片使用什么协议? 终端:[PC/SC 终端 OMNIKEY CardMan 5x21-CL 0] 卡:OMNIKEY CardMan 5x21-CL 0 中的 PC/SC 卡,协议 T=1 我指的是非接触式智能卡/标签,而不是终端... T=CL, MIFARE®, iCLASS® / ISO 14443 A 848 Kbps 传输率(取决于卡),ISO 14443 B 848 Kbps 传输率(取决于卡),ISO 15693 26 Kbps 传输速率(取决于卡),您可以查看此 pdf hidglobal.com/sites/default/files/resource_files/… 你试过ResponseAPDU response = channel.transmit(new CommandAPDU(0x84, 0x72,0x00,0x00,c1,5,24));吗? 【参考方案1】:

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

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

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

改用new CommandAPDU(0x84, 0x72,0x00,0x00,c1,5,24)

请参阅 CommandAPDU javadoc 和 APDU format description。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于javax.smarcardio 未知异常 0x1f的主要内容,如果未能解决你的问题,请参考以下文章

FISCO BCOS Transaction execution error合约执行失败原因

FISCO BCOS Transaction execution error合约执行失败原因

基于未知情况的WSS失效异常数据预测判断方法

Smarty:如何修复“未知修饰符'rewrite'”异常?

捕获未知异常

查看和未知异常