使用 bouncycastle 解析 PGP 公钥。使用RSA加密生成的publicKey可以正确读取信息,但是使用EdDsa加密生成的publicKey无法正确读取信息。
这是我的代码:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.72</version>
</dependency>
@Test
public void test() throws NoSuchProviderException, IOException, PGPException {
InputStream in = PGPUtil.getDecoderStream(new FileInputStream("public_EdDsa.asc"));
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in, new JcaKeyFingerprintCalculator());
List<PGPPublicKey> keys = new ArrayList<>();
Iterator<PGPPublicKeyRing> rIt = pgpPub.getKeyRings();
while (CollectionUtils.isEmpty(keys) && rIt.hasNext()) {
PGPPublicKeyRing kRing = rIt.next();
Iterator<PGPPublicKey> kIt = kRing.getPublicKeys();
while (CollectionUtils.isEmpty(keys) && kIt.hasNext()) {
PGPPublicKey k = kIt.next();
if (k.isEncryptionKey()) {
keys.add(k);
}
}
}
for (PGPPublicKey pgpPublicKey : keys) {
System.out.println(pgpPublicKey.getKeyID());
byte[] fingerprint = pgpPublicKey.getFingerprint();
for (byte b : fingerprint) {
System.out.print(b);
}
System.out.println();
System.out.println(byte2Hex(fingerprint));
Iterator<String> userIDs = pgpPublicKey.getUserIDs();
while (userIDs.hasNext()){
String next = userIDs.next();
System.out.println(next);
}
System.out.println("============end============");
}
}
获得的指纹与克利奥帕特拉的详细信息不同。用户 ID 为空。不知道是否和bouncycastle的版本有关。我怎样才能得到正确的信息?
由于k.isEncryptionKey()发现了子密钥,修改为使用PGPPublicKeyRing.getPublicKey()方法解决问题。