Obtendo Decryption GPG Para Trabalhar Em Java (Bouncy Castle)

Deixe-me começar dizendo que sou extremamente novo em tudo isso. O que estou tentando fazer é usar o gpg de dentro do Java para descriptografar um arquivo criptografado.

O que eu fiz com sucesso:

Um colega criptografou um arquivo usando minha chave pública e sua chave privada e descriptografou-a com êxito.

Fui para o outro lado

Outro colega tentou descriptografar um arquivo que não era para ele: falha (como esperado)

Minha chave foi gerada assim ...

(gpg --version me diz que estou usando 1.4.5 e estou usando o Bouncy Castle 1.47)

gpg --gen-ley

Selecione a opção "DSA e Elgamal (padrão)"

Preencha os outros campos e gere uma chave.

O arquivo foi criptografado usando minha chave pública e a chave secreta de outra pessoa. Eu quero decifrá-lo. Eu escrevi o seguinte código Java para fazer isso. Estou usando vários métodos obsoletos, mas não consigo descobrir como implementar adequadamente os métodos de fábrica necessários para usar as versões não obsoletas, por isso, se alguém tiver uma ideia sobre implementações daqueles que eu deveria estar usando, isso seria uma bônus agradável

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

Então, quando executo esse código, aprendo que meu algoritmo e formato são os seguintes para a minha chave secreta:

Algoritmo: Formato DSA: PKCS # 8

E então ele quebra na última linha:

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)

Causado por: java.security.InvalidKeyException: tipo de chave desconhecido passado ao ElGamal em org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi.engineInit (Unknown Source) em org.bouncycastle.jcajce.provider.asymmetric.elgamal.CipherSpi. engineInit (Unknown Source) em javax.crypto.Cipher.init (DashoA13 * ..) em javax.crypto.Cipher.init (DashoA13 * ..) ... 8 mais

Estou aberto a muitas sugestões aqui, de "não use gpg, use x em vez de" para "não use castelo insuflável, use x em vez disso" para qualquer coisa entre eles. Obrigado!

questionAnswers(4)

yourAnswerToTheQuestion