web-dev-qa-db-fra.com

Chiffrement et déchiffrement PGP avec Java

Je veux décrypter un fichier à l'aide des clés PGP.

J'ai téléchargé et installé le programme d'installation des clés PGP. À l'aide de cela, j'ai créé un fichier texte et crypté le fichier texte à l'aide des clés PGP.

Ensuite, j'ai obtenu un fichier d'extension .pgp qui est crypté. Maintenant, je veux décrypter le même fichier en utilisant Java code en utilisant PGP.

En Java, comment décrypter un fichier texte déjà crypté à l'aide de clés PGP?

31
user1216228

Essayez de voir ce sujet. Je viens de l'examiner brièvement, mais je pense que c'est ce dont vous avez besoin. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-Java/

6
MikhailSP

Vous pouvez écrire un simple wrapper autour de GNU PGP qui exécute essentiellement la commande GPG à partir de Java.

L'avantage d'utiliser GNU PGP est que vous ne serez pas lié à une bibliothèque spécifique. La quantité de documentation et de support disponible en ligne pour les bibliothèques tierces n'est pas aussi riche que les autres schémas de cryptage puisque la plupart invoquer PGP à partir de la ligne de commande. Les clés PGP resteront également dans un endroit commun, c'est-à-dire le jeu de clés spécifique à l'utilisateur plutôt qu'exportées dans plusieurs fichiers.

La commande GPG pour le déchiffrement est

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

En spécifiant la phrase secrète-fd à 0, vous pouvez fournir le mot de passe via le flux d'entrée standard.

Voici à quoi ressemble le code Java -

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()
}
6
sunnyside

J'ai écrit un code complet en Java avec l'API BounceCastle et OpenPGP. Dans ce code source, vous trouverez comment générer la paire de clés, crypter et décrypter les fichiers. Jetez un œil à: - https://github.com/damico/OpenPgp-BounceCastle-Example

6
Damico

BouncyCastle a un certain support pour OpenPGP ("certain" car ils ne mentionnent que le RFC 2440 et non le RFC 4880 qui est plus récent). Vous pouvez également jeter un oeil à OpenPGPBlackbox package de notre SecureBlackbox (édition Java), qui fournit un support complet pour OpenPGP, y compris l'accès LDAP aux clés et autres fonctions avancées.

Essayez de jeter un œil à JCA CryptoSpec . Je ne suis pas sûr de PGP, mais je pense que vous pouvez y trouver un fournisseur pour votre but.

Pour autant que je me souvienne, le code devrait être quelque chose comme:

// 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();
1
MikhailSP