输出到PGP加密逻辑不正确

问题描述 投票:0回答:1

我尝试在 PGP 中加密消息,但加密无法正常工作。我收到的加密消息未被解密。在使用在线平台使用同一组密钥进行解密和加密时,效果很好。但是当我尝试使用我的逻辑对其进行加密时,它不起作用。

我添加了为测试生成的公钥/私钥。

我觉得使用 PGP 的消息加密代码的输出是错误的。这是我在尝试解密从以下代码中获取作为输出的 PGP 消息时遇到的错误 -

org.bouncycastle.openpgp.PGPRuntimeOperationException:迭代器无法获取下一个对象:流中的未知对象:20 原因:java.io.IOException:流中的未知对象:

这是常规代码-

@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.")
}

这是私钥-

-----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-----

输出是-

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

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

但是我无法解密这个。加密时我做错了什么?

java encryption bouncycastle pgp openpgp
1个回答
0
投票

我知道我参加聚会有点晚了,但我们开始吧!

您直接将明文消息写入加密输出流

cOut
,但在 OpenPGP 中,数据需要包装在 Literal-Data 数据包中。因此,您需要用使用
cOut
类创建的另一个 OutputStream 来包装
LiteralDataGenerator

© www.soinside.com 2019 - 2024. All rights reserved.