Obtenir GPG Decryption pour fonctionner en Java (Bouncy Castle)

permettez-moi de commencer par dire que je suis très nouveau à tout cela. Ce que j'essaie de faire est d'utiliser gpg de l'intérieur de Java afin de décrypter un fichier crypté.

Ce que j'ai fait avec succès:

  • Avait un collègue crypter un fichier à l'aide de ma clé publique et sa clé privée et le déchiffrer.
  • Allés dans l'autre sens
  • Avait un autre collègue essayer de déchiffrer un fichier qui n'était pas pour lui: fail (comme prévu)

Ma clé a été générée comme ça...

(gpg --version me dit que je suis en utilisant 1.4.5 et je suis en utilisant le Château Gonflable 1.47)

gpg --gen-ley

Sélectionnez l'option "DSA et Elgamal (par défaut)"

Remplissez les autres champs et générer une clé.

Le fichier a été chiffré à l'aide de ma clé publique et une autre de la clé secrète. Je tiens à le décrypter. J'ai écrit le code Java suivant pour accomplir cette tâche. Je suis à l'aide de plusieurs méthodes obsolètes, mais je ne peux pas comprendre comment le mettre en œuvre correctement l'usine méthodes nécessaires à l'utilisation de la non-déconseillé versions, donc si quelqu'un a une idée sur des implémentations de ceux que je devrais être en utilisant ce serait un joli bonus.

    Security.addProvider(new BouncyCastleProvider());

        PGPSecretKeyRingCollection secretKeyRing = new PGPSecretKeyRingCollection(new FileInputStream(new File("test-files/secring.gpg")));
        PGPSecretKeyRing pgpSecretKeyRing = (PGPSecretKeyRing) secretKeyRing.getKeyRings().next();
        PGPSecretKey secretKey = pgpSecretKeyRing.getSecretKey();
        PGPPrivateKey privateKey = secretKey.extractPrivateKey("mypassword".toCharArray(), "BC");

        System.out.println(privateKey.getKey().getAlgorithm());
        System.out.println(privateKey.getKey().getFormat());

        PGPObjectFactory pgpF = new PGPObjectFactory(
    new FileInputStream(new File("test-files/test-file.txt.gpg")));
        Object pgpObj = pgpF.nextObject();
        PGPEncryptedDataList encryptedDataList = (PGPEncryptedDataList) pgpObj;

        Iterator objectsIterator = encryptedDataList.getEncryptedDataObjects();

        PGPPublicKeyEncryptedData publicKeyEncryptedData = (PGPPublicKeyEncryptedData) objectsIterator.next();
        InputStream inputStream = publicKeyEncryptedData.getDataStream(privateKey, "BC");

Alors, quand j'exécute ce code, j'apprends que mon algorithme et le format sont comme suit pour ma clé secrète:

Algorithme: DSA
Format: PKCS#8

Et puis il se casse sur la dernière ligne:

Exception in thread "main" org.bouncycastle.openpgp.PGPException: error setting asymmetric cipher
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.decryptSessionData(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder.access$000(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder$2.recoverSessionData(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at org.bouncycastle.openpgp.PGPPublicKeyEncryptedData.getDataStream(Unknown Source)
at TestBouncyCastle.main(TestBouncyCastle.java:74)

Causés par: java.de sécurité.InvalidKeyException: inconnu type de clé transmise à ElGamal
au org.bouncycastle.jcajce.fournisseur de.asymétrique.elgamal.CipherSpi.engineInit(Source Inconnue)
au org.bouncycastle.jcajce.fournisseur de.asymétrique.elgamal.CipherSpi.engineInit(Source Inconnue)
au javax.crypto.Algorithme de chiffrement.init(DashoA13*..)
au javax.crypto.Algorithme de chiffrement.init(DashoA13*..)
... 8 plus

Je suis ouvert à beaucoup de suggestions ici, de "ne pas utiliser gpg, utiliser x à la place de" à "ne pas utiliser château gonflable, utiliser x à la place de" quelque chose entre les deux. Merci!

source d'informationauteur Craig