Gpg

如何將 PEM 格式(不是 OpenPGP)的密鑰導入 GPG?

  • April 16, 2016

我有這樣的數據:

-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDPzCORz9kUh4yt
73fiG1amQ16jwjXNzNO0d4xUWlrCP3dTfXnvtF35r2N/5Nefw9CcztBUAZACbwtn
(... just sample data ...)
jSYDRr88RZI4QYv9pW0+A8vWS2SJnIPW0fP9mcPOdZXxG/V2rL03YV5xcLCdbuBu
1tunEWZ5VcjfyEDfP7qZdWjGIYselOg=
-----END PRIVATE KEY-----

如果我執行gpg --import它說:

gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

我怎樣才能把這個私鑰輸入 GPG?

儘管底層加密原語相似,但包括密鑰在內的 PGP 文件(數據包)格式與 OpenSSL 使用的格式(主要是 ASN.1 和 PEM)非常不同。您沒有這麼說,但這似乎是一個 RSA 密鑰。如果 Java 適合您,它可以使用http://www.bouncycastle.org的 BCPROV 加上 BCPKIX(用於 PEM)和 BCPG(用於 PGP)來實現。根據口味調整名稱等。

// 無包
導入 java.io.FileOutputStream;
導入 java.io.FileReader;
導入 java.io.IOException;
導入 java.io.OutputStream;
導入 java.security.InvalidKeyException;
導入 java.security.KeyFactory;
導入 java.security.KeyPair;
導入 java.security.NoSuchProviderException;
導入 java.security.Security;
導入 java.security.SignatureException;
導入 java.security.spec.KeySpec;
導入 java.security.spec.PKCS8EncodedKeySpec;
導入 java.security.spec.RSAPublicKeySpec;
導入 java.util.Date;
導入 org.bouncycastle.asn1.ASN1Sequence;
導入 org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
導入 org.bouncycastle.bcpg.ArmoredOutputStream;
導入 org.bouncycastle.bcpg.HashAlgorithmTags;
導入 org.bouncycastle.jce.provider.BouncyCastleProvider;
導入 org.bouncycastle.openpgp.PGPEncryptedData;
導入 org.bouncycastle.openpgp.PGPException;
導入 org.bouncycastle.openpgp.PGPKeyPair;
導入 org.bouncycastle.openpgp.PGPPublicKey;
導入 org.bouncycastle.openpgp.PGPSecretKey;
導入 org.bouncycastle.openpgp.PGPSignature;
導入 org.bouncycastle.openpgp.operator.PGPDigestCalculator;
導入 org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
導入 org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
導入 org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
導入 org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder;
導入 org.bouncycastle.openssl.PEMParser;

/**
* 將 PEM PKCS8 (OpenSSL) 轉換為 RSA PGPPublicKey/PGPSSecretKey 對的簡單實用程序類。
* <p>
* 用法:UnixSE276317 [-a] 身份密碼輸入PEM
* <p>
* 其中 identity 是與公鑰相關聯的名稱。鑰匙已放置
* 在文件 {pub,secret}.asc 中,如果指定了 -a(盔甲),否則為 .bpg。
*/
//修改自包 org.bouncycastle.openpgp.examples 類 RSAPrivateKeyGenerator
公共類 UnixSE276317
{
私有靜態無效exportKeyPair(
輸出流秘密輸出,
輸出流公共輸出,
密鑰對,
字元串標識,
char[] 密碼片語,
布爾裝甲)
拋出 IOException、InvalidKeyException、NoSuchProviderException、SignatureException、PGPException
{ 
如果(裝甲)
{
secretOut = new ArmoredOutputStream(secretOut);
}

PGPDigestCalculator sha1Calc = new JcaPGPDigestCalculatorProviderBuilder().build().get(HashAlgorithmTags.SHA1);
PGPKeyPair keyPair = new JcaPGPKeyPair(PGPublicKey.RSA_GENERAL, pair, new Date());
PGPSecretKey secretKey = new PGPSecretKey(PGPSignature.DEFAULT_CERTIFICATION, keyPair, identity, sha1Calc, null, null,
新的 JcaPGPContentSignerBuilder(keyPair.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA1),
新的 JcePBESecretKeyEncryptorBuilder(PGPEncryptedData.CAST5, sha1Calc).setProvider("BC").build(passPhrase));

secretKey.encode(secretOut);

secretOut.close();

如果(裝甲)
{
publicOut = new ArmoredOutputStream(publicOut);
}

PGPPublicKey 密鑰 = secretKey.getPublicKey();

key.encode(publicOut);

publicOut.close();
}

公共靜態無效主要(
字元串 [] 參數)
拋出異常
{
Security.addProvider(new BouncyCastleProvider());

//KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");

//kpg.initialize(1024);

//KeyPair kp = kpg.generateKeyPair();

int flag = args.length > 0 && args[0].equals("-a")? 1:0;

if (args.length != flag+3)
{
System.out.println("UnixSE276317 [-a] 身份密碼輸入PEM");
System.exit(0);
}

// 改編自 org.bouncycastle.openssl.PEMParser$PrivateKeyParser+RSAKeyPairParser
FileReader rdr = new FileReader (args[flag+2]);
PrivateKeyInfo pk8 = (PrivateKeyInfo) new PEMParser(rdr).readObject();
rdr.close();
ASN1Sequence seq = (ASN1Sequence) pk8.parsePrivateKey();
org.bouncycastle.asn1.pkcs.RSAPrivateKey keyStruct = org.bouncycastle.asn1.pkcs.RSAPrivateKey.getInstance(seq);
KeyFactory 事實 = KeyFactory.getInstance ("RSA");
KeySpec privSpec = new PKCS8EncodedKeySpec (pk8.getEncoded());
KeySpec pubSpec = new RSAPublicKeySpec(keyStruct.getModulus(), keyStruct.getPublicExponent());
KeyPair kp = new KeyPair (fact.generatePublic(pubSpec), fact.generatePrivate(privSpec));

字元串[] 後綴 = {"bpg","asc"};
FileOutputStream out1 = new FileOutputStream("secret."+suffix[flag]);
FileOutputStream out2 = new FileOutputStream("pub."+suffix[flag]);
exportKeyPair(out1, out2, kp, args[flag+0], args[flag+1].toCharArray(), flag>0);
}
}

引用自:https://unix.stackexchange.com/questions/276317