Crittografia Asimmetrica in Java
La crittografia Asimmetrica in java è un algoritmo che usa due chiavi una per la cifratura ed una per la decifratura. Spiegazione su come implementare RSA.
Introduzione
Un algoritmo di cifratura si dice a chiave Asimmetrica quando si usane sue chiavi, una viene usata sia per la cifratura ed è pubblica,una si usa per la successiva decifratura ed è privata.
Le implementazioni svolte nella Demo fa riferimento al seguente algoritmo di Cifratura:
- RSA
RSA è un algoritmo che permette di usare chiave di lunghezza 1024 o 2048 bit.
Un limite della Crittografia Asimmetrica è la complessità dell’algoritmo elevata, in quanto permette di cifrare solo piccole quantità di dati, per grandi quantità di dati viene usata un altro tipo di Crittografia Asimmetrica detta a chiave di sessione che consiste nei seguenti passi:
- ( e, d) un public-private key pair
- P un “grande” payload
- K newSimmetricKey()
- M = [ Ek(P), Ee(K) ]
Un ibrido tra Crittografia Simmetrica e Crittografia Asimmetrica, viene generata una chiave simmetrica e viene cifrata con la chiave pubblica della controparte, e con la chiave simmetrica viene crittografato il Payload.
Un alternativa al normale pudding per RSA è l’algoritmo OAEP, dove prima di eseguire la cifratura RSA effettua due funzioni hash G e H (SHA-1 o SHA-256).
Implementazione
Principali classi ed interfacce utilizzate nella demo sono state:
- security.KeyPair
- getPublic(), getPrivate()
- security.PublicKey(interfaccia)
- crypto.PrivateKey(interfaccia)
- security.KeyPairGenerator
- genKeyPair()
e la classe Cipher come per la Crittografia Simmetrica:
- getInstance(“algorithm/mode/padding”, provider)
- Algorithm
- RSA
- Mode
- ECB
- Padding
- NoPadding
- PKCS1Padding
- OAEPWithSHA-1AndMGF1Padding
- OAEPWithSHA-256AndMGF1Padding
- Algorithm
- init(mode, key)
- ENCRYPT_MODE
- publicKey
- DECRYPT_MODE
- privateKey
- ENCRYPT_MODE
- update(bytes)
- doFinal(bytes)
I passi della Crittografia Asimmetrica
I passi per effettuare la Crittografia Asimmetrica in ambiente Java sono i seguenti
(ora un esempio di Crittografia RSA con padding PKCS1Padding):
- Creazione di una chiave
- KeyPairGenerator generator = KeyPairGenerator.getIstance(“RSA”);
- init(1024);
- KeyPair pair = generator.generateKeyPair();
- Key pubKey = pair.getPublic();
- Key privKey = pair.getPrivate();
- Creazione ed inizializzazione di un cifrario
- Chiper cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”);
- Cifratura
- init(Cipher.ENCRYPT_MODE, pubKey);
- byte[] cipherText = cipher.doFinal(stringToEncrypt.getBytes());
- Decifratura
- init(Cipher.DECRYPT_MODE, privKey);
- byte[] plainText = cipher.doFinal(cipherText);
La coppia di chiavi (pubblica, privata) vengono codificate con le seguenti codifiche, chiave pubblica con codifica X.509 e chiave privata con codifica PKCS#8, quindi se vogliamo mantenere le chiavi su dei file bisogna usare la giusta codifica e decodifica dei byte della chiave:
Decodifica
- Public key
- KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
- X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes);
- PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
- Private key
- KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
- PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes);
- PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec)
Sicurezza Cifratura Asimmetrica
La sicurezza riguardo la cifratura Asimmetrica sta nel problema della fattorizzazione, che è un problema computazionalmente intrattabile.
In allegato una demo realizzata in Java da me:
La relazione dove è presente quest’articolo:
Delitala_Oreste_Crittografia_Java_Relazione
Una breve presentazione sull’argomento: