2012-03-07 28 views
27

Desidero decrittografare un file utilizzando le chiavi PGP.PGP Crittografia e decrittografia con Java

Ho scaricato l'installer delle chiavi PGP e installato. Usando che ho creato un file di testo e crittografato il file di testo utilizzando le chiavi PGP.

Quindi ho ottenuto un file di estensione .pgp che è crittografato. Ora voglio decriptare lo stesso file usando il codice Java usando PGP.

In Java, come si decodifica un file di testo già crittografato con chiavi PGP?

risposta

1

Prova a dare un'occhiata a JCA CryptoSpec. Non sono sicuro di PGP, ma penso che tu possa trovare lì un Provider per il tuo scopo.

Per quanto mi ricordo il codice dovrebbe essere qualcosa di simile:

// get cipher object for password-based encryption 
Cipher cipher1 = Cipher.getInstance("PBEWithMD5AndDES");//You have to pass here algorithm name which PGP uses. May be you have to find and init provider for it. 

// initialize cipher for decryption, using one of the 
// init() methods that takes an AlgorithmParameters 
// object, and pass it the algParams object from above 
cipher1.init(Cipher.DECRYPT_MODE, myKey, algParams); 


FileInputStream fis; 
FileOutputStream fos; 
CipherInputStream cis; 

fis = new FileInputStream("/tmp/a.txt"); 
cis = new CipherInputStream(fis, cipher1); 
fos = new FileOutputStream("/tmp/b.txt"); 
byte[] b = new byte[8]; 
int i = cis.read(b); 
while (i != -1) { 
    fos.write(b, 0, i); 
    i = cis.read(b); 
} 
fos.close(); 
5

Try fanno vedere questo argomento. Ho appena dato una breve occhiata a questo, ma penso che sia ciò di cui hai bisogno. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-java/

+2

Come la maggior parte delle altre risposte qui, il legato di blog voce utilizza i pacchetti [Bouncy Castle Java] (https://www.bouncycastle.org /java.html). Il codice base di Bouncy Castle include molti [esempi PGP] (https://github.com/bcgit/bc-java/tree/master/pg/src/main/java/org/bouncycastle/openpgp/examples). Se vuoi vedere questi esempi separati in un progetto standalone con le dipendenze di Bouncy Caste tirati da Maven, vedi [openpgp-bc-examples] (https://github.com/george-hawkins/openpgp-bc-examples) . –

3

BouncyCastle ha certo supporto per OpenPGP ("certo" perché menzionano solo RFC 2440 e non RFC 4880 che è più recente). Puoi anche dare un'occhiata al pacchetto OpenPGPBlackbox della nostra SecureBlackbox (edizione Java), che fornisce il supporto completo per OpenPGP incluso l'accesso LDAP ai tasti e altre funzioni avanzate.

+2

BouncyCastle ora supporta anche RFC4880 .. – Saumyaraj

5

Ho scritto un codice completo in Java con BounceCastle API e OpenPGP. In questo codice sorgente troverai come generare la coppia di chiavi, crittografare e decodificare i file. Date un'occhiata a: https://github.com/damico/OpenPgp-BounceCastle-Example

+0

che il progetto ha funzionato per me dopo aver esportato il file chiave senza ascii mask e "installando" la libreria JCE lib. – 4F2E4A2E

4

È possibile scrivere un semplice wrapper su GNU PGP che esegue fondamentalmente il comando GPG da Java.

Il vantaggio dell'utilizzo di GNU PGP è che non sarà legato a una libreria specifica. La quantità di documentazione e supporto disponibile online per le librerie di terze parti non è ricca come altri schemi di crittografia poiché la maggior parte richiama PGP da riga di comando. Le chiavi PGP rimarranno anche in un posto comune, cioè il portachiavi specifico dell'utente piuttosto che esportato in più file.

Il comando GPG per la decrittazione è

echo "password" | gpg --passphrase-fd 0 --output plaintext.txt --decrypt encrypted.gpg 

Specificando passphrase-fd come 0 è possibile fornire la password attraverso il flusso di input standard.

Ecco come il codice Java sembra -

public static void decryptFile(String privKeyPass) { 
    String[] cmd = new String[]; 
    int i = 7; 
    cmd[i++] = "gpg"; 
    cmd[i++] = "--passphrase-fd"; 
    cmd[i++] = "0"; 
    cmd[i++] = "--output"; 
    cmd[i++] = "plaintext.txt"; 
    cmd[i++] = "--decrypt"; 
    cmd[i++] = "encrypted.gpg"; 
    Process process = Runtime.getRuntime().exec(cmd); 

    BufferedWriterout = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
    out.write(privKeyPass); 
    try { 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // Read process.getInputStream() 
    // Read process.getErrorStream() 
} 
Problemi correlati