Получение расшифровки GPG для работы в Java (Bouncy Castle)

позвольте мне начать с того, что я чрезвычайно новичок во всем этом. Я пытаюсь использовать gpg из Java, чтобы расшифровать зашифрованный файл.

Что я сделал успешно:

Если бы мой коллега зашифровал файл, используя мой открытый ключ и свой закрытый ключ, он успешно расшифровал его.

Пошли в другую сторону

Если бы другой коллега попытался расшифровать файл, который был не для него: сбой (как и ожидалось)

Мой ключ был сгенерирован так ...

(gpg --version говорит мне, что я использую 1.4.5 и использую Bouncy Castle 1.47)

gpg --gen-ley

Выберите опцию «DSA и Elgamal (по умолчанию)»

Заполните остальные поля и сгенерируйте ключ.

Файл был зашифрован с использованием моего открытого ключа и чужого секретного ключа. Я хочу расшифровать это. Я написал следующий код Java для достижения этой цели. Я использую несколько устаревших методов, но не могу понять, как правильно реализовать фабричные методы, необходимые для использования не устаревших версий, поэтому, если у кого-то есть идеи по реализации тех, которые я должен использовать, это будет приятный бонус

    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");

Поэтому, когда я запускаю этот код, я узнаю, что мой алгоритм и формат следующие для моего секретного ключа:

Алгоритм: DSA Формат: PKCS # 8

И тогда он разрывается на последнюю строку:

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)

Вызвано: java.security.InvalidKeyException: неизвестный тип ключа передан ElGamal по адресу org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (Неизвестный источник) по адресу org.bouncycastle.jcajce.provider.asymmetric.herga. engineInit (неизвестный источник) на javax.crypto.Cipher.init (DashoA13 * ..) на javax.crypto.Cipher.init (DashoA13 * ..) ... еще 8

Я открыт для множества предложений: от «не используйте gpg, используйте вместо этого x» до «не используйте надувной замок, используйте вместо x» что-нибудь промежуточное. Спасибо!

Ответы на вопрос(4)

Ваш ответ на вопрос