![如何将 PEM 格式(而非 OpenPGP)的密钥导入到 GPG 中?](https://linux22.com/image/87594/%E5%A6%82%E4%BD%95%E5%B0%86%20PEM%20%E6%A0%BC%E5%BC%8F%EF%BC%88%E8%80%8C%E9%9D%9E%20OpenPGP%EF%BC%89%E7%9A%84%E5%AF%86%E9%92%A5%E5%AF%BC%E5%85%A5%E5%88%B0%20GPG%20%E4%B8%AD%EF%BC%9F.png)
我有这样的数据:
-----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?
答案1
尽管底层加密原语相似,但包括密钥在内的 PGP 文件(数据包)格式与 OpenSSL 使用的格式(主要是 ASN.1 和 PEM)有很大不同。你没有这么说,但这似乎是一个 RSA 密钥。如果 Java 适合您,它可以使用 BCPROV 加上 BCPKIX(对于 PEM)和 BCPG(对于 PGP)来做到这一点http://www.bouncycastle.org。根据口味调整名称等。
// 无包 导入 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 { 私有静态无效导出密钥对( 输出流 secretOut, 输出流公共输出, 密钥对对, 字符串身份, 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); } }
答案2
我认为相关答案已发布这里是 grub efi 密钥 和这个链接如何查看 PEM 的内容可以工作。
openssl x509 -inform DER -in /var/lib/shim-signed/mok/MOK.der -outform PEM -out ~/MOK_certificate.pem
这种导出和导入就像剪切和粘贴一样简单。
openssl x509 -in certificate.pem -text