2009-09-21 5 views
33

Mi piacerebbe essere in grado di crittografare i file su disco e/o dati in memoria usando GnuPG da un'applicazione Java. Se possibile, vorrei evitare di dover effettuare chiamate di sistema agli strumenti della riga di comando GPG.Esiste una buona libreria di crittografia GnuPG per Java/Scala?

Esiste una libreria consigliata oppure è possibile consigliare l'approccio migliore alla crittografia GPG da Java (o Scala)?

Sto sviluppando e intendo eseguire l'applicazione in un ambiente Linux, anche se sarebbe preferibile una soluzione multipiattaforma.

risposta

21

Si può provare a chiamare l'API JAVA di BouncyCastle.org.

sua documentation cita:

Il pacchetto Bouncy Castle Crypto è un'implementazione Java di algoritmi crittografici.

Hai qui an example of openpgp ByteArrayHandler.

Ci possono essere alcuni incompatibility between BouncyCastle encryption and GnuGP encryption, dal momento che BouncyCastle non usa GnuPG, ma implementa OpenPGP (RFC2440) in Java.

+0

Grazie per la risposta - sembra essere molto promettente. Ci proveremo e riferirò se posso farlo funzionare con GnuPG. Sembra che potrebbe essere solo un'attenta selezione di opzioni reciprocamente compatibili. –

+6

Ora funziona. Consiglio di guardare il codice di esempio in org.bouncycastle.openpgp.examples.KeyBasedFileProcessor in particolare. I bit complicati comprendevano la ricerca della chiave pubblica desiderata all'interno della raccolta dei portachiavi e l'implementazione dell'implementazione dell'implementazione JCE fornita nel JDK standard, ed è necessario scaricare e installare in modo esplicito i file dei criteri di giurisdizione illimitata di Java Cryptography Extension (JCE) 6 "dal sito Web di Sun. –

+1

@James Shade: grazie per il feedback. Molto istruttivo. – VonC

3

Recentemente ho dovuto lavorare sulla decodifica della codifica GPG e ho trovato che la libreria PGP di BountyCastle fa il trucco. I gradini erano

1) Aggiungere la versione nelle proprietà pom.xml

 <org.bouncycastle.version>1.46</org.bouncycastle.version> 

2) Aggiungere le seguenti dipendenze

 <!-- Dependency for PGP and GPG Encryption-Decryption --> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcmail-jdk15</artifactId> 
      <version>${org.bouncycastle.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcpg-jdk15</artifactId> 
      <version>${org.bouncycastle.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-jdk15</artifactId> 
      <version>${org.bouncycastle.version}</version> 
     </dependency> 

3) nella classe di implementazione aggiunto il provider con Java Security

  Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

4) Il resto del codice era solo una semplice implementazione Java

File encryptedFile = new File(encryptedFileName); 
    byte[] encryptedByteArray = FileUtils.readFileToByteArray(inputFile);  
    byte[] decryptedByteArray = ByteArrayHandler.decrypt(encryptedByteArray, passPhrase.toCharArray()); 
    String decryptedString = new String(decryptedByteArray); 

Spero che questo aiuti.

+0

Ciao, puoi elaborarlo un po '. Iam ha problemi con esso. – surhidamatya

+1

Ricevo un'eccezione di classe utilizzando il codice precedente: PGPPublicKeyEncryptedData non può essere trasmesso a PGPPBEEncryptedData. :-( –

+0

Come @ShintaSmith – TomazStoiljkovic

2

C'è https://github.com/smartrevolution/gnupg-for-java che è basato su gpgme e funziona su GnuPG 1.4. Lo stiamo aggiornando per GnuPG 2.x e lo stiamo utilizzando nella nostra app per Android. È possibile ottenere il codice per coloro che sono qui:

+0

Ho creato un'app di prova per decrittografare un messaggio utilizzando gnupg-for-java. È stata decodificata con successo ma si è bloccata in 'fclose' (prima che cambiasse per restituire il risultato). di utilizzo di gpgme, dove non usano fclose, ma solo 'gpgme_data_release'. Quindi non sembra una soluzione pronta all'uso Esempio, fornito nel repository ha funzionato bene – Alexey

+0

La nostra fork di gnupg-for-java potrebbe Sicuramente uso un po 'di lavoro, ma funziona completamente. Ci sono alcuni fastidiosi trucchi. –