暗号プログラム (C言語版)

C言語で記述された暗号関連のプログラムのサンプルを紹介します. Linux上で動作確認していますが,Windows上でもそのまま,あるいはわずかな変更のみで動作するものと思います.

暗号ライブラリとして,OpenSSL を用いています. OpenSSL の高レベルの暗号化インタフェースである 主な EVP 関数の仕様を OpenSSL EVP 関数,および OpenSSL EVP_PKEY 関数に示します.

鍵交換 (DH)

DH (Diffie-Hellman) 法を用いた鍵交換を行う機能をテストするプログラムです. ソースプログラムは, keyagree.c です.

プログラムはコマンドとして起動します.

  keyagree [keyLen]

  パラメータ:
    keyLen: 鍵のビット長(省略時:64)

A パート,B パートで共有鍵の生成処理を以下の手順で行います.

  1. 指定されたビット長で DH 法のパラメータの素数 p を生成し,出力します.生成元の g は,g = 5 としています.(DH_generate_parameters_ex 関数)
  2. A パート,B パートそれぞれに秘密鍵と公開鍵を生成し,出力します.(DH_generate_key 関数)
  3. A パート,B パートそれぞれに自分の秘密鍵と相手の公開鍵を用いて共有鍵を生成し,出力します.(DH_compute_key 関数)
  4. A パート,B パートそれぞれに生成された共有鍵が等しいことを確認します.

コンパイル時の注意点は,以下です.

鍵交換 (ECDH)

DH (Diffie-Hellman) 法を用いた鍵交換を行う機能をテストするプログラムです(楕円曲線暗号版). ソースプログラムは, ecdh.c です.

プログラムはコマンドとして起動します.

  ecdh [nid]

  パラメータ:
    nid: 楕円曲線 ID(省略時:710 (secp160r2))

楕円曲線 ID の値と曲線名称の定義は,openssl/obj_mac.h に記述されています.

A パート,B パートで共有鍵の生成処理を以下の手順で行います.

  1. 指定された楕円曲線 ID で楕円曲線パラメータを取得します.(EC_KEY_new_by_curve_name 関数)
  2. A パート,B パートそれぞれに秘密鍵と公開鍵を生成し,出力します.(EC_KEY_generate_key 関数)
  3. A パート,B パートそれぞれに自分の秘密鍵と相手の公開鍵を用いて共有鍵を生成し,出力します.(ECDH_compute_key 関数)
  4. A パート,B パートそれぞれに生成された共有鍵が等しいことを確認します.

コンパイル時の注意点は,以下です.

inserted by FC2 system