如何使用充气城堡库从PGP公钥获取密钥ID?

时间:2019-09-01 17:27:11

标签: java cryptography bouncycastle public-key pgp

我正在尝试从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中的公钥加密实现。与主题相关的任何相关信息将受到高度赞赏。

谢谢。

0 个答案:

没有答案