Smartcard 从国防部CAC智能卡获取人员数据

Smartcard 从国防部CAC智能卡获取人员数据,smartcard,pcsc,cac,smartcardio,Smartcard,Pcsc,Cac,Smartcardio,我已经尝试了我能想到的一切。我选择ACA,然后验证pin,选择容器。他们的状态都是9000(好)。但它并没有将任何信息打印回来。我见过如何用CCC容器之类的东西获取信息。我只是想拿回需要别针的东西 在我得到所有正确的状态代码后,我尝试在没有ber tlv标签和6985状态的情况下获取信息。我假设它不是在验证。但是我怎样才能得到信息;如何获取字节[],以便处理person容器 谢谢大家的帮助 这是我的密码: 导入java.util.List; 导入java.util.Locale //https:

我已经尝试了我能想到的一切。我选择ACA,然后验证pin,选择容器。他们的状态都是9000(好)。但它并没有将任何信息打印回来。我见过如何用CCC容器之类的东西获取信息。我只是想拿回需要别针的东西

在我得到所有正确的状态代码后,我尝试在没有ber tlv标签和6985状态的情况下获取信息。我假设它不是在验证。但是我怎样才能得到信息;如何获取字节[],以便处理person容器

谢谢大家的帮助

这是我的密码:

导入java.util.List; 导入java.util.Locale

//https://stackoverflow.com/questions/37477914/cant-verify-smart-card-pin-using-apdu-command 导入javax.smartcardio.*

公共类复印机{

public static void main(String[] args) {

    try {

        TerminalFactory factory = TerminalFactory.getDefault();
        List<CardTerminal> terminals = null;

        terminals = factory.terminals().list();

        System.out.println("Terminals: " + terminals);
        CardTerminal terminal = terminals.get(0);
        Card card = terminal.connect("T=0");
        System.out.println("card: " + card);
        ATR atr = card.getATR();
        System.out.print("ATR: ");

        for (byte b : atr.getBytes()) {
            System.out.print(b);
        }
        System.out.println();
        CardChannel channel = card.getBasicChannel();

        getCAC(channel);

        card.disconnect(false);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}



public static void getCAC(CardChannel channel) {

    CommandAPDU SELECT_ACA = new CommandAPDU(
            new byte[] { 0x00, (byte) 0xA4, 0x04, 0x00, 0x07, (byte) 0xA0, 0x00, 0x00, 0x00, 0x79, 0x01, 0x00 });

    try {

        ResponseAPDU ACA = channel.transmit(SELECT_ACA);
        System.out.println("answer rmaster file: " + ACA.toString()); // response
        System.out.println(byteArrayToString(ACA.getData()));

        // Verify Pin
        byte[] pin = { 0x00, 0x20, 0x00, 0x00, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, (byte) 0xFF, (byte) 0xFF,0x00 };
        
        CommandAPDU command = new CommandAPDU(pin);
        ResponseAPDU request = channel.transmit(command);
        System.out.println("Verify Pin: " + request.toString()); 
        System.out.println(byteArrayToString(request.getData()));

        //Select Applet
        byte[] getapplet = { 0x00, (byte) 0xA4, 0x02, 0x00, 0x02, 0x02, 0x01 };
        CommandAPDU command2 = new CommandAPDU(getapplet);
        ResponseAPDU request2 = channel.transmit(command2);
        System.out.println("Select : " + request2.toString()); // response
        System.out.println(byteArrayToString(request2.getData()));
        

        // get DATA
        byte[] getData = { 0x00, (byte) 0xC0, 0x00, 0x00, 0x00 };
        CommandAPDU command3 = new CommandAPDU(getData);
        ResponseAPDU request3 = channel.transmit(command3);
        System.out.println(byteArrayToString(request3.getData()));
        System.out.println("Get Data: " + request3.toString());

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public static String byteArrayToString(byte[] ba) {
    if (ba == null) {
        return "";
    }
    StringBuffer hex = new StringBuffer(ba.length * 2);
    for (int i = 0; i < ba.length; i++) {
        hex.append(Integer.toString((ba[i] & 0xff) + 0x100, 16).substring(1));
    }
publicstaticvoidmain(字符串[]args){
试一试{
TerminalFactory=TerminalFactory.getDefault();
列表终端=空;
端子=工厂.terminals().list();
System.out.println(“终端:+终端”);
CardTerminal=terminals.get(0);
卡=终端连接(“T=0”);
System.out.println(“卡:+卡”);
ATR ATR=card.getATR();
系统输出打印(“ATR:”);
for(字节b:atr.getBytes()){
系统输出打印(b);
}
System.out.println();
CardChannel=card.getBasicChannel();
getCAC(频道);
卡。断开连接(错误);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态无效getCAC(CardChannel){
CommandAPDU选择_ACA=新CommandAPDU(
新字节[]{0x00,(字节)0xA4,0x04,0x00,0x07,(字节)0xA0,0x00,0x00,0x00,0x79,0x01,0x00});
试一试{
ResponseADU ACA=信道传输(选择ACA);
System.out.println(“应答器主文件:+ACA.toString());//响应
System.out.println(byteArrayToString(ACA.getData());
//验证销
字节[]引脚={0x00,0x20,0x00,0x00,0x08,0x01,0x02,0x03,0x04,0x05,0x06,(字节)0xFF,(字节)0xFF,0x00};
CommandAPDU command=新CommandAPDU(pin);
ResponseADU请求=信道传输(命令);
System.out.println(“验证Pin:+request.toString());
System.out.println(byteArrayToString(request.getData());
//选择小程序
字节[]getapplet={0x00,(字节)0xA4,0x02,0x00,0x02,0x02,0x01};
CommandAPDU command2=新的CommandAPDU(getapplet);
responseADU request2=信道传输(command2);
System.out.println(“选择:”+request2.toString());//响应
System.out.println(byteArrayToString(request2.getData());
//获取数据
字节[]getData={0x00,(字节)0xC0,0x00,0x00,0x00};
CommandAPDU command3=新CommandAPDU(getData);
responseADU request3=信道传输(command3);
System.out.println(byteArrayToString(request3.getData());
System.out.println(“获取数据:+request3.toString());
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态字符串byteArrayToString(字节[]ba){
if(ba==null){
返回“”;
}
StringBuffer十六进制=新的StringBuffer(ba.length*2);
for(int i=0;i
//System.out.println(“十六进制字符串是:”+Hex.toString().toUpperCase(Locale.US)); 返回hex.toString().toUpperCase(Locale.US); }

}