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

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

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

暗号化・復号

OpenSSLの暗号ライブラリを用いて,ファイルを暗号化・復号するプログラムです.ソースプログラムは,scipher.c です.

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

 scipher {-e | -d} inFile outFile
  パラメータ:
    -e: 暗号化オプション
    -d: 復号オプション
    inFile : 入力ファイル名
    outFile: 出力ファイル名

ここで,オプションの -e または -d は,どちらか一方を指定します.inFile は,-e 指定時は平文ファイル,-d 指定時は暗号文ファイルを指定します. また,outFile は,-e 指定時は暗号文ファイル,-d 指定時は復号文ファイルを指定します.出力ファイルは,指定された名称で生成されます.

プログラムでは,ckey という構造体に暗号アルゴリズム名称,鍵 key および初期ベクトル iv が定義されています(デフォルトは,AES暗号,128ビット,CBCモード).これを変更すれば,他のアルゴリズムや鍵に変更できます.

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

パスワード暗号

OpenSSLの暗号ライブラリを用いて,ファイルをパスワード暗号により暗号化・復号するプログラムです.ソースプログラムは,pwdcrypt.c です.

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

 pwdcrypt {-e | -d} password inFile outFile
  パラメータ:
    -e: 暗号化オプション
    -d: 復号オプション
    password : パスワード
    inFile : 入力ファイル名
    outFile: 出力ファイル名

パラメータの password で指定されたパスワードから共通鍵を生成し,暗号化/復号します.パスワードからの鍵の生成には,OpenSSL の PKCS5_PBKDF2_HMAC_SHA1 関数を用いています.

ここで,オプションの -e または -d は,どちらか一方を指定します.inFile は,-e 指定時は平文ファイル,-d 指定時は暗号文ファイルを指定します. また,outFile は,-e 指定時は暗号文ファイル,-d 指定時は復号文ファイルを指定します.出力ファイルは,指定された名称で生成されます.

プログラムでは,パスワード暗号における鍵生成時のパラメータである ソールト(salt) と繰り返し数 (Iteration count) を定数として保持しています.暗号アルゴリズムは,AES暗号,128ビット,CBCモードを用いています(変更可能).

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

RSA暗号・署名

OpenSSLの暗号ライブラリを用いて,RSAの暗号化と署名を行うサンプルプログラムです.ソースプログラムは,rsacrypt.c です (OpenSSL の EVP_PKEY 関数を用いた RSA暗号・署名のサンプルプログラムは RSA 暗号・署名 (EVP_PKEY) にあります).

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

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

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

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

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

メッセージダイジェスト

OpenSSLの暗号ライブラリを用いて,指定されたファイルのメッセージダイジェストを生成するプログラムです.ソースプログラムは,mdigest.c です.

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

 mdigest inFile outFile
  パラメータ:
    inFile : 入力ファイル名
    outFile: 出力ファイル名

ここで,inFile は,メッセージダイジェストの対象となる入力ファイルを指定します. また,outFile は,メッセージダイジェストの結果を格納するファイルを指定します. なお,入力ファイルの最後の1バイト(EOF)は,メッセージダイジェストの対象外とされます.

プログラムでは,digestAlg という配列にダイジェストアルゴリズムが定義されています(デフォルトは,SHA1).これを変更すれば,他のアルゴリズムに変更できます.

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

inserted by FC2 system