Fabrizio Russo Libreria jRsaUtil


2017/01/11   Libreria jRsaUtil

jRsaUtil e' una libreria per crittografare e firmare dati utilizzando l'algoritmo RSA a chiave simmetrica.

Download JAR

La prima cosa da fare e' quella di generare una coppia di chiavi (chiave pubblica e chiave segreta), di esportarle e di memorizzarle in un luogo sicuro in modo da poter essere recuperate quando necessario.
Per questo c'e' la classe RsaBuilder che, indicando la lunghezza in byte della chiave da generare, mette a disposizione i metodi per creare le chiavi e per poterli salvare su file.


RsaBuilder rsaBuilder;
rsaBuilder = new RsaBuilder(1024);
rsaBuilder.createKeys();
rsaBuilder.writeToFile("publicKey.dat", rsaBuilder.getPublicKey().getEncoded());
rsaBuilder.writeToFile("privateKey.dat", rsaBuilder.getPrivateKey().getEncoded());

Nota: Ad oggi una chiave con meno di 1024 bit non e' considerata sicura. Meglio ancora 2048 (ma i tempi di codifica/decodifica si allungano di molto se non si dispone di un hardware dedicato).

Anche se deve essere fatta una volta sola, anche la generazione di una coppai di chiavi richiede del termpo, ad esempio, il tempo medio necessario per la creazione di 500 chiavi di diversa lunghezza e' stato:

  • 500 bit : 5.5 secondi
  • 1024 bit : 26,5 secondi
  • 2048 bit: 224 secondi

 

Cifratura di un testo

Ottenute le chiavi (generate o caricate successivamente) รจ possibile utilizzarle tramite la classe RsaHelper per cifrare/decifrare dei messaggi


RsaHelper rsaHelper = new RsaHelper("privateKey.dat", "publicKey.dat");

PrivateKey privateKey = rsaHelper.getPrivateKey();
PublicKey publicKey = rsaHelper.getPublicKey();

String msg = "Messaggio segreto da cifrare!";

String encrypted_msg = rsaHelper.encryptText(msg, privateKey);
String decrypted_msg = rsaHelper.decryptText(encrypted_msg, publicKey);

dove privateKey.dat e publicKey.dat sono i file dove tramite la classe RsaBuilder sono state salvate le chiavi generate in precedenza.

I metodi encryptText e decryptText sono i metodi che effettuano la cifratura e la decifratura del testo.

Nota; In entrambi i metodi e' possibile passare sia la chiave privata che la chiave pubblica come secondo argomento, questo per poter lasciare la liberta' di decidere se si sta cifrando (o decifrando) in modo che tutti possano leggere il testo ed essere sicuri della fonte (se cifro con la mia chiave private, tutti possono decodificare sapendo con sicurezza che solo io posso aver cifrato) o si sta cifrando in modo che solo il destinatario possa risalire al testo originale (posso cifrare con la chiave pubblica di qualcun altro per essere sicuro che solo lui possa decodificare il messaggio essendo l'unico ad avere la chiave privata)

Firma di un messaggio

Ci sono scenari in cui non importa che il messaggio sia segreto o meno ma si sia sicuri solo del fatto che il messaggio non sia alterato. In questo caso un firma digitale del testo consente di verificare che il messaggio e la firma non siano alterati. Una sola alterazione del testo non consente di validare la firma.

La classe RsaHelper dispone dei metodi sign e verifySignature per firmare un testo e verificarlo.


RsaHelper rsaHelper = new RsaHelper("privateKey.dat", "publicKey.dat");

String text = "Testo del messaggio da firmare !!!";
byte[] firma = rsaHelper.sign(text);
		
boolean validSignature = rsaHelper.verifySignature(text.getBytes(), firma);