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
Vous devez vous connecter pour publier un commentaire.
J'ai décidé d'aller avec une approche très différente, qui est de renoncer à l'utilisation de château gonflable tout à fait et il suffit d'utiliser un processus d'exécution à la place. Pour moi, c'est la solution de travail et supprime complètement la complexité du château gonflable:
Après avoir fait cela, vous devez n'oubliez pas de vider votre flux d'entrée que votre processus est execing ou votre programme sera probablement accrocher en fonction de combien vous êtes outputing. Voir ma réponse dans ce fil (et aussi celle de Cameron Skinner et Matthew Wilson qui m'a mis sur le bon chemin) pour un peu plus de contexte: L'appel de GnuPG en Java, par l'intermédiaire d'un Processus d'Exécution de crypter et décrypter des fichiers - Décrypter bloque toujours
La première Google résultat est cette. Il semble que vous essayez de déchiffrer ElGamal de données, mais vous n'êtes pas en le passant dans un ElGamal clé.
Il y a deux possibilités:
Vous avez choisi DSA avec chiffrement ElGamal, alors je soupçonne au moins la dernière: les sous-clés sont signés par le maître principal; ElGamal est pas un algorithme de signature (je ne sais pas si DSA et ElGamal peut utiliser la même clé, mais il est généralement considéré comme une bonne idée d'utiliser des clés différentes pour différentes finalités).
Je pense que vous voulez quelque chose de ce genre (d'ailleurs,
secretKeyRing
doit probablement être renommésecretKeyRingCollection
):L'une quelconque recherche d'une solution alternative, voir https://stackoverflow.com/a/42176529/7550201
Longue histoire courte: Bouncycastle est la programmation est souvent beaucoup de cargo culte de la programmation et j'ai écrit une bibliothèque pour changer cela.