卡片不在场的情况下是否可以发送伪APDU命令?

5

我正在使用javax.smartcardio包开发智能卡相关的应用程序。我想发送伪ADPU命令来设置读卡器的LED / LCD状态。

我发现发送APDU命令到读卡器/卡片的唯一方法是CardChannel :: transmit,但它必须在插入卡片后运行。

当读卡器中没有卡时,是否可以发送伪APDU命令?APDU命令呢?(使用Java)


我读成了“智能心血管”。我很聪明,我保证!另外,ADPU是什么意思?我以前从未见过。 - anon
@QPaysTaxes:最好将其读作SmartCardInOut;APDU或应用数据协议单元是一种向智能卡发送命令并从其接收响应的协议。 简单来说,它就是一个十六进制数字队列。这些命令的最小长度为4个字节(命令标头),而卡片答案的最小长度为2个字节(状态字)。 - Ebrahim Ghasemi
请查看 Oracle 社区中的以下主题,看起来这就是你遇到的相同问题: https://community.oracle.com/thread/2193998 - Ebrahim Ghasemi
2个回答

3

我从http://www.springcard.comPC/SC SDK示例中找到了解决方案。以下是我的代码:

import java.util.List;

import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;

public class TestPcsc {

    public static void main( String[] args ) throws CardException {

        TerminalFactory tf = TerminalFactory.getDefault();
        List< CardTerminal > terminals = tf.terminals().list();
        CardTerminal cardTerminal = (CardTerminal) terminals.get( 0 );

        byte[] command = { (byte) 0xE0, (byte) 0x00, (byte) 0x00, (byte) 0x29, (byte) 0x01, (byte) 0x00 };
        cardTerminal.connect( "DIRECT" ).transmitControlCommand( CONTROL_CODE(), command );

    }

    public static int CONTROL_CODE() {

        String osName = System.getProperty( "os.name" ).toLowerCase();
        if ( osName.indexOf( "windows" ) > -1 ) {
            /* Value used by both MS' CCID driver and SpringCard's CCID driver */
            return (0x31 << 16 | 3500 << 2);
        }
        else {
            /* Value used by PCSC-Lite */
            return 0x42000000 + 1;
        }

    }

}

我认为重点如下:
  1. 使用 DIRECT 协议获取“卡片”
  2. 使用 Card::transmitControlCommand 方法与从 CONTROL_CODE 函数获取的代码一起使用(从示例代码中复制,不确定理论是什么 >_<)

1

我认为以下方法需要在读卡器中插入卡片,但只是为了让您知道,我在这里发布它是为了说明我们还有另一种终端控制命令的方法:

引用自这里:

transmitControlCommand:

public abstract byte[] transmitControlCommand(int controlCode,byte[] command) throws CardException

向终端设备发送控制命令。这可用于控制终端功能,如内置PIN键盘或生物识别。

参数:

controlCode-命令的控制码

command-命令数据

抛出:

SecurityException-如果存在SecurityManager并且调用者没有所需的权限

NullPointerException-如果命令为空

CardException-如果卡操作失败

IllegalStateException-如果此卡对象已通过disconnect()方法处理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接