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

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

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

RSA 暗号・署名 (EVP_PKEY)

OpenSSL の EVP_PKEY 関数を用いて,RSA の暗号化と署名を行うサンプルプログラムです.ソースプログラムは,rsa_evp.c です.

プログラムはコマンドとして起動するもので,仕様は以下です.

 rsa_evp [plainText]
  パラメータ:
    plainText : 暗号化および署名対象のテキストデータ

plainText を省略した場合は,プログラム内部の固定データが使われます.

プログラムでは,RSA の鍵ペア (秘密鍵,公開鍵) を生成します (公開鍵長は 2048 ビット).また,生成した鍵を使って,テキストデータを暗号化・復号,署名生成・検証を行い処理が正常に行われることを確認します.

DSA 署名 (EVP_PKEY)

OpenSSL の EVP_PKEY 関数を用いて,DSA 署名を行うサンプルプログラムです.ソースプログラムは,dsa_evp.c です.

プログラムはコマンドとして起動するもので,仕様は以下です.

 dsa_evp [[dataLen [paramLen]]
  パラメータ:
    dataLen : 署名対象データのバイト長  (省略時は,256)
    paramLen: DSA のパラメータのビット長 (省略時は,1024)

プログラムでは,DSA のパラメータを生成した後,鍵ペア (秘密鍵,公開鍵) を生成します.次に,生成した鍵を使って,指定バイト長の乱数データに対する署名生成・検証を行い処理が正常に行われることを確認します.

ECDH (EVP_KEY)

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

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

    ecdh_evp [nid]

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

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

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

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

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

inserted by FC2 system