Gpg
如何將 PEM 格式(不是 OpenPGP)的密鑰導入 GPG?
我有這樣的數據:
-----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); } }