У меня есть смарт-карта, как на изображении ниже. Карта находится в кардридере, который приклеен к серверу. Раньше он аутентифицировал пользователя, прежде чем он мог загрузить данные.
Я пытаюсь получить номер карты, серийный номер или RID смарт-карты. Я могу получить от него ATR помимо другой информации, как показано ниже.
ATR:
3b 9f 96 c0 0a 31 fe 45 43 54 31 69 0b 01 00 01 00 00 00 00 00 00 00 0d
В этом вопросе
SmartCardIO EMV Reader, найдите мой тип карты только с номером ATR
кто-то упомянул, что AID (Application ID) = RID(Registered Application ID) || PIX (Property Application Extension)
На этой странице объясняется, какая информация имеет ATR.
https://flomio.com/forums/topic/list-of-apdu-codes/
Answer-To-Reset (ATR)
Init| T0| TD1| TD2| T1| Tk| Len | RID | Std | Card | RFU | TCK
Hdr | | | | | | | | | Name | |
3B | 8F| 80 | 01 | 80| 4F| 0C | A0 00 00 03 06| 03 | 00 03| 00 00 00 00| 68
Когда я пытаюсь получить PSE, я получаю 6a86 также неверный P1/P2. Когда я пытаюсь получить PPSE, я получаю 6700 --> неправильную длину.
command : 00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31
response without data : 6a 86
command : 00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
response without data : 67 00
Я пробовал и этот вариант:
// byte[] pseFileName = "1PAY.SYS.DDF01".getBytes(); //PSE
byte[] pseFileName = "2PAY.SYS.DDF01".getBytes(); // PPSE
CommandAPDU command = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, pseFileName);
Информация, которую я сейчас получаю:
Terminals list: [PC/SC terminal Generic Smart Card Reader Interface 0]
ATR: 3b 9f 96 c0 0a 31 fe 45 43 54 31 69 0b 01 00 01 00 00 00 00 00 00 00 0d
command : 00 a4 02 0c 02 00 02
response without data : 90 00
command : 00 b0 00 00 09
response with data: : 00 00 01 98 fa 03 16 14 ad
command : 00 a4 04 0c 06 ff 54 41 43 48 4f
response without data : 90 00
command : 00 a4 02 0c 02 05 01
response without data : 90 00
command : 00 b0 00 00 01
response with data: : 04
command : 00 22 c1 b6 0a 83 08 00 00 00 05 09 02 ff a1
response without data : 90 00
command : 00 88 00 00 10 e9 96 79 ec 74 27 e6 50 00 00 00 05 09 02 ff a1 80
response with data: : 32 a9 bf e6 91 18 8d c8 34 87 d8 c5 6d 78 f3 90 24 db 98 60 37 f0 05 f3 1f 22 24 65 27 90 43 ff 4f ec 4f ae 7c 2e d9 4c 6d a0 bc 14 9a af df fb 81 0b 5a 4f 4d 1d ee df 38 3b 0d dd 63 7d 22 69 77 27 5b f3 0d ce 51 a3 5c fc 7f 4a fc 8c f1 da d9 ce c7 9b a1 23 e0 e6 1d b0 73 e8 3b 4b 8a 60 38 e8 0d ad 30 80 12 ef d3 76 72 75 95 2f af 09 10 e0 37 78 25 84 2e 19 0e 2e 17 9e 9d de 34 b7
Как я могу получить номер Карты (5b) на Карте и RID и AID? Почему я могу получить PSE моей Карты?
Код
import java.util.ArrayList;
import java.util.List;
import javax.smartcardio.ATR;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
import javax.xml.bind.DatatypeConverter;
public class CardIdTest {
public static void main(String[] args) {
try {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals;
terminals = factory.terminals().list();
CardTerminal terminal = terminals.get(0);
Card card = terminal.connect("T=1");
System.out.println("Terminals list: " + terminals);
ATR atr = card.getATR();
byte[] atrArray = atr.getBytes();
String atrHex = CardIdTest.printData(atrArray);
System.out.println("ATR: " + atrHex);
CardChannel channel = card.getBasicChannel();
String command1 = "00 a4 02 0c 02 00 02"; // select file
String command2 = "00 b0 00 00 09"; // length 19 works at the end instead of 09. // read binary
String command3 = "00 a4 04 0c 06 ff 54 41 43 48 4f";
String command4 = "00 a4 02 0c 02 05 01"; //
String command5 = "00 b0 00 00 01";
String command6 = "00 22 c1 b6 0a 83 08 00 00 00 05 09 02 ff a1";
String command7 = "00 88 00 00 10 e9 96 79 ec 74 27 e6 50 00 00 00 05 09 02 ff a1 80";
String pseString = "00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31";
String ppseString = "00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00";
List<String> list = new ArrayList<String>();
// list.add(command1);
// list.add(command2);
// list.add(command3);
// list.add(command4);
// list.add(command5);
// list.add(command6);
// list.add(command7);
list.add(pseString);
list.add(ppseString);
for (String item : list) {
String commandWithoutSpace = item.replace(" ", "");
byte[] apdu = DatatypeConverter.parseHexBinary(commandWithoutSpace);
CommandAPDU command = new CommandAPDU(apdu);
ResponseAPDU responseAPDU = channel.transmit(command);
byte[] reponseData = responseAPDU.getData();
String response = responseAPDU.toString();
if (reponseData.length > 0) {
String dataHex = CardIdTest.printData(reponseData);
System.out.println("command : " + item);
System.out.println("response with data: :" + dataHex);
} else {
byte[] bytes = responseAPDU.getBytes();
String responseHex = CardIdTest.printData(bytes);
System.out.println("command : " + item);
System.out.println("response without data :" + responseHex);
}
}
card.disconnect(true); // reset
} catch (CardException e) {
e.printStackTrace();
}
}
public static String printData(byte[] byteArray) {
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
sb.append(String.format(" %02x", b));
}
return sb.toString();
}
}
Изменить
У меня есть другая карта Driver card, и я могу прочитать номер карты с помощью следующего APDU
String masterFile = "00 A4 04 0C 06 FF544143484F";
String elementaryFile = "00 A4 02 0C 02 0520";
String readBinary = "00 B0 00 01 10"; // B0 read binary; 01 offset 1; 10 decimal equal 16 bytes to read.
Я вставил эту карту в кард-ридер после установки программного обеспечения для карт --> нажмите анализатор --> нажмите тахограф, и я смог прочитать данные карты, такие как идентификаторы «FF544143484F», «0520». Когда я втыкаю карточку компании в кард-ридер --> программа cardpeek --> analayer --> (здесь я не нашел правильную спецификацию, так как я пробовал каждую из них в списке, и я мог просто прочитать ATR, тогда я получаю ошибку 6700)
