web-dev-qa-db-ja.com

ECC公開鍵の長さがビット表現と異なります

マニュアルの次のコマンドを使用してOpenSSLで生成された256ビットのECC鍵ペア(256ビットは公開鍵の長さであると想定されています):

openssl ecparam -name secp256k1 -genkey -noout -out key.pem

と対応する公開鍵:

openssl ec -in key.pem -out public.pem -pubout

Public.pemファイルには、base64でエンコードされた文字列が含まれています。次に例を示します。

-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdPzYnkmkF8oy+R+FcByIbyPBE2l6HHOJ
mfZWtAaFZyIx9WPSzZTdyjmWlFqLvwaFlHu9OX9e7Snslfw7nneDIw==
-----END PUBLIC KEY-----

公開鍵は、ポイント(x座標とy座標)と使用される曲線で構成されます。

デコードされると、各座標は256ビット長の数値であり、キー自体は決して256ビット長ではありません。これは正しいです?

アプリケーションのセキュリティを維持しながら、可能な限り短い公開鍵の長さを目指していますが、提案された「256ビット公開鍵」が実際のサイズの2倍を超える理由がわかりません。

2
Youleean

楕円曲線は、ある整数qのサイズqの有限体上で定義されます。各曲線要素はpointであり、2つの座標[〜#〜] x [〜#〜][〜#〜] y [〜#〜]、これは曲線要素です。

暗号強度の重要なパラメーターである曲線の「サイズ」は、qに近いです。合計曲線サイズnは、| n q + 1)|であることを示すことができます。 ≤2 * sqrt(q)(つまり---(ハッセの定理 )。したがって、「256ビットカーブ」が必要な場合は、256ビットフィールドが必要になります。

ただし、公開鍵は2つの座標で表されるカーブポイントです。つまり、最終的にtwo256ビット値、つまり公開鍵サイズになります。さらに、標準の公開鍵フォーマットには、公開鍵が「楕円曲線」タイプであることを指定し、ポイントが含まれる実際の曲線を参照するいくつかのパラメーターも含まれています。この数値は実際のエンコードされたサイズではなく、キーの暗号強度に関連するため、これを「256ビット公開キー」と呼びます。


さらに掘り下げると、すべての曲線ポイントが、定義により、通常はY曲線方程式を満たさなければならないことに注意してください。2 = X + aX + b for 2つの定数aおよびb(これら定数は実際に曲線を定義します。したがって、[〜#〜] x [〜#〜]がわかっている場合は、Yを計算できます2曲線方程式を使用する。フィールドで作業しているので、要素はそのフィールドに最大2つの平方根を持つため、Yから2[〜#〜] y [〜#〜]-Yを取得できます。これにより、ポイント圧縮:ポイントの表現(X、Y)のみ[〜#〜] x [〜#〜]に1ビットの[〜#〜] y [〜#〜](それは[〜#〜] y [〜#〜]-Y)を区別するには十分ですポイント圧縮を使用すると、256ビットのEC公開鍵は257ビットに収まります(使用された曲線に関する情報が他の方法で送信されると想定)。

残念ながら、ポイント圧縮は気の利いたものですが、ある時点で特許が取られたようです。そのため、「標準」であっても、多くの既存の実装ではサポートされていません(ANS X9.62-2005で説明されています)。 「RFC」の観点から、ポイント圧縮のサポートは オプション です。したがって、これを使用すると、相互運用性が失われるリスクがあります。

(OpenSSLがポイント圧縮をサポートしているかどうかはわかりません。テストする必要があります。)

10
Thomas Pornin