web-dev-qa-db-ja.com

opensslを使用してec公開鍵のxおよびyコンポーネントを取得します

Openslを使用して曲線 'secp128r1'から [〜#〜] ecc [〜#〜] のKeyPairを生成しています

私が従った手順:

  • 最初に、コマンドを使用して秘密鍵を生成しました

    openssl ecparam -genkey -name secp128r1 -noout -out private.pem

  • 次に、コマンドを使用して対応する公開鍵を表示しました

    openssl ec -in private.pem -text -noout

    これは次のように出力を示しました:

    eCキーを読む

    秘密鍵:(128ビット)
    priv:
    00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:
    f4:bc
    パブ:
    04:04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
    3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:
    30:a8:a5

    ASN1 OID:secp128r1

ここで生成された公開鍵から明示的にxおよびyコンポーネントが必要ですが、これを行う正しい方法を誰かが提案できますか?
上記の公開鍵は264ビット長であるため、そのまま使用(/分割)することはできません。
ありがとう

12
Dhruv Agarwal

まず第一に、 secp128r1 は時代遅れです。今日の標準に対してより良いセキュリティを与える曲線を使用してください。ダニエル・J・バーンスタインとターニャ・ランゲによる safecurves を参照してください。

サイズqのフィールド上で定義された楕円曲線とすべての要素-point-には2つの座標[〜#〜] x [〜#〜]および[〜#〜] y [〜#〜]。楕円曲線Secp128r1には2つあります128-297-1サイズℓ、つまり2 ^ 128を少し下回るポイント数。これは、128ビット表現が必要であることを意味します。

曲線上の点でもある公開鍵には2つの座標があるため、2つの128ビットを格納する必要があります。

楕円曲線の方程式を見るとY2=X3 + aX + bここで、

 a = FFFFFFFD FFFFFFFF FFFFFFFF FFFFFF
 b = E87579C1 1079F43D D824993C 2CEE5E

方程式から[〜#〜] x [〜#〜]がわかれば、[〜#〜] y [〜#〜]を見つけることができます。 。フィールドで作業しているため、[〜#〜] y [〜#〜]は最大2つの平方根を持つことができます。 Y2の平方根はyまたは-yになります。この知識は、ポイントの表現を圧縮するために使用でき、ポイント圧縮と呼ばれます。 x座標と1ビットでyまたは-yを選択します。次に、ベースポイントを確認します( Certicomの推奨事項 を参照)

 base point = 03 161FF752 8B899B2D 0C28607C A52C5B86
            = 04 161FF752 8B899B2D 0C28607C A52C5B86 CF5AC839 5BAFEB13 C02DA292 DDED7A83 

最初のオクテット 構造を決定します

  • 04は圧縮がないことを意味します
  • 03は圧縮があることを意味し、ypositiveとして選択します
  • 02は圧縮があることを意味し、ynegativeとして選択します

次に、OPのパラメータに変換します。

pub:
04:
04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:3f:ed: -->X
5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:30:a8:a5  -->Y

最初のオクテット04は圧縮がないことを意味します。 1行目は[〜#〜] x [〜#〜]座標で、2行目は[〜#〜] y [〜 #〜]公開鍵の座標。

秘密鍵nはどうですか?これは、0 <=n<=ℓの間の単なるスカラー整数です。

プライベート:00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:f4:bc

したがって、上記の番号(ポイントではありません)が秘密鍵です。

いくつかのWebツールを使用してこの情報を抽出することもできます。

注:秘密鍵を公開しないでください。

1
kelalaka