我正在尝试从PGP公钥获取密钥ID。经过大量Google搜索,我找到了一种使用Bouncy Castle Java API读取公共密钥的解决方案。
相同的代码段如下:
public static PGPPublicKey readPublicKey(InputStream in) throws IOException, PGPException {
in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in);
PGPPublicKey key = null;
//
// iterate through the key rings.
//
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;
}
}
}
if (key == null) {
throw new IllegalArgumentException("Can't find encryption(public) key in key ring.");
}
return key;
}
我使用在线pgp密钥生成器工具https://pgpkeygen.com生成了公共密钥,并在上面运行了解决方案。它以长格式生成密钥ID。
这适用于较旧版本的jar。但是,对于新版本的jar- bcpg-jdk15on-1.61.jar ,由于 PGPPublicKeyRingCollection 的构造函数现在期望将KeyFingerPrintCalculator作为参数提供,因此无法正常工作。 >
所以代码行,
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in);
需要替换为
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in, new JcaKeyFingerprintCalculator());
OR
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in, new BcKeyFingerprintCalculator());
我尝试使用BC和JCA密钥指纹计算器,并且它们都给出了相同的密钥ID。
问题是,
此处应使用哪个指纹计算器?
是否存在某些特定情况/相关选择? 我检查了两个计算器类的javadocs,但没有提供太多信息。
是否有其他解决方案来获取Java中PGP公钥的密钥ID?如果是,请提出建议。
请注意,我不是在这里生成密钥-这些密钥将由客户端提供,并且我没有太多关于它们的信息。
我不熟悉Java中的公钥加密实现。与主题相关的任何相关信息将受到高度赞赏。
谢谢。