Java 使用Bouncy Castle PGP从单个文件加载多个公钥

Java 使用Bouncy Castle PGP从单个文件加载多个公钥,java,bouncycastle,Java,Bouncycastle,我有一个文本文件,其中包含几个ASCII铠装OpenPGP公钥。我想使用Bouncy Castle将字符串加密到此文件中包含的所有公钥。但是,当我将文件加载到pgppublickeringcollection中时,只返回第一个键: private static List<PGPPublicKey> readPublicKeys(InputStream input) throws IOException, PGPException { PGPPublicKeyRingColle

我有一个文本文件,其中包含几个ASCII铠装OpenPGP公钥。我想使用Bouncy Castle将字符串加密到此文件中包含的所有公钥。但是,当我将文件加载到
pgppublickeringcollection
中时,只返回第一个键:

private static List<PGPPublicKey> readPublicKeys(InputStream input) throws IOException, PGPException {
    PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(input), new JcaKeyFingerprintCalculator());
    List<PGPPublicKey> keys = new ArrayList<>();

    // size is 1 here
    logger.debug("size " + pgpPub.size());
    @SuppressWarnings("unchecked")
    Iterator<PGPPublicKeyRing> keyRingIter = pgpPub.getKeyRings();
    while (keyRingIter.hasNext()) {
        PGPPublicKeyRing keyRing = keyRingIter.next();

        @SuppressWarnings("unchecked")
        Iterator<PGPPublicKey> keyIter = keyRing.getPublicKeys();
        while (keyIter.hasNext()) {
            PGPPublicKey key = keyIter.next();

            // there is only ever 1 key here as well
            if (key.isEncryptionKey()) {
                keys.add(key);
            }
        }
    }

    if (keys.size() > 0) {
        return keys;
    } else {
        throw new IllegalArgumentException("Can't find encryption key in key ring.");
    }
}
私有静态列表readPublicKeys(InputStream输入)引发IOException、PGPEException{
PGPPubliceYringCollection pgpPub=新的PGPPubliceYringCollection(PGPUtil.getDecoderStream(输入),新的JcaKeyFingerprintCalculator());
列表键=新的ArrayList();
//这里的尺寸是1
debug(“size”+pgpPub.size());
@抑制警告(“未选中”)
迭代器keyRingIter=pgpPub.getKeyRings();
while(keyRingIter.hasNext()){
pgppublickering keyRing=keyRingIter.next();
@抑制警告(“未选中”)
迭代器keyIter=keyRing.getPublicKeys();
while(keyIter.hasNext()){
PGPPublicKey=keyIter.next();
//这里也只有一把钥匙
if(key.isEncryptionKey()){
key.add(key);
}
}
}
如果(key.size()>0){
返回键;
}否则{
抛出新的IllegalArgumentException(“在密钥环中找不到加密密钥”);
}
}
我错过什么了吗


FWIW,当我运行
$gpg--dry run my.keys
时,它会正确检测所有7个公钥并输出它们的指纹。

我不知道您是否最终找到了这个问题的答案,但我遇到了相同的问题。如果我在命令行上从gpg导出多个键:

gpg --export --armor 374ABFC6 B3E4E0A5 > combined.public.asc
然后为该文件创建了一个输入流,Bouncy Castle能够毫无问题地导入这两个密钥


如果您的密钥来自其他地方,这可能没有帮助,但是您拥有的公钥InputStream没有正确编码(我假设它只抓取第一个密钥)以包含多个密钥。如果我只是将两个PGP密钥块连接到同一个文件中,那么它只读取第一个密钥。在像上面那样导出之后,combined.public.asc文件只有一个巨大的PGP密钥块

我不知道你是否最终找到了这个问题的答案,但我也有同样的问题。如果我在命令行上从gpg导出多个键:

gpg --export --armor 374ABFC6 B3E4E0A5 > combined.public.asc
然后为该文件创建了一个输入流,Bouncy Castle能够毫无问题地导入这两个密钥

如果您的密钥来自其他地方,这可能没有帮助,但是您拥有的公钥InputStream没有正确编码(我假设它只抓取第一个密钥)以包含多个密钥。如果我只是将两个PGP密钥块连接到同一个文件中,那么它只读取第一个密钥。在像上面那样导出之后,combined.public.asc文件只有一个巨大的PGP密钥块