>  기사  >  Java  >  PEM 인코딩 파일에서 RSA 개인 키를 추출하는 방법은 무엇입니까?

PEM 인코딩 파일에서 RSA 개인 키를 추출하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-09 04:52:02490검색

How to Extract an RSA Private Key from a PEM Encoded File?

PEM으로 인코딩된 개인 키 파일에서 RSA 개인 키 가져오기

이 경우 제공된 개인 키는 PEM 형식으로 인코딩됩니다. , 특히 PKCS#1을 사용합니다. 이 PEM 인코딩 파일에서 RSA 개인 키를 검색하려면 다음 접근 방식 중 하나를 활용할 수 있습니다.

접근 방법 1: DER 시퀀스 구문 분석을 사용하여 수정된 코드

제공된 Java 코드는 PEM으로 인코딩된 키를 읽고 디코딩을 시도합니다. 아래 제안된 수정 사항을 사용하면 PKCS#1 형식 개인 키를 구문 분석할 수 있습니다.

...
// Skip version seq[0];
BigInteger modulus = seq[1].getBigInteger();
BigInteger publicExp = seq[2].getBigInteger();
BigInteger privateExp = seq[3].getBigInteger();
...
RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);

KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePrivate(keySpec);
...

접근 방법 2: Sun 공급자를 사용하여 코드 개선

대체 솔루션은 다음과 같습니다. DER 시퀀스 구문 분석을 위해 sun.security 공급자를 활용하고 키 생성을 위해 java.security 패키지를 활용합니다. 이 접근 방식은 보다 간결하고 FIPS 호환 구현을 제공합니다.

import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.PrivateKey;

public static PrivateKey pemFileLoadPrivateKeyPkcs1(File pemFileName) throws GeneralSecurityException, IOException {
    // PKCS#1 format
    String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----";
    String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----";

    Path path = Paths.get(pemFileName.getAbsolutePath());
    String privateKeyPem = new String(Files.readAllBytes(path));
    privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");
    privateKeyPem = privateKeyPem.replaceAll("\s", "");

    DerInputStream derReader = new DerInputStream(Base64.getDecoder().decode(privateKeyPem));
    DerValue[] seq = derReader.getSequence(0);

    if (seq.length < 9) {
        throw new GeneralSecurityException("Could not parse a PKCS1 private key.");
    }

    // Skip version seq[0];
    BigInteger modulus = seq[1].getBigInteger();
    BigInteger publicExp = seq[2].getBigInteger();
    BigInteger privateExp = seq[3].getBigInteger();
    BigInteger prime1 = seq[4].getBigInteger();
    BigInteger prime2 = seq[5].getBigInteger();
    BigInteger exp1 = seq[6].getBigInteger();
    BigInteger exp2 = seq[7].getBigInteger();
    BigInteger crtCoef = seq[8].getBigInteger();

    RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(keySpec);
}

이 코드는 제공된 PEM 파일에서 개인 키를 성공적으로 읽고 구문 분석하며 RSA 개인 키 개체를 제공합니다.

위 내용은 PEM 인코딩 파일에서 RSA 개인 키를 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.