web-dev-qa-db-ja.com

OpenSSLはECDH公開鍵を生成します

OpenSSLコマンドラインを使用して、次の仕様を満たすECDH公開キーを生成しようとしています。

グループP256のECDH公開鍵を含むBase64エンコードX.509 SubjectPublicKeyInfo構造を使用します

次のコマンドは、キーを提供します。

openssl ecparam -name prime256v1 -out prime256v1.pem
openssl ecparam -in prime256v1.pem -genkey -noout -out prime256v1-key.pem
openssl ec -in prime256v1-key.pem -pubout -out pubkey.pem

Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

ただし、このキーは、アクセスしているAPIで受け入れられません。

機能しているキーの例は次のとおりです。

MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACKoJz0lSBocGMsdl8TiMasRsBOxpMywCqzAoOLwZfUl0=

このサンプルキーは44(Base64)バイト短く、わずかに異なるSubjectPublickKeyInfo署名があります。

私の質問は、これらの2つのキーの違いは何であり、OpenSSLコマンドラインツールを使用してそのようなキーペアを生成するにはどうすればよいかです。

1
PassKit

圧縮バージョンを試す

「機能するキーの例」として投稿したのは、PEMラッパーと通常の改行なしのbase64でエンコードされたEC pubkeyです。より具体的には、EC公開キーの圧縮バージョンです。しかし、opensslは デフォルトでは非圧縮キー と書き込みます。

次のように、圧縮バージョンと非圧縮バージョンの間で変換できます。

$ cat ExampleOfRejectedKey.headerlesspem
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

Opensslをキーで解析する

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem)
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==
-----END PUBLIC KEY-----

繰り返しますが、「-conv_form圧縮」を使用します

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem) -conv_form compressed
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZQ=
-----END PUBLIC KEY-----

ご覧のとおり、今ではかなり短くなっています。そして、長さが作業キーに近い。これを試して。 (なぜAPIが圧縮表現を主張し、そうは言わないのかは私を超えています。)

参考文献

この質問を参照してください:2011-07-12、 EC公開鍵の標準化された固定長エンコーディングはありますか?

4
StackzOfZtuff