gpt4 book ai didi

java - 从智能卡读取数据(CNS/CNR)

转载 作者:行者123 更新时间:2023-12-02 10:41:57 25 4
gpt4 key购买 nike

我使用java卡编写了一个程序,它允许我从智能卡读取一些数据。卡的文件系统结构如下:

Smart Card File System

智能卡是意大利公共(public)管理部门的一张卡。

通过运行此代码,我可以正确连接卡,将数据读取命令发送到MF/DF1/EF_Dati_Personali路径

当我尝试输入DF2/Dati_personali_aggiuntivi时,我找不到任何数据,尽管它们存在。

根据引用指南,访问DF1和DF2区域,扇区如下:

Data sectors

下面是我写的代码。代码在行中进行注释以获取数据以识别问题。

有人可以告诉我我错在哪里吗?每一个建议都值得赞赏。非常感谢

package smartcard;

import java.io.IOException;
import static java.lang.System.out;
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.swing.JOptionPane;

public class SmartCard {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws CardException, IOException {
try {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);

// Use the first terminal
CardTerminal terminal = terminals.get(0);

// Connect wit hthe card
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();

//GET ATR
ATR atr = card.getATR();

byte[] ATR = atr.getBytes();
System.out.println("Card ATR: " + bytesToHex(ATR));
// // originale

//GET SELECT_FILE_APDU
byte[] READ_BINARY_APDU = {(byte) 0x00, (byte) 0xB0, (byte) 0x00, (byte) 0x00, (byte) 0xff};

byte[] dati_personali = {(byte) 0x00, (byte) 0xA4, (byte) 0x08, (byte) 0x00, (byte) 0x04, (byte) 0x11, (byte) 0x00, (byte) 0x11, (byte) 0x02, (byte) 0x00};
// Whit this String I can correctly read DF1 Data of CNS (Carta Nazionale servizi)

// This should be the string for get DF2 data but I cannot find anything.
byte[] dati_personali_aggiuntivi = {(byte) 0x00, (byte) 0xA4, (byte) 0x08, (byte) 0x00, (byte) 0x04, (byte) 0x12, (byte) 0x00, (byte) 0x12, (byte) 0x01, (byte) 0x00};

String dati_personali_string = richiedi(channel, READ_BINARY_APDU, dati_personali, "<b>Dati personali:</b><br>");
String dati_personali_aggiuntivi_string = richiedi(channel, READ_BINARY_APDU, dati_personali_aggiuntivi, "<b>Dati personali aggiuntivi:</b><br>");
JOptionPane.showMessageDialog(null,"dati personali: "+ dati_personali_string, "Dati personali",JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null,"dati personali agiguntivi: "+ dati_personali_aggiuntivi_string, "Dati personali aggiuntivi",JOptionPane.INFORMATION_MESSAGE);


// Disconnect the card
card.disconnect(false);
System.out.println("DISCONEESSO ");

} catch (Exception e) {
System.out.println("Ouch: " + e.toString());
}

}

public static String richiedi(CardChannel channel, byte[] read, byte[] select, String titolo) throws CardException {
out.println(titolo);
// Send Select Applet command
ResponseAPDU answer = channel.transmit(new CommandAPDU(select));
// Send test command
answer = channel.transmit(new CommandAPDU(read));
byte r[] = answer.getData();
String test = "";
for (int i = 0; i < r.length; i++) {
test += (char) r[i];
}
System.out.print(test);
out.println(test);
out.println("<br><br>");
return test;
}

public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
sb.append(String.format("%02x", bytes[i]));
}
return sb.toString();
}
}
<小时/>

更新 APDU 跟踪

REQUEST: Dati personali:
read command: >>> 00b00000ff
select command: >>> 00a40800041100110200

RESPONSE: Dati personali:
<<< answer from CNS: 303030303733303436303330303830373039323031303038303730393230313630384954414c49414e4f3130414e544f4e494f20435249535449414e3038323230343139383230314d30303130544c4e4e4e43383244323246323035493030303446323035303030303034463230353030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000

_____________________
REQUEST: Dati personali aggiuntivi:
read command: >>> 00b00000ff
select command: >>> 00a40800041200120100

RESPONSE: Dati personali aggiuntivi:
<<< answer from CNS: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000

最佳答案

根据给定的跟踪,您的代码工作正常,并且卡中的数据已成功读取 - 基本文件“DF2/Dati_personali_aggiuntivi”用零填充。

这符合the documentation (第 4.3 节):

EF.Dati_personali_aggiuntivi – l’intero contenuto è posto a ‘00’hex

使用 Google 翻译进行翻译:

EF.Additional_personal_dates - the entire content is set to '00'hex

一些附加说明:

  • “EF.Dati_personali”文件包含 400 个字节 - 您可能需要使用多个“READ BINARY”命令来获取全部内容

  • 始终检查 APDU 响应状态(“90 00”)——ResponseAPDU.getSW()对此很有用

祝您的项目顺利!

编辑> OpenSC支持 CNS 卡(请参阅 herehere )您可能想尝试一下

关于java - 从智能卡读取数据(CNS/CNR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52863397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com