「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 KEY、RSAキーを常に指定するため、キータイプOIDは含まれません。BEGIN RSA PRIVATE KEYPKCS#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
}

では、これら2つ以外に使用されている形式はありますか。また、ヘッダーからどのように判断できるのですか。
モニム2013年

1
sonicの回答で与えられた秘密鍵タグはどれも公正なゲームだと思います。
Jason C

RSAキーの場合、PKCS#1にはCRTパラメータが含まれますが、PKCS#8には含まれません。サイズを見れば確認できます。PKCS#8は、ヘッダーを追加しても小さくなります。パフォーマンスを重視する場合は、PKCS#1を使用してください。私のテストでは3倍速く表示されます。
ZZ Coder

5
@ZZCoder、キーの生成方法とパフォーマンスのテスト方法について詳しく教えてください。openssl genpkey -algorithm RSA -out key.pemCRTパラメータを含むPKCS#8キーを生成します。
Vadim Kuznetsov、2015年

5
PKCS#1鍵を生成するには、openssl genrsaコマンドを使用できます。を使用openssl reqして秘密キーとcrtの両方を生成すると、最終的に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
ポールトビアス

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.