/**
* @author netarrow
*
*/
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import java.io.*;
public class RSACoder {
private static void codifica
() throws Exception {
// LEGGI CHIAVE PUBBLICA CODIFICATA IN X509
System.
out.
print("Inserire keystore della chiave pubblica: ");
String publicKeystore
= br.
readLine();
int i = 0;
while((i = fis.read()) != -1) {
baos.write(i);
}
fis.close();
byte[] publicKeyBytes = baos.toByteArray();
baos.close();
// CONVERTI CHIAVE PUBBLICA DA X509 A CHIAVE UTILIZZABILE
// Inizializza convertitore da X.509 a chiave pubblica
// Inizializza un KeyFactory per ricreare la chiave usando RSA
// Crea una chiave pubblica usando generatePublic di KeyFactory in base la chiave decodificata da ks
// LEGGI FILE SORGENTE
System.
out.
print("\nInserire path file da codificare, tra \" se contiene spazi: ");
String sorgente
= br.
readLine();
baos.reset();
byte[] plainFile;
i = 0;
while((i = fis.read()) != -1) {
baos.write(i);
}
fis.close();
plainFile = baos.toByteArray();
// CODIFICA FILE SORGENTE
System.
out.
print("\nInizio codifica");
// Inizializzo un cifrario che usa come algoritmo RSA, come modalità ECB e come padding PKCS1
Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
// Lo inizializzo dicendo modalità di codifica e chiave pubblica da usare
c.init(Cipher.ENCRYPT_MODE, publicKey);
// codifico e metto il risultato in encodeFile
byte[] encodeFile = c.doFinal(plainFile);
System.
out.
println(". Codifica terminata!");
// SALVA FILE CODIFICATO
System.
out.
print("\nInserire path del file in cui salvare la codifica, tra \" se contiene spazi: ");
fos.write(encodeFile);
fos.close();
}
private static void decodifica
() throws Exception {
// LEGGI CHIAVE PRIVATA CODIFICATA IN PKCS#8
System.
out.
print("\nInserire keystore chiave provata: ");
String privateKeystore
= br.
readLine();
int i = 0;
while((i = fis.read()) != -1) {
baos.write(i);
}
fis.close();
byte[] privateKeyBytes = baos.toByteArray();
baos.close();
// CONVERTI CHIAVE PRIVATA PKCS8 IN CHIAVE NORMALE
// LEGGI FILE CODIFICATO
System.
out.
print("\nInserire path file da codificare, tra \" se contiene spazi: ");
String sorgente
= br.
readLine();
baos.reset();
byte[] codFile;
i = 0;
while((i = fis.read()) != -1) {
baos.write(i);
}
fis.close();
codFile = baos.toByteArray();
// DECODIFICA
System.
out.
print("\nInizio decodifica");
Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
c.init(Cipher.DECRYPT_MODE, privateKey);
byte[] plainFile = c.doFinal(codFile);
System.
out.
println(". Decodifica terminata!");
// SALVA FILE
System.
out.
print("\nInserire path del file in cui salvare la decodifica, tra \" se contiene spazi: ");
fos.write(plainFile);
fos.close();
}
int scelta = 0;
do {
System.
out.
println("\n\nInserire opzione: ");
System.
out.
println("1. crea coppia di chiavi");
System.
out.
println("2. codifica");
System.
out.
println("3. decodifica");
System.
out.
println("4. esci\n");
option = br.readLine();
try {
System.
out.
println("Inserire numero intero");
continue;
}
switch(scelta) {
case 1:
createKeys();
break;
case 2:
codifica();
break;
case 3:
decodifica();
break;
case 4:
break;
default:
System.
out.
println("Le opzioni sono 1, 2, 3 o 4");
}
} while(!(scelta >= 1 && scelta <= 4));
}
private static void createKeys
() throws Exception {
// GENERA COPPIA DI CHIAVI
//Un reader per leggere la console
System.
out.
print("Inizio generazione chiavi RSA");
//inizializza un generatore di coppie di chiavi usando RSA
// le chiavi sono molto lunghe: 1024 bit sono 128 byte.
// La forza di RSA è nell'impossibilità pratica di fattorizzare
// numeri così grandi.
kpg.initialize(1024);
// genera la coppia
KeyPair kp
= kpg.
generateKeyPair();
System.
out.
print(". Chiavi generate!\n");
// SALVA CHIAVE PUBBLICA
System.
out.
print("Inserire keystore per la chiave pubblica: ");
String publicKeystore
= input.
readLine();
// ottieni la versione codificata in X.509 della chiave pubblica
// (senza cifrare)
byte[] publicBytes = kp.getPublic().getEncoded();
// salva nel keystore selezionato dall'utente
fos.write(publicBytes);
fos.close();
// SALVA CHIAVE PRIVATA
System.
out.
print("Inserire keystore per la chiave privata: ");
String privateKeystore
= input.
readLine();
// ottieni la versione codificata in PKCS#8
byte[] privateBytes = kp.getPrivate().getEncoded();
fos.write(privateBytes);
fos.close();
}
}