[英]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.