【问题标题】:OpenPGP public key import in JavaJava中的OpenPGP公钥导入
【发布时间】:2020-05-30 02:58:57
【问题描述】:

我试图导入一个现有的 pgp 公钥:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: Keybase OpenPGP v1.0.0
Comment: https://keybase.io/crypto

xm8EXtFujBMFK4EEACIDAwQNLpTSC8Tvvve477Qw8YLe7toYxzYgDQRQbcaIajuF
QwWbnns+gZ9EDKIijcmi80QYPICDzrxKCaUOIIN+4//AUkCULovLC67qoEkcgDBY
Zig7GIoTPPYHVgEwr9baTqrNHGl2YW4gPGl2YWxiZXJ0bzg5QGdtYWlsLmNvbT7C
jwQTEwoAFwUCXtFujAIbLwMLCQcDFQoIAh4BAheAAAoJEO8cm+rVKFm/INMBgLQn
5itjscBcGoK605Wlsmk0lmTFK2qE7GmhFsFVg4Ut3vL2BjFBtlSzj21CH8bneQGA
1Btl14COww3h2u0rZY7HcsgzsWV8gaKBfAN/KpmOfxXqZ7HqrNc7o4XuXJH5QVrC
zlIEXtFujBMIKoZIzj0DAQcCAwS8t6iC+Ik9ZbgOY2JwmC8eILILiu3HUM/mqa4q
zBNe+gWgpHPNBjPHJKDYCTByy6UAb3eJHCjJZOj6ZU4BdmfPwsAnBBgTCgAPBQJe
0W6MBQkPCZwAAhsuAGoJEO8cm+rVKFm/XyAEGRMKAAYFAl7RbowACgkQUa2LyJhX
0c/6qQD/WWZpNX0O/k6kYrzK1i/xk0NBLLb4nNq0OB04x7gWuGoBAOPpxjoqRURV
0Hozha+XV9u1aTq+fOMDZxTNgL5FG0KGo4cBf0vATKVZw9wcq+s4mZIXZxs4rAod
sFe5fLgpzZvT/RIHVIU6uJieUsee4hgs0H2ErwGAihWWRrnmaJcsaKC9rq2na3fr
X6BcXRlGbavVofoX+nPyJKDDayHXZ2m4jmgllZe+zlIEXtFujBMIKoZIzj0DAQcC
AwTFxy3Kjj8Jy/fW5W21oG6+aY/ekTChtUANz28MiUvy1de4DYZkFxukRzudT3ij
c2zzsi8UBN02q2cvqY0luAvEwsAnBBgTCgAPBQJe0W6MBQkPCZwAAhsuAGoJEO8c
m+rVKFm/XyAEGRMKAAYFAl7RbowACgkQ103VlblSzhyRKAD/ac/TbN5EaFNdEMWn
28OW8uiDbKl/39EYVE/yr6DjQigA/0VkcoPWN3eVxj44d/cAWhRbWqoy04A+lRtC
wAEV6VXNOdUBgN4AuhF9urpqXFfJ/1s1G8GbRzY0wTpHuZEAjyrBtC+hBgVN0Us7
OYpM6CC6dXOejwGAurQgQOH/i++M8olxZAEnVj0vrP93hjs90N8DbtuIc/7Beb6o
uJ9OEwREoizWqTdn
=4fnu
-----END PGP PUBLIC KEY BLOCK-----

但是我的公钥总是得到空值。 此公钥是使用算法 ecdsa 创建的,您可以查看此页面中使用的值:keyPropertes

这是我读取公钥的方法,如果创建密钥的算法是 Rsa,它就可以工作:

public static PGPPublicKey readPublicKey(InputStream in) throws IOException, PGPException {
        in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);

        PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in);

        //
        // we just loop through the collection till we find a key suitable for encryption, in the real
        // world you would probably want to be a bit smarter about this.
        //
        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 key in key ring.");
        }

        return key;
    }

你能给我一个很大的帮助吗?

提前致谢,致以最诚挚的问候;)

【问题讨论】:

    标签: java encryption openpgp


    【解决方案1】:

    您的代码正在寻找具有加密功能的密钥。该密钥块中的所有三个密钥都是 ECDSA(算法 19),仅可用于签名验证,包括“证书”(密钥签名)和“授权”(SSH),这两者实际上都是签名的一种。如果你真的想要加密,你需要一个 ECDH(算法 18)子密钥。见https://www.rfc-editor.org/rfc/rfc6637#section-5。 如果你真的想要验证,你需要改变你的代码。

    【讨论】:

    • 谢谢你的回答,我只需要密钥来加密一些数据示例 123 到任何加密抛出,密钥由我的客户提供......所以你说标准是不推荐的使用该密钥类型来加密数据? .你能帮我写一段代码来使用那个密钥吗..或者这不是加密数据的好方法?
    • 您无法使用 ECDSA(子)密钥进行加密,就像您无法使用 DSA 进行加密一样。您只能使用 ElG (El-Gamal) 或 ECDH 或 一些 RSA 密钥进行加密(RSA 算法 两者都可以,但每个 key 都可以被标记为仅签名或仅加密)。 常规来匹配这些:RSA-encryption subkey with RSA-signing masterkey,ElG sub 和 DSA master,ECDH sub 和 ECDSA master,尽管从技术上讲,混合它们是可行的。如果客户希望您加密,他们必须提供加密密钥,通常是合适主密钥下的子密钥。
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多