我有这样的数据:
-----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对您来说还可以,那么可以使用BCPROV以及来自http://www.bouncycastle.org的BCPROIX和BCPKIX(对于PEM)和BCPG(对于PGP)来实现。调整名称等以品尝。
// nopackage 导入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]身份passPhrase输入PEM * <p> *其中,identity是与公钥关联的名称。按键已放置 *如果指定了-a(装甲),则在{pub,secret} .asc文件中为*,否则为.bpg。 * / //从org.bouncycastle.openpgp.examples包修改而来的RSAPrivateKeyGenerator类 公共类UnixSE276317 { 私有静态无效exportKeyPair( OutputStream secretOut, OutputStream publicOut, KeyPair对, 字符串身份, char [] passPhrase, 布尔装甲) 引发IOException,InvalidKeyException,NoSuchProviderException,SignatureException,PGPException { 如果(装甲) { secretOut =新的ArmoredOutputStream(secretOut); } PGPDigestCalculator sha1Calc = new JcaPGPDigestCalculatorProviderBuilder()。build()。get(HashAlgorithmTags.SHA1); PGPKeyPair keyPair =新的JcaPGPKeyPair(PGPPublicKey.RSA_GENERAL,对,新的Date()); PGPSecretKey secretKey =新的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 =新的ArmoredOutputStream(publicOut); } PGPPublicKey key = secretKey.getPublicKey(); key.encode(publicOut); publicOut.close(); } public static void main( 字符串[]参数) 抛出异常 { 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; 如果(args.length!= flag + 3) { System.out.println(“ UnixSE276317 [-a] identity passPhrase inputPEM”); System.exit(0); } //改编自org.bouncycastle.openssl.PEMParser $ PrivateKeyParser + RSAKeyPairParser FileReader rdr =新的FileReader(args [flag + 2]); PrivateKeyInfo pk8 =(PrivateKeyInfo)新的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 =新的PKCS8EncodedKeySpec(pk8.getEncoded()); KeySpec pubSpec = new RSAPublicKeySpec(keyStruct.getModulus(),keyStruct.getPublicExponent()); KeyPair kp =新的KeyPair(fact.generatePublic(pubSpec),fact.generatePrivate(privSpec)); String []后缀= {“ bpg”,“ asc”}; FileOutputStream out1 =新的FileOutputStream(“ secret。” +后缀[flag]); FileOutputStream out2 =新的FileOutputStream(“ pub。” +后缀[flag]); exportKeyPair(out1,out2,kp,args [flag + 0],args [flag + 1] .toCharArray(),flag> 0); } }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句