问题描述
我已经尝试了所有我能想到的。我选择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 (将#修改为@)