OpenPGP以外のPEM形式のキーをGPGにインポートするにはどうすればよいですか?

OpenPGP以外のPEM形式のキーを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。お名前などをお好みに合わせて調整してください。

// パッケージなし
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
java.security.KeyPairのインポート;
import java.security.NoSuchProviderException;
java.security.Securityのインポート;
import 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のインポート;
import 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 ペアに変換する単純なユーティリティクラスです。
 * <血>
 *使用法:UnixSE276317 [-a] IDとパスワードでPEMを入力してください。
 * <血>
 * ここで、ID は公開鍵に関連付けられた名前です。鍵が配置されました
 * -a(armor) が指定されている場合は {pub,secret}.asc ファイルにあり、そうでない場合は .bpg です。
 */
//自己パッケージ化されたorg.bouncycastle.openpgp.examplesクラスRSAPrivateKeyGeneratorの変更
公開クラス UnixSE276317
{
    プライベート静的無効なエクスポートキーペア(
        出力ストリーム secretOut,
        出力ストリーム公開出力、
        キーペア、
        文字列ID、
        文字[]パスワード、
        ボアアーマー)
        IOException, InvalidKeyException, NoSuchProviderException, SignatureException, PGPException 発生
    {    
        もし(鎧)
        {
            SecretOut = new 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, ID, 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);

        //キーペアkp = kpg.generateKeyPair();

        int フラグ = args.length > 0 && args[0].equals("-a")? 1:0;

        if (args.length!= フラグ+3)
        {
            System.out.println("UnixSE276317 [-a] IDとパスワードで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 =新しいPKCS8EncodedKeySpec(pk8.getEncoded());
        KeySpec pubSpec = new RSAPublicKeySpec(keyStruct.getModulus(), keyStruct.getPublicExComponent());
        KeyPair kp =新しいKeyPair(fact.generatePublic(pubSpec)、fact.generatePrivate(privSpec));

        String []サフィックス = {"bpg","asc"};
        FileOutputStream out1 = new FileOutputStream("秘密" + サフィックス [フラグ]);
        FileOutputStream out2 = new FileOutputStream("pub."+suffix[flag]);
        エクスポートKeyPair(out1、out2、kp、args [flag + 0]、args [flag + 1]。toCharArray()、flag> 0);
    }
}

おすすめ記事