DOMANDA Software per leggere dati da smart card? (tessera sanitaria)

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,546
12,933
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11
I farmacisti hanno software apposta perché collegati ai loro gestionali. Devo sentire in ditta una cosa, e poi ti giro in provato un software che fa al caso tuo che ho sviluppato come componente aggiuntivo di un altro software.

Inviato da TA-1021 tramite App ufficiale di Tom\'s Hardware Italia Forum
 

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,546
12,933
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11
Mi hanno messo in standby...
Domanda, ce l'hai bisogno che funzioni online oppure offline?
 

paolo.tazzini

Nuovo Utente
4
0
sto terminando di sviluppare un programma in java che recupera i dati pubblici della tessera sanitaria, tra poco lo finirò.
Nella tessera sanitaria la banda magnetica nel retro e il codice a barre riportano solo il codice fiscale, che è quello che sparano i farmacisti con lo scanner, nel chip invece ci sono i dati, sia quelli pubblici che quelli privati con accesso qualificato dal pin.
Io ho recuperato quelli pubblici nome cognome ente emittente scadenza codice fiscale data nascita e comune nascita e stato
 

Kelion

Quid est veritas? Est vir qui adest
Utente Èlite
41,544
14,070
CPU
5600X
Dissipatore
Arctic Liquid Freezer 240
Scheda Madre
ASUS ROG STRIX B550-F GAMING (WI-FI)
HDD
1 SSD 1TB M.2 NVMe Samsung 970 Evo plus 4 HDD P300 3TB ciascuno
RAM
2x8GB Crucial Ballistix 3600 MHz
GPU
RTX 3060 Ti
Monitor
AOC 24G2U 144 Hz
PSU
EVGA G2 750W
Case
NZXT H510
Periferiche
Varie
Net
FTTC 100/30
OS
Windows 10, Debian 10
  • Mi piace
Reazioni: Moffetta88

paolo.tazzini

Nuovo Utente
4
0
funziona egregiamente con un lettore di smartcard per le tessere solo che per quelle di nuova emissione non estrae i dati. Secondo me devono avere cambiato la posizione dell' EF contenente i dati personali oppure hanno messo un blocco di pin, ma non credo

// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
//stabiliamo un canale di comunicazione con il terminale
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();

//chiediamo al canale di comunicazione di darci il num di byte dell'atr
ATR atr = card.getATR();
System.out.println("numero byte di "+atr);
System.out.println("");
//ci facciamo dare l'array di byte dell'atr in stringa
byte[] bytes = atr.getBytes();

String atrbin = Arrays.toString(bytes);

System.out.println(" insieme dei numeri di atr "+ atrbin);
System.out.println("");

String s = new String(bytes);
// scriviamo decifrandoli in caratteri anche se tuttavia non hanno senso in quanto hanno altri significati
System.out.println("i byte decodificati in stringa "+s);

// diamo un comando apdu alla smart di selezionare il MF

byte[] apdu = new byte[7];
apdu[0]=(byte)0x00;
apdu[1]=(byte)0xa4;
apdu[2]=(byte)0x00;
apdu[3]=(byte)0x00;
apdu[4]=(byte)0x00;
apdu[5]=(byte)0x3F;
apdu[6]=(byte)0x00;
ResponseAPDU r = channel.transmit(new CommandAPDU(apdu));

// diamo un comando apdu alla smart di selezionare il DF

byte[] apdu1 = new byte[7];
apdu1[0]=(byte)0x00;
apdu1[1]=(byte)0xa4;
apdu1[2]=(byte)0x00;
apdu1[3]=(byte)0x00;
apdu1[4]=(byte)0x02;
apdu1[5]=(byte)0x11;
apdu1[6]=(byte)0x00;

ResponseAPDU r1 = channel.transmit(new CommandAPDU(apdu1));

// diamo un comando apdu alla smart di selezionare EF

byte[] apdu2 = new byte[7];
apdu2[0]=(byte)0x01;
apdu2[1]=(byte)0xa4;
apdu2[2]=(byte)0x00;
apdu2[3]=(byte)0x00;
apdu2[4]=(byte)0x02;
apdu2[5]=(byte)0x11;
apdu2[6]=(byte)0x02;

