如何将 PEM 格式(而非 OpenPGP)的密钥导入到 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?

答案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

相关内容