Hi I was writing a program that imports private keys from a .pem
file and create a private key object to use it later.. the problem I have faced is that some pem
files header begin with
-----BEGIN PRIVATE KEY-----
while others begin with
-----BEGIN RSA PRIVATE KEY-----
through my search I knew that the first ones are PKCS#8
formatted but I couldn't know what format does the other one belongs to.
ベストアンサー1
See https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (search the page for "BEGIN RSA PRIVATE KEY") (archive link for posterity, just in case).
BEGIN RSA PRIVATE KEY
PKCS#1 であり、単なる RSA キーです。基本的には PKCS#8 のキー オブジェクトですが、先頭にバージョンやアルゴリズム識別子がありません。PKCS BEGIN PRIVATE KEY
#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 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 }