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);
    }
}

답변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

관련 정보