ResponseAPDU r2 = channel.transmit(new CommandAPDU(apdu2));

// diamo un comando apdu alla smart di leggere ET

byte[] apdu3 = new byte[7];
apdu3[0]=(byte)0x01;
apdu3[1]=(byte)0xB0;
apdu3[2]=(byte)0x00;
apdu3[3]=(byte)0x00;
apdu3[4]=(byte)0x00;
apdu3[5]=(byte)0x00;
apdu3[6]=(byte)0x190;

ResponseAPDU r3 = channel.transmit(new CommandAPDU(apdu3));

//scrivo il numero di byte della apdu e la risposta sw
System.out.println(Arrays.toString(r3.getBytes()));
System.out.println(r3.toString());

// scrivo il risultato tradotto in stringa dell'array della apdu
String s1 = new String(r3.getData());
System.out.println(s1);

// levo i primi 6 caratteri che indicano il totale dei caratteri in esadecimale
//per comodità chiamo i bytes caratteri

String s2 = s1.substring(6);
System.out.println(s2);

//trasformo in int i successivi due caratteri

String s221 = s1.substring(6, 8);
int dec = Integer.parseInt(s221,16);
System.out.println(dec);

//scrivo la substringa da 8 a 8+dec
String codemett = s1.substring(8, (8+dec));
System.out.println("codice emettitore: "+codemett);

//trasformo in int gli ulteriori due caratteri esadecimali
String s222 = s1.substring((8+dec), (10+dec));
int dec1 = Integer.parseInt(s222,16);
System.out.println(dec1);

// scrivo la substringa della data di emissione da 8+2+dec a 8+2+dec+dec1

String dataemis = s1.substring((10+dec), (14+dec1));
System.out.println("data di emissione: "+dataemis);


//trasformo in int gli ulteriori due caratteri esadecimali indicanti byte scadenza

String s223 = s1.substring((10+dec+dec1), (12+dec+dec1));
int dec2 = Integer.parseInt(s223,16);
System.out.println(dec2);

// scrivo la substringa data scadenza da 12+dec+dec1 a 12+dec+dec1+dec2

String datascad = s1.substring((12+dec+dec1), (12+dec+dec1+dec2));
System.out.println("data di scadenza: "+datascad);


//trasformo in int gli ulteriori due caratteri esadecimali indicanti cognome
String s224 = s1.substring((12+dec+dec1+dec2), (14+dec+dec1+dec2));
int dec3 = Integer.parseInt(s224,16);
System.out.println(dec3);

// scrivo la substringa cognome da 14+dec+dec1+dec2 a 12+dec+dec1+dec2

String cognome = s1.substring((14+dec+dec1+dec2), (14+dec+dec1+dec2+dec3));
System.out.println("cognome: "+ cognome);

//trasformo in int gli ulteriori due caratteri esadecimali del nome
String s225 = s1.substring((14+dec+dec1+dec2+dec3), (16+dec+dec1+dec2+dec3));
int dec4 = Integer.parseInt(s225,16);
System.out.println(dec4);

// scrivo la substringa cognome da 16+dec+dec1+dec2+dec3 a 16+dec+dec1+dec2+dec3+dec4

String nome = s1.substring((16+dec+dec1+dec2+dec3), (16+dec+dec1+dec2+dec3+dec4));
System.out.println("nome: "+ nome);



//trasformo in int gli ulteriori due caratteri esadecimali della data nascita
String s226 = s1.substring((16+dec+dec1+dec2+dec3+dec4),(18+dec+dec1+dec2+dec3+dec4));
int dec5 = Integer.parseInt(s226,16);
System.out.println(dec5);

// scrivo la substringa cognome da 18+dec+dec1+dec2+dec3+dec4 a 18+dec+dec1+dec2+dec3+dec4+dec5

String datanascita = s1.substring((18+dec+dec1+dec2+dec3+dec4),(18+dec+dec1+dec2+dec3+dec4+dec5));
System.out.println("data di nascita: "+ datanascita);

