ottobre 22, 2017

Asymmetric key encryption in Java

JCA (Java Cryptography Architecture) mette a disposizione un set di API per implementare logiche di sicurezza basate su firme digitali, gestione di message digest, creazione e validazione di certificati, meccanismi di cifratura, generazione e gestione di chiavi e così via. Vediamo come realizzare una semplice implementazione di cifratura a chiave asimmetrica, conosciuta anche come Public Key Cryptography. In questo esempio utilizzerò un file di origine scritto in chiaro. Dopo aver generato una coppia di chiavi RSA a 2048 bit, utilizzerò la chiave pubblica per crittografare il file e quella privata per decriptarlo.

giuseppe-urso-asymmetric-key-encryption-in-java-03

Per generare la coppia di chiavi ho utilizzato l’oggetto KeyPairGenerator di JCA che supporta l’algoritmo RSA fino a 2048 bits. Per crittografare i dati in chiaro sul file di origine ho utilizzato l’oggetto Cipher con la stringa che definisce le operazioni di transformation “RSA/ECB/PKCS1Padding” da eseguire durante il processo di encryption/decryption. JCA definisce questi oggetti “engine classes“, di seguito una visione ad alto livello.

giuseppe-urso-asymmetric-key-encryption-in-java-01

giuseppe-urso-asymmetric-key-encryption-in-java-02

THE SOURCE CODE (java-security)

SUBVERSION
svn co https://github.com/giuseppeurso-eu/java-security/trunk   java-security 
GIT
git clone https://github.com/giuseppeurso-eu/java-security

ROADMAP

STEP 1. Simple Maven project
STEP 2. Asymmetric Cipher Implementation
STEP 3. Test 2048-RSA file encryption/decryption

STEP 1. Simple Maven Project

Creo un progetto Maven generico utilizzando l’archetipo “quickstart” e aggiungo le dipendenze da junit e commons-io di Apache per implementare dei test e alcune operazione sui file.

STEP 2. Asymmetric Cipher Implementation

La classe AsymmetricCipher implementa i metodi per generare le chiavi RSA e per cifrare/decifrare i dati. Per generare la coppia di chiavi pubblica/privata utilizzo java.security.KeyPairGenerator mentre per le operazioni di encryption/decryption utilizzo l’oggetto javax.crypto.Cipher.

STEP 3. Test 2048-RSA file encryption/decryption

Creo un classe di Test su cui lanciare alcuni test di unità sui metodi implementati. Per effettuare un test completo sul processo di encription/decryption dei dati, creo un semplice file con del testo in chiaro. Su tale file, dopo aver creato una coppia di chiavi RSA a 2048 bit, eseguo il metodo AsymmetricCipher.encrypt e salvo i byte in uscita su un nuovo file (FileUtils.writeByteArrayToFile di commons-io). Questo file non sarà “human-redable” in quanto criptato. Per testarne la consistenza e l’integrità rispetto all’originale, effettuo l’operazione inversa di decrypting. Confronto e verifico che i byte del file originale siano identici a quelli del file decriptato.

Con Maven lancio il build sul progetto e verifico l’esito dei test. Se non ci sono errori viene generato un file criptato e un nuovo file decriptato consistente rispetto all’originale.

giuseppe-urso-asymmetric-key-encryption-in-java-04

Related posts

Leave a Reply

Your email address will not be published.