kanha
kanha

Reputation: 11

Output to the PGP encryption logic is incorrect

I am trying to encrypt a message in PGP, but the encryption is not working properly. The encryption message I am getting is not being decrypted. On using a platform online to decrypt and encrypt using same set of keys- its working good. But when I am trying to encrypt it using my logic- it's not working.

I have added public/private keys that I generated for the test.

I feel the output of the message encryption code using PGP is wrong.This is the error I am facing when I am trying to decrypt the PGP message that I fetched as output from the below code -

org.bouncycastle.openpgp.PGPRuntimeOperationException: Iterator failed to get next object: unknown object in stream: 20 Caused by: java.io.IOException: unknown object in stream:

This is the groovy code-

@Grab(group='org.bouncycastle', module='bcpkix-jdk15on', version='1.70')
@Grab(group='org.bouncycastle', module='bcpg-jdk15on', version='1.70')
@Grab(group='org.bouncycastle', module='bcprov-jdk15on', version='1.70')

import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.InputStream
import java.io.OutputStream
import java.io.IOException
import java.security.SecureRandom
import java.util.Iterator
import org.bouncycastle.openpgp.*
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator
import org.bouncycastle.util.Iterable
import org.bouncycastle.bcpg.ArmoredOutputStream


String message = "This is a secret message."
byte[] messageBytes = message.getBytes("UTF-8")
byte[] encryptedMessage


PGPPublicKey publicKey = readPublicKey("""-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: Keybase OpenPGP v1.0.0
Comment: https://keybase.io/crypto

xo0EZd8jJgEEAMUFpO19INzZGSl/RWfqFMvDOBSBV3AFIGdBzUCGCDgOP2A784eg
dSemCezryl8Ik32oJp+a+yWoZmv+jT8J1rSgBPBX1rsA5OdmqEIQ4fZar8tTw/gN
PozNwAFIS+VuYwLRkY7wTkBDj+a2yh6XBH6SkT5AvOhIEEEFMhsBElJFABEBAAHN
D2thcmFuIDxrQHMuY29tPsKtBBMBCgAXBQJl3yMmAhsvAwsJBwMVCggCHgECF4AA
CgkQibbxXQCyUgmQuAQAsU2b5vT8xXC3cKG+6whSjYgdH8pJ4yXOQ69olIH7+gA+
HdqVmWh+b4eTBxQlv/HQ/w3tPhjmfC/YTJKKuqThOcvXTEd97lwzcrI6nm0QuX/q
P5IwNO7vEzjmUc2jgSoj1eQHkTYJ5u3Vu4XjRpbxj84wVU3Br4fxuZg/NCs9EXnO
jQRl3yMmAQQAsRq/6Yp+1+3x0z6b+CDxx8QVN2KoKIWCY611SJRuPX7MTuOUjtZ7
2/pvID1lohJVUMTerskdVOvZo6zTzEymD4uMbqd4IPGzir4+yHDKefz7FTjCtKen
WRXKu7vDWsLXjgbigU+0lWQ7lacUR4tQ3DH3ysf2O5jfHXADkiJS5U8AEQEAAcLA
gwQYAQoADwUCZd8jJgUJDwmcAAIbLgCoCRCJtvFdALJSCZ0gBBkBCgAGBQJl3yMm
AAoJEBftRsxoEmYlp2sD/3JRZeMONe4rEsJyfRSlQkPLLv+nAS/q+s1ZB2m0iyhq
0uJl9mMI1nJ5bWLq2rlCgpNpx12pW1vqE0RyOzBEwlfvugNRGxyezF2tjgesaLvz
JE/Wt82tmT0lKf+DI5KKfYlACdOB5qXkxageXsyy95tl/2g0GHkzl2phFBIn/n3T
98YEAJ6H6ldp7PBgpI/NB8CcDA+1UQGfYul9xi4qV42ThOeWD1yPXtokKPjc/QZh
FPiZ6uPoch85oHJY0r9OJnJXIqJWJvIvCJQ+d1JgivCMHcE23Yd1QCl7F4dXTm8Y
DjspdGbNkwBoKEHrQkdH1CMJI5gs1hO98Zqs5iEFS+YTYwwzzo0EZd8jJgEEAOUy
1hRwz/5XpLJtxoAAq6lJtsNh4gfQ2SHU7bODtuNTt6Q1vcPgmv5lNNewhW4dUZza
806VJkoSjaY8tgkHO0rF1AsPOMP3VSrEyHcIlL/aMz/5yUxr5iqACou7jv4rJfnJ
hF/mAynEQ1D/DVYcqxYTo1J22qySoSYmwZ6s5toDABEBAAHCwIMEGAEKAA8FAmXf
IyYFCQ8JnAACGy4AqAkQibbxXQCyUgmdIAQZAQoABgUCZd8jJgAKCRCqiMN3fbsk
N5ArA/43YpAsO9Gjz+s+Ew33zusv+j59jSiGSNuATfTnQ61tYtTqdEDrC9p05fj+
+VePh7Nb28Eze9MBxEwbIPyVrM8N1CsPSVp0Xw5iymiFBMa8DbGZQS5NUHQJnci9
2uzJygdGB2RzrAl29A45wd09AHGfmriluYw9aKyQe5hEDMBeT60ABACsvp17ZnAq
NGAQqxxE0xFbflhGlvHiR2CVqRb57hcIybkWxrhHBY67PTgCvNQIzX6+05nBZ7fg
+PX5twSnejx4TBOlgegJnHQCdSXnBGy2DChceeXrFIhgR2KDXtkDwd7zQBWEplKP
l6zVJWLRjNCwhMZYSxCPgw8E5VXgESs89g==
=b1tp
-----END PGP PUBLIC KEY BLOCK-----""")


PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(
                new JcePGPDataEncryptorBuilder(PGPEncryptedData.AES_256)
                        .setWithIntegrityPacket(true)
                        .setSecureRandom(new SecureRandom())
)

encryptedDataGenerator.addMethod(
        new JcePublicKeyKeyEncryptionMethodGenerator(publicKey)
                .setSecureRandom(new SecureRandom()))

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ArmoredOutputStream aOut = new ArmoredOutputStream(byteArrayOutputStream);
OutputStream cOut = encryptedDataGenerator.open(aOut, messageBytes.length);
cOut.write(messageBytes);
cOut.close();
aOut.close();
System.out.println(byteArrayOutputStream.toString());




private PGPPublicKey readPublicKey(String publicKeyString) throws IOException, PGPException {
    InputStream inputStream = PGPUtil.getDecoderStream(new ByteArrayInputStream(publicKeyString.getBytes("UTF-8")))
    PGPPublicKeyRingCollection pgpPublicKeyRingCollection = new PGPPublicKeyRingCollection(inputStream, new JcaKeyFingerprintCalculator())

    Iterator publicKeyRingIter = pgpPublicKeyRingCollection.getKeyRings()

    while (publicKeyRingIter.hasNext()) {
        PGPPublicKeyRing publicKeyRing = (PGPPublicKeyRing) publicKeyRingIter.next()
        Iterator<PGPPublicKey> publicKeyIter = publicKeyRing.getPublicKeys()

        while (publicKeyIter.hasNext()) {
            PGPPublicKey key = publicKeyIter.next()
            if (key.isEncryptionKey()) {
                return key
            }
        }
    }
    throw new IllegalArgumentException("Can't find encryption key in key ring.")
}

This is the private key-

-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: Keybase OpenPGP v1.0.0
Comment: https://keybase.io/crypto

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
5VXgESs89g==
=gEXS
-----END PGP PRIVATE KEY BLOCK-----

The output is -

-----BEGIN PGP MESSAGE-----
Version: BCPG v1.70

hIwDibbxXQCyUgkBA/9ErJnw641vPYrGFWFCexLVUx7S7BelxO1wB0ujjp6hJctA
GNmy9xJjOoFyT4HhBrJo5CrKkL5nkYxsuYQFpeMzWKQbWgMa7PjWVmRXc5LwgqlK
BsmoOppIO2LyNGT+N+7plnPwe/HzDfxMrcwYJWayD+ARpGRbjel0xO7WeHIMVNJC
AeQ1wXeTjaF0rooxZtfFIcymcEbuXbPaAbG2o7n+4DG1mIovQ89scSrVYjo0XAMz
5JA9qZOfXj3fa1itRmNfrZEk
=prY8
-----END PGP MESSAGE-----

But I am unable to decrypt this. What am I doing wrong while encrypting?

Upvotes: 0

Views: 146

Answers (1)

vanitasvitae
vanitasvitae

Reputation: 185

I know I'm a bit late to the party, but here we go!

You are writing your plaintext message to the encryption OutputStream cOut directly, but in OpenPGP, the data needs to be wrapped in a Literal-Data packet. So instead you need to wrap cOut with another OutputStream created using the LiteralDataGenerator class.

Upvotes: 0

Related Questions