//trasformo in int gli ulteriori due caratteri esadecimali del sesso
String s227 =s1.substring((18+dec+dec1+dec2+dec3+dec4+dec5),(20+dec+dec1+dec2+dec3+dec4+dec5));
int dec6 = Integer.parseInt(s227,16);
System.out.println(dec6);

// scrivo la substringa cognome da 20+dec+dec1+dec2+dec3+dec4 a 20+dec+dec1+dec2+dec3+dec4+dec5+dec6

String sesso = s1.substring((20+dec+dec1+dec2+dec3+dec4+dec5),(20+dec+dec1+dec2+dec3+dec4+dec5+dec6));
System.out.println("sesso: "+ sesso);



//trasformo in int gli ulteriori due caratteri esadecimali del codice fiscale
String s228 =s1.substring((20+dec+dec1+dec2+dec3+dec4+dec5+dec6),(24+dec+dec1+dec2+dec3+dec4+dec5+dec6));
int dec7 = Integer.parseInt(s228,16);
System.out.println(dec7);

// scrivo la substringa codice fiscale da 22+dec+dec1+dec2+dec3+dec4+dec5+dec6 a 22+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7

String codfisc = s1.substring((24+dec+dec1+dec2+dec3+dec4+dec5+dec6),(24+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7));
System.out.println("codice fiscale: "+ codfisc);


//trasformo in int gli ulteriori due caratteri esadecimali del comune di nascita
String s229 =s1.substring((24+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7),(28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7));
int dec8 = Integer.parseInt(s229,16);
System.out.println(dec8);

// scrivo la substringa cognome da 28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7 a 28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8

String comunasc = s1.substring((28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7),(28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8));
System.out.println("comune di nascita: "+ comunasc);


//trasformo in int gli ulteriori due caratteri esadecimali del comune di residenza
String s230 = s1.substring((32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8),(34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8));
int dec9 = Integer.parseInt(s230,16);
System.out.println(dec9);

// scrivo la substringa comures da 32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8 a 32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8+dec9

String comures = s1.substring((34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8),(34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8+dec9));
System.out.println("comune di residenza: "+ comures);


surname.setText(cognome);
name.setText(nome);
String datanascita1 =datanascita.substring(0, 2) + "-" + datanascita.substring(2, 4) + "-" + datanascita.substring(4, 8);
birth.setText(datanascita1);
sex.setText(sesso);
codfiscale.setText(codfisc);
townbirth.setText(comunasc);
townstay.setText(comures);
cem.setText(codemett);

String dataemis1 = dataemis.substring(0, 2)+ "-"+dataemis.substring(2, 4)+ "-"+dataemis.substring(4, 8);
dem.setText(dataemis1);

String datascad1 = datascad.substring(0, 2)+ "-"+datascad.substring(2, 4)+ "-"+datascad.substring(4, 8);
dts.setText(datascad1);
 

phaolo

Utente Attivo
162
9
Ah grazie, ma.. hai un eseguibile? Non sono molto pratico..
Peccato per le carte nuove, però.
 

andrea_dicandia

Nuovo Utente
2
0
funziona egregiamente con un lettore di smartcard per le tessere solo che per quelle di nuova emissione non estrae i dati. Secondo me devono avere cambiato la posizione dell' EF contenente i dati personali oppure hanno messo un blocco di pin, ma non credo

// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
//stabiliamo un canale di comunicazione con il terminale
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();

//chiediamo al canale di comunicazione di darci il num di byte dell'atr
ATR atr = card.getATR();
System.out.println("numero byte di "+atr);
System.out.println("");
//ci facciamo dare l'array di byte dell'atr in stringa
byte[] bytes = atr.getBytes();

String atrbin = Arrays.toString(bytes);

System.out.println(" insieme dei numeri di atr "+ atrbin);
System.out.println("");

String s = new String(bytes);
// scriviamo decifrandoli in caratteri anche se tuttavia non hanno senso in quanto hanno altri significati
System.out.println("i byte decodificati in stringa "+s);

// diamo un comando apdu alla smart di selezionare il MF

