Uzyskanie odszyfrowania GPG do pracy w Javie (Bouncy Castle)

zacznę od stwierdzenia, że ​​jestem bardzo nowy w tym wszystkim. Próbuję użyć gpg z Javy w celu odszyfrowania zaszyfrowanego pliku.

Co zrobiłem pomyślnie:

Gdyby kolega zaszyfrował plik za pomocą mojego klucza publicznego i klucza prywatnego i pomyślnie go odszyfrował.

Poszedł w drugą stronę

Czy inny kolega próbował odszyfrować plik, który nie był dla niego: zawieść (zgodnie z oczekiwaniami)

Mój klucz został wygenerowany w ten sposób ...

(gpg --version mówi mi, że używam 1.4.5 i używam Bouncy Castle 1.47)

gpg --gen-ley

Wybierz opcję „DSA i Elgamal (domyślnie)”

Wypełnij pozostałe pola i wygeneruj klucz.

Plik został zaszyfrowany przy użyciu mojego klucza publicznego i innego tajnego klucza. Chcę go odszyfrować. W tym celu napisałem następujący kod Java. Używam kilku przestarzałych metod, ale nie potrafię zrozumieć, jak poprawnie zaimplementować fabryczne metody wymagane do używania nieaktualnych wersji, więc jeśli ktoś ma pomysł na implementacje tych, których powinienem używać, to byłby to miły 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");

Kiedy więc uruchomię ten kod, dowiaduję się, że mój algorytm i format są następujące dla mojego tajnego klucza:

Algorytm: Format DSA: PKCS # 8

A potem łamie się w ostatniej linii:

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)

Przyczyna: java.security.InvalidKeyException: nieznany typ klucza przekazany do ElGamal w org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (nieznane źródło) w org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi. engineInit (Nieznane źródło) w javax.crypto.Cipher.init (DashoA13 * ..) w javax.crypto.Cipher.init (DashoA13 * ..) ... 8 więcej

Jestem otwarty na wiele sugestii tutaj, z „nie używaj gpg, użyj x zamiast”, aby „nie używać nadmuchiwanego zamku, zamiast tego użyj x” do czegokolwiek pomiędzy. Dzięki!

questionAnswers(4)

yourAnswerToTheQuestion