首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BouncyCastle - GPG。从密钥中提取公钥

BouncyCastle - GPG。从密钥中提取公钥
EN

Stack Overflow用户
提问于 2020-09-24 18:32:08
回答 1查看 334关注 0票数 0

我使用下面的java代码从密钥中提取公钥:

代码语言:javascript
复制
PGPSecretKeyRingCollection ring = new PGPSecretKeyRingCollection(decoderStream,
            new JcaKeyFingerprintCalculator());
Iterator<PGPSecretKeyRing> it = ring.getKeyRings();
while (it.hasNext()) {
    PGPSecretKeyRing key = it.next();
    Iterator<PGPPublicKey> itpublic = key.getPublicKeys();
    while (itpublic.hasNext()) {
        PGPPublicKey pubKey = itpublic.next();
        // use this pubKey
    }
}

如果我尝试在ArmoredOutputStream中导出该密钥,我会得到如下结果:

代码语言:javascript
复制
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: BCPG v1.66
    
    hQEMA6GfAr1vmvVrAQf/XF/6DqSxZu0dXXVnhfxoot+YTLBrwnec/af72R8G1aJI
    [...]
    =eLkg
    -----END PGP PUBLIC KEY BLOCK-----

如果我使用这个密钥对java代码中的内容进行加密,一切都会正常工作。

如果我使用此密钥从命令行(或其他客户端,如Kleopatra)加密文件:

代码语言:javascript
复制
$ gpg --import pubKey.gpg
$ gpg --encrypt ...

我得到了“不可用的公钥”错误。

我是不是在从java代码导出公钥方面做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-24 23:12:07

您必须使用所有PublicKeyRing,而不仅仅是主公钥:

代码语言:javascript
复制
List<PGPPublicKey> list = new ArrayList<>();
Iterator<PGPSecretKeyRing> it = ring.getKeyRings();
while (it.hasNext()) {
    PGPSecretKeyRing secretRing = it.next();
    Iterator<PGPPublicKey> itpublic = secretRing.getPublicKeys();
    while (itpublic.hasNext()) {
        PGPPublicKey pub = itpublic.next();
        list.add(pub);
    }
    Iterator<PGPPublicKey> itextrapublic = secretRing.getExtraPublicKeys();
    while (itextrapublic.hasNext()) {
        PGPPublicKey pub = itextrapublic.next();
        list.add(pub);
    }
}
PGPPublicKeyRing publicRing = new PGPPublicKeyRing(list);
publicRing.encode(armoredOutputStream)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64044582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档