byte[] apdu = new byte[7];
apdu[0]=(byte)0x00;
apdu[1]=(byte)0xa4;
apdu[2]=(byte)0x00;
apdu[3]=(byte)0x00;
apdu[4]=(byte)0x00;
apdu[5]=(byte)0x3F;
apdu[6]=(byte)0x00;
ResponseAPDU r = channel.transmit(new CommandAPDU(apdu));

// diamo un comando apdu alla smart di selezionare il DF

byte[] apdu1 = new byte[7];
apdu1[0]=(byte)0x00;
apdu1[1]=(byte)0xa4;
apdu1[2]=(byte)0x00;
apdu1[3]=(byte)0x00;
apdu1[4]=(byte)0x02;
apdu1[5]=(byte)0x11;
apdu1[6]=(byte)0x00;

ResponseAPDU r1 = channel.transmit(new CommandAPDU(apdu1));

// diamo un comando apdu alla smart di selezionare EF

byte[] apdu2 = new byte[7];
apdu2[0]=(byte)0x01;
apdu2[1]=(byte)0xa4;
apdu2[2]=(byte)0x00;
apdu2[3]=(byte)0x00;
apdu2[4]=(byte)0x02;
apdu2[5]=(byte)0x11;
apdu2[6]=(byte)0x02;

ResponseAPDU r2 = channel.transmit(new CommandAPDU(apdu2));

// diamo un comando apdu alla smart di leggere ET

byte[] apdu3 = new byte[7];
apdu3[0]=(byte)0x01;
apdu3[1]=(byte)0xB0;
apdu3[2]=(byte)0x00;
apdu3[3]=(byte)0x00;
apdu3[4]=(byte)0x00;
apdu3[5]=(byte)0x00;
apdu3[6]=(byte)0x190;

ResponseAPDU r3 = channel.transmit(new CommandAPDU(apdu3));

//scrivo il numero di byte della apdu e la risposta sw
System.out.println(Arrays.toString(r3.getBytes()));
System.out.println(r3.toString());

// scrivo il risultato tradotto in stringa dell'array della apdu
String s1 = new String(r3.getData());
System.out.println(s1);

// levo i primi 6 caratteri che indicano il totale dei caratteri in esadecimale
//per comodità chiamo i bytes caratteri

String s2 = s1.substring(6);
System.out.println(s2);

//trasformo in int i successivi due caratteri

String s221 = s1.substring(6, 8);
int dec = Integer.parseInt(s221,16);
System.out.println(dec);

//scrivo la substringa da 8 a 8+dec
String codemett = s1.substring(8, (8+dec));
System.out.println("codice emettitore: "+codemett);

//trasformo in int gli ulteriori due caratteri esadecimali
String s222 = s1.substring((8+dec), (10+dec));
int dec1 = Integer.parseInt(s222,16);
System.out.println(dec1);

// scrivo la substringa della data di emissione da 8+2+dec a 8+2+dec+dec1

String dataemis = s1.substring((10+dec), (14+dec1));
System.out.println("data di emissione: "+dataemis);


//trasformo in int gli ulteriori due caratteri esadecimali indicanti byte scadenza

String s223 = s1.substring((10+dec+dec1), (12+dec+dec1));
int dec2 = Integer.parseInt(s223,16);
System.out.println(dec2);

// scrivo la substringa data scadenza da 12+dec+dec1 a 12+dec+dec1+dec2

String datascad = s1.substring((12+dec+dec1), (12+dec+dec1+dec2));
System.out.println("data di scadenza: "+datascad);


//trasformo in int gli ulteriori due caratteri esadecimali indicanti cognome
String s224 = s1.substring((12+dec+dec1+dec2), (14+dec+dec1+dec2));
int dec3 = Integer.parseInt(s224,16);
System.out.println(dec3);

// scrivo la substringa cognome da 14+dec+dec1+dec2 a 12+dec+dec1+dec2

String cognome = s1.substring((14+dec+dec1+dec2), (14+dec+dec1+dec2+dec3));
System.out.println("cognome: "+ cognome);

//trasformo in int gli ulteriori due caratteri esadecimali del nome
String s225 = s1.substring((14+dec+dec1+dec2+dec3), (16+dec+dec1+dec2+dec3));
int dec4 = Integer.parseInt(s225,16);
System.out.println(dec4);

