如何使用Bouncycastle Java将PGP公钥存储和读取为字符串?

如何使用Bouncycastle Java将PGP公钥存储和读取为字符串?,java,bouncycastle,public-key,pgp,Java,Bouncycastle,Public Key,Pgp,我一直在尝试创建、编码、存储、检索和解码Bouncy Castle PGP公钥。当我试图读回密钥时,我得到了错误的输出和EOFEException。密钥将作为字符串存储在数据库中 原始RSA加密公钥从密钥环中提取,如下所示: @SuppressWarnings("unchecked") public PGPPublicKey getPublicKey() { PGPPublicKey pk = null; Iterator<PGPPublicKey> it = pub

我一直在尝试创建、编码、存储、检索和解码Bouncy Castle PGP公钥。当我试图读回密钥时,我得到了错误的输出和EOFEException。密钥将作为字符串存储在数据库中

原始RSA加密公钥从密钥环中提取,如下所示:

@SuppressWarnings("unchecked")
public PGPPublicKey getPublicKey() {
    PGPPublicKey pk = null;
    Iterator<PGPPublicKey> it = publicKeyRing.getPublicKeys();
    while (pk == null && it.hasNext()) {
        PGPPublicKey key = it.next();
        if (key.isEncryptionKey()) {
            pk = key;
        }
    }
    return pk;
}
    PGPPublicKey contactPK = realContact.getPublicKey();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ArmoredOutputStream armored = new ArmoredOutputStream(out);
    contactPK.encode(armored);
    armored.close();
    publicKey = new String(out.toByteArray(), Charset.forName("US-ASCII"));
这将为我获取一个PGP消息块,我希望在其中使用PGP公钥块:

-----开始PGP消息------\n转换:BCPG1.50\n\n\n\n本研究的内容是1.50\n\n本研究的内容是1.50\n\n本研究的内容是一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于BDMRBW42IBM2W3\n

。。。(为简洁起见)

\n-----结束PGP消息-----

当我试图读回字符串以重新创建公钥时,我得到一个EOFEException:

// Import the public key.
ByteArrayInputStream in =
        new ByteArrayInputStream(stored.publicKey.getBytes(
                                                    Charset.forName("US-ASCII")));
// Needed to read ASCII armored keys
InputStream decoded = PGPUtil.getDecoderStream(in);
BCPGInputStream bcpgIn = new BCPGInputStream(decoded);
RSAPublicBCPGKey bcpgKey = new RSAPublicBCPGKey(bcpgIn);
PublicKeyPacket pkPacket = new PublicKeyPacket(PublicKeyAlgorithmTags.RSA_ENCRYPT,
                                                new Date(), bcpgKey);
publicKey = new PGPPublicKey(pkPacket, new BcKeyFingerprintCalculator());
创建RSAPlicBCPGKey时发生异常


我做错了一件事,但我不知道是什么。有人能帮忙吗?

假设您已经将pgp公钥(ascii铠装)放在字符串str中:

    InputStream in=new ByteArrayInputStream(str.getBytes());
    in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);

    JcaPGPPublicKeyRingCollection pgpPub = new JcaPGPPublicKeyRingCollection(in);
    in.close();

    PGPPublicKey key = null;
    Iterator<PGPPublicKeyRing> rIt = pgpPub.getKeyRings();
    while (key == null && rIt.hasNext())
    {
        PGPPublicKeyRing kRing = rIt.next();
        Iterator<PGPPublicKey> kIt = kRing.getPublicKeys();
        while (key == null && kIt.hasNext())
        {
            PGPPublicKey k = kIt.next();

            if (k.isEncryptionKey())
            {
                key = k;
            }
        }
    }
    return key;
InputStream in=newbytearrayinputstream(str.getBytes());
in=org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);
JcaPGPPublicKeyRingCollection pgpPub=新的JcaPGPPublicKeyRingCollection(in);
in.close();
PGPPublicKey=null;
迭代器rIt=pgpPub.getKeyRings();
while(key==null&&rIt.hasNext())
{
PGPPublicKeyRing kRing=rIt.next();
迭代器kIt=kRing.getPublicKeys();
while(key==null&&kIt.hasNext())
{
PGPPublicKey k=kIt.next();
if(k.isEncryptionKey())
{
key=k;
}
}
}
返回键;

现在,您的变量密钥将拥有您的PGPPublicKey。

我遇到了这个问题,结果证明公钥环实际上就是公钥本身。当我运行迭代器时,我实际上得到了子键(它变成了消息块而不是公钥块)。如果我解释得不好,看看这个


假设
realContact
是一个只包含子键的公钥环,您实际上不需要通过
getPublicKey()

运行它,为什么我必须遍历刚刚创建的公钥环?它不是只有一把刚刚传给它的钥匙吗?