簡體   English   中英

如何使用Bouncycastle Java將PGP公鑰存儲和讀取為字符串?

[英]How do I store and read PGP public keys as strings using Bouncycastle Java?

我一直在嘗試創建,編碼,存儲,檢索和解碼Bouncy Castle PGP公鑰。 當我嘗試重新讀回密鑰時,得到的輸出似乎是錯誤的,並且出現了EOFException。該密鑰將作為字符串存儲在數據庫中。

從密鑰環中提取原始的RSA加密公共密鑰,如下所示:

@SuppressWarnings("unchecked")
public PGPPublicKey getPublicKey() {
    PGPPublicKey pk = null;
    Iterator<PGPPublicKey> it = publicKeyRing.getPublicKeys();
    while (pk == null && it.hasNext()) {
        PGPPublicKey key = it.next();
        if (key.isEncryptionKey()) {
            pk = key;
        }
    }
    return pk;
}

它經過編碼,ASCII防護並存儲為字符串,如下所示:

    PGPPublicKey contactPK = realContact.getPublicKey();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ArmoredOutputStream armored = new ArmoredOutputStream(out);
    contactPK.encode(armored);
    armored.close();
    publicKey = new String(out.toByteArray(), Charset.forName("US-ASCII"));

這給了我一個PGP消息塊,在這里我希望有一個PGP公鑰塊:

----- BEGIN PGP MESSAGE ----- \\ n版本:BCPG V1.50 \\ n \\ nuQINBFO8StkCEACQ4vrDnBTDjEvQkGwrAHuJSBZL8tNLxhZ9B74afhObhLVzW6ZB \\ nT3pk / 5XcSPOTvcWd9k1yOKJUabCuF5ixFmMz + niFqUVQTtnl7aqOZ + GrDEzmoYmG \\ nNQROP0EiA1TWtm2 + Ja0FqiJauXytt1sIF / Pr5L47FCjtmZKVoXTP8RVFfGLPB0kT \\ ndjOz53PaEE3GSValh85w24XIH2 / gczURUnjphCX1bRwTFr14SfA9X / rFWqv9SqWQ \\ nV8OiIWrSiwNd5RLJ9q0B + viDzoxrjmnMJZikxhKiuNVKJCu2ccBdMrbW42iBM2w3 \\ n

...(為簡潔起見)

\\ n -----結束PGP消息-----

當我嘗試重新讀取字符串以重新創建公共密鑰時,出現了EOFException:

// Import the public key.
ByteArrayInputStream in =
        new ByteArrayInputStream(stored.publicKey.getBytes(
                                                    Charset.forName("US-ASCII")));
// Needed to read ASCII armored keys
InputStream decoded = PGPUtil.getDecoderStream(in);
BCPGInputStream bcpgIn = new BCPGInputStream(decoded);
RSAPublicBCPGKey bcpgKey = new RSAPublicBCPGKey(bcpgIn);
PublicKeyPacket pkPacket = new PublicKeyPacket(PublicKeyAlgorithmTags.RSA_ENCRYPT,
                                                new Date(), bcpgKey);
publicKey = new PGPPublicKey(pkPacket, new BcKeyFingerprintCalculator());

創建RSAPublicBCPGKey時會發生異常。

我做錯了什么,但我不知道這是什么。 有人可以幫忙嗎?

假設您已經在String str中擁有pgp公鑰(鎧裝ascii):

    InputStream in=new ByteArrayInputStream(str.getBytes());
    in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);

    JcaPGPPublicKeyRingCollection pgpPub = new JcaPGPPublicKeyRingCollection(in);
    in.close();

    PGPPublicKey key = null;
    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;
            }
        }
    }
    return key;

現在,您的可變鍵將具有您的PGPPublicKey。

我遇到了這個問題,結果證明公鑰環實際上是公鑰本身。 當我運行迭代器時,我實際上是在獲取子密鑰(該子密鑰變成了該消息塊而不是公共密鑰塊)。 如果我不能很好地解釋,請查看此解釋

假設realContact是僅包含子鍵的公共密鑰環,則實際上不需要通過getPublicKey()運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM