从DOD CAC智能卡获取个人数据

问题描述

我已经尝试了所有我能想到的。我选择ACA,然后验证图钉,然后选择容器。它们的状态均为9000(良好)。但是它没有打印任何信息。我已经看到了如何使用CCC容器之类的东西来获取信息。我只是想尝试找回需要PIN的东西。

获得所有正确的状态代码后,我尝试获取没有ber-tlv标记且状态为6985的信息。我假设它没有进行身份验证。但是我该如何获取信息呢?如何获取byte [],以便可以处理人员容器?

感谢大家的帮助。

这是我的代码

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

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

公共类copyOfcardreader {

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,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,0x08,0x02,0x03,0x05,0x06,(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,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 };
        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));
    }

// System.out.println(“十六进制字符串为:” + hex.toString()。toupperCase(Locale.US)); 返回hex.toString()。toupperCase(Locale.US); }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...