“BEGIN RSA PRIVATE KEY”와“BEGIN PRIVATE KEY”의 차이점


150

안녕하세요, .pem파일 에서 개인 키를 가져 와서 나중에 사용할 개인 키 개체를 만드는 프로그램을 작성하고있었습니다 . 내가 직면 한 문제는 일부 pem파일 헤더로 시작 한다는 것 입니다

-----BEGIN PRIVATE KEY-----

다른 사람들로 시작하는 동안

-----BEGIN RSA PRIVATE KEY-----

내 검색을 통해 첫 번째 PKCS#8형식의 서식을 알았지 만 다른 형식의 형식을 알 수 없었습니다.

답변:


183

참조 https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem을 (( "BEGIN RSA PRIVATE KEY"의 페이지를 검색) 아카이브 링크 단지의 경우에 후손에 대한).

BEGIN RSA PRIVATE KEYPKCS # 1이며 RSA 키일뿐입니다. 기본적으로 PKCS # 8의 핵심 개체이지만 버전 또는 알고리즘 식별자가 없습니다. BEGIN PRIVATE KEYPKCS # 8이며 키 유형이 키 데이터 자체에 포함되어 있음을 나타냅니다. 링크에서 :

암호화되지 않은 PKCS # 8 인코딩 데이터는 태그로 시작하고 끝납니다.

-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----

base64로 인코딩 된 데이터에는 다음과 같은 DER 구조가 있습니다.

PrivateKeyInfo ::= SEQUENCE {
  version         Version,
  algorithm       AlgorithmIdentifier,
  PrivateKey      BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

따라서 RSA 개인 키의 경우 OID는 1.2.840.113549.1.1.1이며 PrivateKey 키 데이터 비트 열로 RSAPrivateKey가 있습니다.

반대로 BEGIN RSA PRIVATE KEYRSA 키를 항상 지정하므로 키 유형 OID를 포함하지 않습니다. BEGIN RSA PRIVATE KEY입니다 PKCS#1:

RSA 개인 키 파일 (PKCS # 1)

RSA 개인 키 PEM 파일은 RSA 키에 따라 다릅니다.

태그로 시작하고 끝납니다.

-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----

base64로 인코딩 된 데이터에는 다음과 같은 DER 구조가 있습니다.

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

따라서이 두 가지 형식을 제외하고 사용되는 형식이 있습니까? 헤더에서 어떻게 확인할 수 있습니까?
monim

1
소닉의 답변에 주어진 개인 키 태그가 공정한 게임이라고 생각합니다.
Jason C

RSA 키의 경우, PKCS # 1은 CRT 매개 변수를 포함하고 PKCS # 8은 포함하지 않습니다. 크기를 확인하여이를 확인할 수 있습니다. 더 많은 헤더를 추가해도 PKCS # 8은 더 작습니다. 성능이 마음에 들면 PKCS # 1을 사용하십시오. 내 테스트는 3 배 더 빠릅니다.
ZZ 코더

5
@ZZCoder, 키 생성 및 성능 테스트 방법에 대한 세부 정보를 제공해 주시겠습니까? openssl genpkey -algorithm RSA -out key.pemCRT 매개 변수를 포함하는 PKCS # 8 키를 생성합니다.
Vadim Kuznetsov

5
PKCS # 1 키 를 생성하기 위해 openssl genrsa명령을 사용할 수 있습니다. 사용하여 openssl req개인 키와 함께 종료됩니다 브라운관을 모두 생성하는 PKCS # 8 키를 누릅니다. genpkey수동 상태 The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. 그러나 일부 소프트웨어 ( mysql)는 PKCS # 1 키만 사용할 수 있습니다 . PKCS # 8 에서 PKCS # 1 로 변환 은로 수행 할 수 있습니다 openssl rsa -in key.pem -out key.pem. 다른 방법으로 변환은으로 수행 할 수 있습니다 openssl pkey -in key.pem -out key.pem.
Paul Tobias

28

를보십시오 <openssl/pem.h>. 가능한 BEGIN 마커를 제공합니다.

빠른 참조를 위해 위의 링크에서 컨텐츠 복사

#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509     "CERTIFICATE"
#define PEM_STRING_X509_PAIR    "CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL "X509 CRL"
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC   "PUBLIC KEY"
#define PEM_STRING_RSA      "RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC   "RSA PUBLIC KEY"
#define PEM_STRING_DSA      "DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC   "DSA PUBLIC KEY"
#define PEM_STRING_PKCS7    "PKCS7"
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8    "ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF "PRIVATE KEY"
#define PEM_STRING_DHPARAMS "DH PARAMETERS"
#define PEM_STRING_DHXPARAMS    "X9.42 DH PARAMETERS"
#define PEM_STRING_SSL_SESSION  "SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS    "DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
#define PEM_STRING_PARAMETERS   "PARAMETERS"
#define PEM_STRING_CMS      "CMS"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.