Esempio di crittografia: chiavi pubbliche e private
Ecco un esempio in cui usiamo i package di Java per la crittografia,chiavi pubbliche e private.
Nel package java.security abbiamo a disposizione varie implementazioni per la generazione di chiavi pubbliche e private. Prima di tutto dobbiamo conoscere quali implementazioni sono a nostra disposizione. Questo lo possiamo sapere grazie alla classe Security, nella quale si registrano i diversi servizi di crittografia.
Un servizio di crittografia viene rappresentato nelle API Java nel seguente modo:
1 |
service-type.service-implementation |
Dove service-type è la tipologia di servizio e service-implementation una delle implementazioni disponibili per quel servizio. Ecco come stamparli a schermo
1 2 3 4 |
String[] tipoServizi = elencoTipoServizi(); for (int i = 0; i < tipoServizi.length; i++) { stampaImplementazioniServizio(tipoServizi[i]); } |
Recuperiamo prima tutti i servizi disponibili e li restituiamo sotto forma di array di String con il metodo elencoTipoServizi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static String[] elencoTipoServizi() { Set result = new HashSet(); Provider[] providers = Security.getProviders(); for (int i = 0; i < providers.length; i++) { Set keys = providers[i].keySet(); for (Iterator it = keys.iterator(); it.hasNext();) { String key = (String) it.next(); key = key.split(" ")[0]; if (key.startsWith("Alg.Alias.")) { key = key.substring(10); } int ix = key.indexOf('.'); result.add(key.substring(0, ix)); } } return (String[]) result.toArray(new String[result.size()]); } |
e successivamente per ogni servizio vediamo quali implementazioni sono disponibili nel sistema e le stampiamo a schermo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private static void stampaImplementazioniServizio(String tipoServizio) { Provider[] providers = Security.getProviders(); for (int i = 0; i < providers.length; i++) { Set keys = providers[i].keySet(); for (Iterator it = keys.iterator(); it.hasNext();) { String key = (String) it.next(); key = key.split(" ")[0]; if (key.startsWith(tipoServizio + ".")) { System.out.println(tipoServizio + " " + key.substring(tipoServizio.length() + 1)); } else if (key.startsWith("Alg.Alias." + tipoServizio + ".")) { System.out.println(tipoServizio + " " + key.substring(tipoServizio.length() + 11)); } } } } |
Ora sappiamo quali siano le implementazioni che sono nella nostra versione di JVM. Utilizziamo quindi il servizio KeyPairGenerator per generare una coppia di chiavi pubblica/privata
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//Generazioni di chiavi con Diffie Hellman keyGen = KeyPairGenerator.getInstance("DH"); keyGen.initialize(576); keypair = keyGen.genKeyPair(); privateKey = keypair.getPrivate(); publicKey = keypair.getPublic(); // Generazione di chiavi con RSA a 1024 bit keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); keypair = keyGen.genKeyPair(); privateKey = keypair.getPrivate(); publicKey = keypair.getPublic(); |
Il generatore di chiavi viene istanziato con due diversi servizi (che ovviamente devo essere disponibili nel vostro JDK). In questo modo abbiamo le chiavi pubbliche e private che possiamo utilizzare nei nostri programmi per la sicurezza o quando dobbiamo creare un applicazione client che deve scambiare chiavi con un server che le richiede.