Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Esempi crittografia asimmetrica RSA - RSACoder.java

RSACoder.java

Caricato da: Netarrow
Scarica il programma completo

  1. /**
  2.  * @author netarrow
  3.  *
  4.  */
  5.  
  6. import java.security.*;
  7. import java.security.spec.*;
  8.  
  9. import javax.crypto.*;
  10.  
  11. import java.io.*;
  12.  
  13. public class RSACoder {
  14.        
  15.         private static void codifica() throws Exception {
  16.                
  17.                 // LEGGI CHIAVE PUBBLICA CODIFICATA IN X509
  18.                
  19.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  20.                 System.out.print("Inserire keystore della chiave pubblica: ");
  21.                 String publicKeystore = br.readLine();
  22.                 FileInputStream fis = new FileInputStream(publicKeystore);
  23.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  24.                 int i = 0;
  25.                 while((i = fis.read()) != -1) {
  26.                         baos.write(i);
  27.                 }
  28.                 fis.close();
  29.                 byte[] publicKeyBytes = baos.toByteArray();
  30.                 baos.close();
  31.                
  32.                 // CONVERTI CHIAVE PUBBLICA DA X509 A CHIAVE UTILIZZABILE
  33.                
  34.                 // Inizializza convertitore da X.509 a chiave pubblica
  35.                 X509EncodedKeySpec ks = new X509EncodedKeySpec(publicKeyBytes);
  36.                 // Inizializza un KeyFactory per ricreare la chiave usando RSA
  37.                 KeyFactory kf = KeyFactory.getInstance("RSA");
  38.                 // Crea una chiave pubblica usando generatePublic di KeyFactory in base la chiave decodificata da ks
  39.                 PublicKey publicKey = kf.generatePublic(ks);
  40.                
  41.                 // LEGGI FILE SORGENTE
  42.                
  43.                 System.out.print("\nInserire path file da codificare, tra \" se contiene spazi: ");
  44.                 String sorgente = br.readLine();
  45.                 fis = new FileInputStream(sorgente);
  46.                 baos.reset();
  47.                 byte[] plainFile;
  48.                 i = 0;
  49.                 while((i = fis.read()) != -1) {
  50.                         baos.write(i);
  51.                 }
  52.                 fis.close();
  53.                 plainFile = baos.toByteArray();
  54.                
  55.                 // CODIFICA FILE SORGENTE
  56.                 System.out.print("\nInizio codifica");
  57.                 // Inizializzo un cifrario che usa come algoritmo RSA, come modalità ECB e come padding PKCS1
  58.                 Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  59.                 System.out.print(".");
  60.                 // Lo inizializzo dicendo modalità di codifica e chiave pubblica da usare
  61.                 c.init(Cipher.ENCRYPT_MODE, publicKey);
  62.                 System.out.print(".");
  63.                 // codifico e metto il risultato in encodeFile
  64.                 byte[] encodeFile = c.doFinal(plainFile);
  65.                 System.out.println(". Codifica terminata!");
  66.                
  67.                 // SALVA FILE CODIFICATO
  68.                
  69.                 System.out.print("\nInserire path del file in cui salvare la codifica, tra \" se contiene spazi: ");
  70.                 String dest = br.readLine();
  71.                 FileOutputStream fos = new FileOutputStream(dest);
  72.                 fos.write(encodeFile);
  73.                 fos.close();
  74.         }
  75.        
  76.         private static void decodifica() throws Exception {
  77.  
  78.                 // LEGGI CHIAVE PRIVATA CODIFICATA IN PKCS#8
  79.                
  80.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  81.                 System.out.print("\nInserire keystore chiave provata: ");
  82.                 String privateKeystore = br.readLine();
  83.                 FileInputStream fis = new FileInputStream(privateKeystore);
  84.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  85.                 int i = 0;
  86.                 while((i = fis.read()) != -1) {
  87.                         baos.write(i);
  88.                 }
  89.                 fis.close();
  90.                 byte[] privateKeyBytes = baos.toByteArray();
  91.                 baos.close();
  92.                
  93.                 // CONVERTI CHIAVE PRIVATA PKCS8 IN CHIAVE NORMALE
  94.                
  95.                 PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(privateKeyBytes);
  96.                 KeyFactory kf = KeyFactory.getInstance("RSA");
  97.                 PrivateKey privateKey = kf.generatePrivate(ks);
  98.                
  99.                 // LEGGI FILE CODIFICATO
  100.                
  101.                 System.out.print("\nInserire path file da codificare, tra \" se contiene spazi: ");
  102.                 String sorgente = br.readLine();
  103.                 fis = new FileInputStream(sorgente);
  104.                 baos.reset();
  105.                 byte[] codFile;
  106.                 i = 0;
  107.                 while((i = fis.read()) != -1) {
  108.                         baos.write(i);
  109.                 }
  110.                 fis.close();
  111.                 codFile = baos.toByteArray();
  112.                
  113.         // DECODIFICA
  114.                
  115.                 System.out.print("\nInizio decodifica");
  116.                 Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  117.                 System.out.print(".");
  118.                 c.init(Cipher.DECRYPT_MODE, privateKey);
  119.                 System.out.print(".");
  120.                 byte[] plainFile = c.doFinal(codFile);
  121.                 System.out.println(". Decodifica terminata!");
  122.                
  123.                 // SALVA FILE
  124.                
  125.                 System.out.print("\nInserire path del file in cui salvare la decodifica, tra \" se contiene spazi: ");
  126.                 String dest = br.readLine();
  127.                 FileOutputStream fos = new FileOutputStream(dest);
  128.                 fos.write(plainFile);
  129.                 fos.close();
  130.         }
  131.        
  132.         public static void main(String args[]) throws Exception {
  133.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  134.                 int scelta = 0;
  135.                 String option;
  136.                 do {
  137.                         System.out.println("\n\nInserire opzione: ");
  138.                         System.out.println("1. crea coppia di chiavi");
  139.                         System.out.println("2. codifica");
  140.                         System.out.println("3. decodifica");
  141.                         System.out.println("4. esci\n");
  142.                         option = br.readLine();
  143.                         try {
  144.                                 scelta = Integer.parseInt(option);
  145.                         } catch(NumberFormatException nfe) {
  146.                                 System.out.println("Inserire numero intero");
  147.                                 continue;
  148.                         }
  149.                         switch(scelta) {
  150.                         case 1:
  151.                                 createKeys();
  152.                                 break;
  153.                                 case 2:
  154.                                         codifica();
  155.                                         break;
  156.                                         case 3:
  157.                                                 decodifica();
  158.                                                 break;
  159.                                                 case 4:
  160.                                                         System.exit(0);
  161.                                                         break;
  162.                                                 default:
  163.                                                         System.out.println("Le opzioni sono 1, 2, 3 o 4");
  164.                         }
  165.                 } while(!(scelta >= 1 && scelta <= 4));
  166.         }
  167.        
  168.         private static void createKeys() throws Exception {
  169.                
  170.                 // GENERA COPPIA DI CHIAVI
  171.                
  172.                 //Un reader per leggere la console
  173.                 BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  174.                 System.out.print("Inizio generazione chiavi RSA");
  175.                 //inizializza un generatore di coppie di chiavi usando RSA
  176.                 KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
  177.                 System.out.print(".");
  178.                 // le chiavi sono molto lunghe: 1024 bit sono 128 byte.
  179.                 // La forza di RSA è nell'impossibilità pratica di fattorizzare
  180.                 // numeri così grandi.
  181.                 kpg.initialize(1024);
  182.                 System.out.print(".");
  183.                 // genera la coppia
  184.                 KeyPair kp = kpg.generateKeyPair();
  185.                 System.out.print(". Chiavi generate!\n");
  186.                
  187.                 // SALVA CHIAVE PUBBLICA
  188.                
  189.                 System.out.print("Inserire keystore per la chiave pubblica: ");
  190.                 String publicKeystore = input.readLine();
  191.                 // ottieni la versione codificata in X.509 della chiave pubblica
  192.                 // (senza cifrare)
  193.                 byte[] publicBytes = kp.getPublic().getEncoded();
  194.                 // salva nel keystore selezionato dall'utente
  195.                 FileOutputStream fos = new FileOutputStream(publicKeystore);
  196.                 fos.write(publicBytes);
  197.                 fos.close();
  198.                
  199.                 // SALVA CHIAVE PRIVATA
  200.                
  201.             System.out.print("Inserire keystore per la chiave privata: ");
  202.                 String privateKeystore = input.readLine();
  203.                 // ottieni la versione codificata in PKCS#8
  204.                 byte[] privateBytes = kp.getPrivate().getEncoded();
  205.                
  206.                 fos = new FileOutputStream(privateKeystore);
  207.                 fos.write(privateBytes);
  208.                 fos.close();
  209.         }
  210. }