2009-09-21 15 views
33

Chciałbym móc szyfrować pliki na dysku i/lub danych w pamięci przy użyciu GnuPG z aplikacji Java. Jeśli to możliwe, chciałbym uniknąć konieczności wykonywania wywołań systemowych do narzędzi wiersza poleceń GPG.Czy istnieje dobra biblioteka szyfrowania GnuPG dla Java/Scala?

Czy jest zalecana biblioteka, czy możesz polecić najlepsze podejście do szyfrowania GPG z Java (lub Scala)?

Rozwijam i zamierzam uruchomić aplikację w środowisku Linux, chociaż preferowane byłoby rozwiązanie wieloplatformowe.

Odpowiedz

21

Możesz spróbować wywołać API JAVA z BouncyCastle.org.

Jego documentation wspomina:

Pakiet Bouncy Castle Crypto jest wdrożenie Java algorytmów kryptograficznych.

Masz tutaj an example of openpgp ByteArrayHandler.

Jednak może być trochę incompatibility between BouncyCastle encryption and GnuGP encryption, ponieważ BouncyCastle nie używa GnuPG, ale raczej implementuje OpenPGP (RFC2440) w Javie.

+0

Dzięki za odpowiedź - wygląda obiecująco. Zrobię to i zgłoś, czy mogę sprawić, by działał z GnuPG. Wygląda na to, że może to być po prostu ostrożny wybór wzajemnie zgodnych opcji. –

+6

Mam to teraz. Polecam, patrząc na przykładowy kod w org.bouncycastle.openpgp.examples.KeyBasedFileProcessor w szczególności. Podstępne bity obejmowały znajdowanie pożądanego klucza publicznego w kolekcji kluczy i opracowanie, że implementacja JCE dostarczona w standardowym JDK jest ułomna, i musisz jawnie pobrać i zainstalować pliki zasad Javy (JCC) Unlimited Strength Jurisdiction Policy 6 "ze strony internetowej Sun. –

+1

@ James Shade: dziękuję za informację zwrotną. Bardzo pouczający. – VonC

3

Niedawno musiałem pracować nad odszyfrowaniem szyfrowania GPG i znalazłem bibliotekę PGP BountyCastle. Kroki były

1) Dodać wersji we właściwościach pom.xml

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

2) Dodaje się następujące zależności

 <!-- 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) w klasie realizacji dodany dostawcy Java Bezpieczeństwa

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

4) Reszta kodu była po prostu prostą implementacją Javy

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

Mam nadzieję, że to pomoże.

+0

Witam, możesz rozwinąć to trochę. Mam problem z tym. – surhidamatya

+1

Otrzymuję wyjątek klasy odlewów przy użyciu powyższego kodu: PGPPublicKeyEncryptedData nie można przesłać do PGPPBEEncryptedData. :-( –

+0

Tak samo, jak @ShintaSmith – TomazStoiljkovic

2

Istnieje https://github.com/smartrevolution/gnupg-for-java bazująca na gpgme i działająca na GnuPG 1.4. Aktualizujemy go dla GnuPG 2.x i używamy go w naszej aplikacji na Androida. Można uzyskać kod do tych tutaj:

+0

Zrobiłem aplikację testową, aby odszyfrować wiadomość za pomocą gnupg-for-java, która pomyślnie odszyfrowała, ale rozbił się na 'fclose' (zanim została zmieniona, aby zwrócić wynik). użycia gpgme, gdzie nie używają fclose, ale po prostu 'gpgme_data_release' .Nie wygląda na to, że jest gotowe do pracy Przykład podany w repozytorium działał dobrze – Alexey

+0

Nasz rozwidlenie gnupg-for-java może na pewno wykorzystam trochę pracy, ale w pełni działa, są pewne denerwujące błędy. –

Powiązane problemy