我有一个文本文件,其中包含几个ASCII装甲的OpenPGP公钥。我想使用Bouncy Castle将字符串加密到此文件中包含的所有公钥。但是,当我将文件加载到PGPPublicKeyRingCollection
时,只返回第一个键:
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.");
}
}
我错过了什么吗?
FWIW,当我运行$ gpg --dry-run my.keys
时,它会正确检测所有7个公钥并输出指纹。
答案 0 :(得分:2)
我不知道你是否终于找到了这个问题的答案,但我遇到了同样的问题。如果我在命令行上从gpg导出多个键:
gpg --export --armor 374ABFC6 B3E4E0A5 > combined.public.asc
然后为该文件创建了一个InputStream,Bouncy Castle能够毫无问题地导入这两个键。
如果您的密钥来自其他地方可能没有帮助,但您拥有的公钥InputStream未正确编码(我假设因为它只抓取第一个密钥)包含多个密钥。如果我只是将两个PGP密钥块连接到同一个文件中,那么它只会读取第一个密钥。在如上导出之后,combined.public.asc文件只有一个巨大的PGP密钥块。