我有这样的数据:
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDPzCORz9kUh4yt
73fiG1amQ16jwjXNzNO0d4xUWlrCP3dTfXnvtF35r2N/5Nefw9CcztBUAZACbwtn
(... just sample data ...)
jSYDRr88RZI4QYv9pW0+A8vWS2SJnIPW0fP9mcPOdZXxG/V2rL03YV5xcLCdbuBu
1tunEWZ5VcjfyEDfP7qZdWjGIYselOg=
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
如果我运行gpg --import它说:
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0
Run Code Online (Sandbox Code Playgroud)
我怎样才能把这个私钥放到 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/PGPSecretKey 对。
* <p>
* 用法:UnixSE276317 [-a] 身份密码输入PEM
* <p>
* 其中,identity 是与公钥关联的名称。钥匙已放置
* 如果指定了 -a(装甲),则在文件 {pub,secret}.asc 中,否则为 .bpg。
*/
//修改自包org.bouncycastle.openpgp.examples类RSAPrivateKeyGenerator
公共类 UnixSE276317
{
私有静态无效导出密钥对(
输出流秘密输出,
输出流公共输出,
密钥对对,
字符串身份,
char[] 密码,
布尔装甲)
抛出 IOException、InvalidKeyException、NoSuchProviderException、SignatureException、PGPException
{
如果(装甲)
{
SecretOut = 新的 ArmoredOutputStream(secretOut);
}
PGPDigestCalculator sha1Calc = new JcaPGPDigestCalculatorProviderBuilder().build().get(HashAlgorithmTags.SHA1);
PGPKeyPair keyPair = new JcaPGPKeyPair(PGPPublicKey.RSA_GENERAL, 对, new Date());
PGPSecretKey SecretKey = 新 PGPSecretKey(PGPSignature.DEFAULT_CERTIFICATION, keyPair, 身份, 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 key = SecretKey.getPublicKey();
key.encode(publicOut);
publicOut.close();
}
公共静态无效主(
字符串[] 参数)
抛出异常
{
Security.addProvider(new BouncyCastleProvider());
//KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
//kpg.initialize(1024);
//密钥对 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");
系统.退出(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));
String[] 后缀 = {"bpg","asc"};
FileOutputStream out1 = new FileOutputStream("秘密。"+suffix[flag]);
FileOutputStream out2 = new FileOutputStream("pub."+suffix[flag]);
exportKeyPair(out1, out2, kp, args[flag+0], args[flag+1].toCharArray(), flag>0);
}
}
| 归档时间: |
|
| 查看次数: |
4716 次 |
| 最近记录: |