web-dev-qa-db-ja.com

.pemファイルはキーの格納にどのような種類のエンコーディングを使用しますか?

.pemファイルに保存されているRSA暗号の係数はどのエンコーディングですか?モジュラスのbase64に似ていますか?

以下を使用して係数を取得できます。

openssl rsa -in pubkey.pem -pubin -modulus

しかし、それは実際に何をするのでしょうか? 2つの素数(n)の積が10進数形式である場合、rsaユーティリティがデコードできるように、それをどのようにエンコードする必要がありますか?

3

一般的に使用される2つの形式があります。

  • DER-バイナリ;データは ASN.1 構造に格納されます
  • PEM-テキスト;基本的には、base64でエンコードされたDERです。

たとえば、openssl asn1parseコマンドまたは オンラインデコーダー を使用して、両方を検査できます。

6
zakjan

この質問(および回答)は https://stackoverflow.com/questions/1193529/how-to-store-retreieve-rsa-public-private-key/13104466#13104466 のサブセットです。それを圧縮して調整するには:

RSA公開鍵の場合は、係数と指数が必要です。指数として3または65537(別名F4、4番目のフェルマー素数)を使用することは非常に一般的ですが、必須でも普遍的でもありません。

OpenSSLlibraryは、RSA固有のPKCS#1/rfc3447キー形式、または一般的でより便利で一般的なX.509 "SPKI"形式のいずれかをサポートできます。いずれかがDERまたはPEMに保存されています。コマンドラインユーティリティrsaデフォルトはSPKI PEMを実行しますが、オプションを使用して他の形式を選択できます。マンページ(オンライン- http://www.openssl.org/docs/apps/rsa.html )。

(@zakjanが言うように)DERはASN.1のエンコードであり、PEMはbase64(モジュラスのような個々のフィールドではなく全体)としてDER(さらに)エンコードされ、さらにBEGINおよびEND行がフォーマットを示します。このケースは、PKCS#1の場合はRSA PUBLIC KEY、SPKIの場合はPUBLIC KEYのみです。 PKCS#1をDERでエンコードするには、モジュラスと指数をASN.1 INTEGERとしてエンコードします。RSAモジュラスはほとんどの場合8の倍数(1024、2048など)としてサイズ設定されるため、先頭に00オクテットが必要であり、次にシーケンス。 SPKIの場合、RSAを識別するAlgorithmIdentifierを使用してSEQUENCEにさらに埋め込みます rfc3279 ごと。

または、OpenSSLライブラリを使用してエンコードすることもできます。 2つの数値を "bignum"(BN)オブジェクトに入れ、RSAオブジェクトからの数値をポイントし(他のフィールドを空に初期化したまま)、それを(推奨されない)RSAPublicKeyルーチンで書き込むか、または(空の)EVP_PKEY_set1_RSAを含むEVP_PKEYオブジェクトと、DERの場合はd2i_PublicKey{_fp,bio}、PEMの場合はPEM_write[_bio]_PublicKeyを使用して書き込みます。

3