// scrivo la substringa cognome da 16+dec+dec1+dec2+dec3 a 16+dec+dec1+dec2+dec3+dec4

String nome = s1.substring((16+dec+dec1+dec2+dec3), (16+dec+dec1+dec2+dec3+dec4));
System.out.println("nome: "+ nome);



//trasformo in int gli ulteriori due caratteri esadecimali della data nascita
String s226 = s1.substring((16+dec+dec1+dec2+dec3+dec4),(18+dec+dec1+dec2+dec3+dec4));
int dec5 = Integer.parseInt(s226,16);
System.out.println(dec5);

// scrivo la substringa cognome da 18+dec+dec1+dec2+dec3+dec4 a 18+dec+dec1+dec2+dec3+dec4+dec5

String datanascita = s1.substring((18+dec+dec1+dec2+dec3+dec4),(18+dec+dec1+dec2+dec3+dec4+dec5));
System.out.println("data di nascita: "+ datanascita);

//trasformo in int gli ulteriori due caratteri esadecimali del sesso
String s227 =s1.substring((18+dec+dec1+dec2+dec3+dec4+dec5),(20+dec+dec1+dec2+dec3+dec4+dec5));
int dec6 = Integer.parseInt(s227,16);
System.out.println(dec6);

// scrivo la substringa cognome da 20+dec+dec1+dec2+dec3+dec4 a 20+dec+dec1+dec2+dec3+dec4+dec5+dec6

String sesso = s1.substring((20+dec+dec1+dec2+dec3+dec4+dec5),(20+dec+dec1+dec2+dec3+dec4+dec5+dec6));
System.out.println("sesso: "+ sesso);



//trasformo in int gli ulteriori due caratteri esadecimali del codice fiscale
String s228 =s1.substring((20+dec+dec1+dec2+dec3+dec4+dec5+dec6),(24+dec+dec1+dec2+dec3+dec4+dec5+dec6));
int dec7 = Integer.parseInt(s228,16);
System.out.println(dec7);

// scrivo la substringa codice fiscale da 22+dec+dec1+dec2+dec3+dec4+dec5+dec6 a 22+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7

String codfisc = s1.substring((24+dec+dec1+dec2+dec3+dec4+dec5+dec6),(24+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7));
System.out.println("codice fiscale: "+ codfisc);


//trasformo in int gli ulteriori due caratteri esadecimali del comune di nascita
String s229 =s1.substring((24+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7),(28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7));
int dec8 = Integer.parseInt(s229,16);
System.out.println(dec8);

// scrivo la substringa cognome da 28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7 a 28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8

String comunasc = s1.substring((28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7),(28+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8));
System.out.println("comune di nascita: "+ comunasc);


//trasformo in int gli ulteriori due caratteri esadecimali del comune di residenza
String s230 = s1.substring((32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8),(34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8));
int dec9 = Integer.parseInt(s230,16);
System.out.println(dec9);

// scrivo la substringa comures da 32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8 a 32+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8+dec9

String comures = s1.substring((34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8),(34+dec+dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8+dec9));
System.out.println("comune di residenza: "+ comures);


surname.setText(cognome);
name.setText(nome);
String datanascita1 =datanascita.substring(0, 2) + "-" + datanascita.substring(2, 4) + "-" + datanascita.substring(4, 8);
birth.setText(datanascita1);
sex.setText(sesso);
codfiscale.setText(codfisc);
townbirth.setText(comunasc);
townstay.setText(comures);
cem.setText(codemett);

String dataemis1 = dataemis.substring(0, 2)+ "-"+dataemis.substring(2, 4)+ "-"+dataemis.substring(4, 8);
dem.setText(dataemis1);

String datascad1 = datascad.substring(0, 2)+ "-"+datascad.substring(2, 4)+ "-"+datascad.substring(4, 8);
dts.setText(datascad1);
Buongiorno Paolo, sono in crisi da diverso tempo anch'io sulla lettura delle tessere sanitarie con chip. Potresti aiutarmi? Grazie infinite
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!