23

OpenSSL の c ライブラリを使用して、楕円曲線 Diffie-Hellman (ECDH) キー ペアを生成しています。最初のコード サンプルはこちらです。次の行で、公開鍵の実際の交換について詳しく説明します。

peerkey = get_peerkey(pkey);

pkey変数と戻り値はどちらも型ですEVP *pkey以前に生成された公開鍵、秘密鍵、およびパラメーターが含まれ、戻り値にはピアの公開鍵のみが含まれます。したがって、これにより 3 つの疑問が生じます。

  1. ピアに送信するためget_peerkey()に実際に公開鍵だけを抽出するにはどうすればよいでしょうか?pkey
  2. コードは秘密鍵とパラメータを抽出してpKey、鍵交換後に後で使用できるように保存するにはどうすればよいでしょうか?
  3. ピアの生の公開鍵からget_peerkey()新しい構造をどのように生成しますか?EVP_PKEY

EVP_PKEY_print_public()OpenSSL 関数、EVP_PKEY_print_private()、およびを見てきましたEVP_PKEY_print_params()が、これらは人間が読める出力を生成するためのものです。EVP_PKEYそして、人間が読める公開鍵を構造体に戻すための同等のものは見つかりませんでした。

4

2 に答える 2

48

私自身の質問に答えるために、秘密鍵と公開鍵には別のパスがあります。

公開鍵をシリアル化するには:

  1. EVP_PKEY を EVP_PKEY_get1_EC_KEY() に渡して、EC_KEY を取得します。
  2. EC_KEY を EC_KEY_get0_public_key() に渡して、EC_POINT を取得します。
  3. EC_POINT を EC_POINT_point2oct() に渡して、符号なしの char * であるオクテットを取得します。

公開鍵を逆シリアル化するには:

  1. オクテットを EC_POINT_oct2point() に渡して、EC_POINT を取得します。
  2. EC_POINT を EC_KEY_set_public_key() に渡して、EC_KEY を取得します。
  3. EC_KEY を EVP_PKEY_set1_EC_KEY に渡して、EVP_KEY を取得します。

秘密鍵をシリアル化するには:

  1. EVP_PKEY を EVP_PKEY_get1_EC_KEY() に渡して、EC_KEY を取得します。
  2. EC_KEY を EC_KEY_get0_private_key() に渡して BIGNUM を取得します。
  3. BIGNUM を BN_bn2mpi() に渡して mpi を取得します。これは unsigned char * に書き込まれる形式です。

秘密鍵を逆シリアル化するには:

  1. mpi を BN_mpi2bn() に渡して、BIGNUM を取得します。
  2. BIGNUM を EC_KEY_set_private_key() に渡して、EC_KEY を取得します。
  3. EC_KEY を EVP_PKEY_set1_EC_KEY に渡して、EVP_KEY を取得します。

BIGNUM を 16 進数、10 進数、または "bin" に変換することもできますが、mpi の使用バイト数が最も少ないと思います。

于 2013-09-04T00:42:13.217 に答える