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