获取 PGP 公钥指纹时出错,UserID 为空

问题描述 投票:0回答:1

使用 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的版本有关。我怎样才能得到正确的信息?

java bouncycastle pgp openpgp eddsa
1个回答
0
投票

由于k.isEncryptionKey()发现了子密钥,修改为使用PGPPublicKeyRing.getPublicKey()方法解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.