Linux 開発環境
Linux 環境で C 言語版の暗号関連プログラムを開発する際の開発環境を紹介します.
Linux は,フリーかつオープンソースなソフトウェアとして提供されており,ソースコードも無償で入手でき,GNU 一般公衆利用許諾書の元で非営利・営利に関わらず誰でも自由に使用・修正・頒布できます.
デスクトップ用の Linux は,GNU/Linux ディストリビューションという形でパッケージ化されて配布されています.代表的なディストリビューションには,Debian系(Ubuntu,Linux Mint),Red
Hat Linux系
(Fedora,Red Hat Enterprise Linux,CentOS),openSUSE などがあります.
- Linux OS のインストール
インストール環境としては,HD のパーティションに直接インストールし OS ブート時に選択する方法と,VMWare や VirtualBox
などの仮想化ソフトウェアを使って仮想マシン上にインストールする(Windows
上に Linux をゲストOSとしてインストールするなど)方法があります.
最近の CPU なら仮想マシンでも性能的にはほとんど問題がなく,環境構築も比較的簡単で Windows と Linux を同時に使えるなどの利点もあるためお勧めです.
- 開発用ツールのインストール
開発に必要なツール類は,デフォルトでインストールされていなければ,パッケージ管理ツール(Debian系は apt-get/apt,RedHat系は yum
など)を使って個別にインストールします.
- コンパイラ環境
C/C++ 言語のコンパイラ環境として,gcc/g++ をインストールします.
その他,デバッガ (gdb),ビルドツール (make),メモリリーク解析 (valgrind) など開発ツール類を適宜インストールします.
- 多倍長整数ライブラリ
暗号処理では,1000ビット以上の大きな数を扱うため,多倍長整数ライブラリが必要です. 多倍長整数ライブラリとして
GNU MP をインストールします.
- 暗号ライブラリ
各種の暗号認証アルゴリズムが実装されたライブラリとして OpenSSL をインストールします.
ライブラリのインストール時には,パッケージにライブラリ本体とヘッダファイルなどを含む開発パッケージ(ファイル名に -devel や -dev が付く)の2種類あるので両方をインストールします.例えば,OpenSSL
ライブラリであれば,libssl1.1 と libssl-dev など.
なお,Windows 環境で Linux をインストールせず Linux 環境と同じ gcc/g++ コンパイラを用いて C/C++ 言語プログラムを開発できる環境として MinGW があります. (→
MinGW).
また.Windows 10 以降では Linux のプログラムを実行可能にする WSL (Windows Subsystem for Linux) が利用できます.(→ WSL 1,WSL 2)
ライブラリの利用
- GMP ライブラリ
GMP を利用したコンパイル時の注意点は以下です.
- ヘッダファイル "gmp.h" をインクルードする.
- リンクオプションとして "-lgmp" を付けてコンパイルする.
- OpenSSL ライブラリ
OpenSSL を利用したコンパイル時の注意点は以下です.
プログラム開発
- コンパイル
コンパイラ gcc でソースファイルをコンパイルし,実行ファイルを生成するコマンドの一般形式は以下です.
gcc -Wall -O3 -Iinc_path -Llib_path -llib_name -o out_file src_file
inc_path : インクルードファイルパス
lib_path : ライブラリパス
lib_name : 共有ライブラリ名(複数指定可)
out_file : 実行ファイル名
src_file : ソースファイル名(複数指定可)
ここで,-Wall は警告メッセージの表示,-O3 は最適化のオプションです.
- Makefile
多数のファイルから構成される大きなプログラムでは,make コマンドを使いコンパイルの手順を記述するのが便利です.
GMP および OpenSSL ライブラリを使う場合の Makefile の例を示します.
OPENSSL_DIR = /usr/local/openssl
INCDIR = -I$(OPENSSL_DIR)/include
LDFLAGS = -lgmp -lssl -lcrypto
CC = gcc
RM = rm -f
CFLAGS = -W -Wall -O3 $(INCDIR)
.c.o:
$(CC) -c $(CFLAGS) $<
PROGRAM = program1 program2
all: program1 program2
program1: source1.c source2.c source3.c
$(CC) -o $@ $(CFLAGS) $< $(LDFLAGS)
program2: source4.c source5.c
$(CC) -o $@ $(CFLAGS) $< $(LDFLAGS)
clean:
$(RM) *.o $(PROGRAM)
- 環境変数
コンパイルに関係する以下の環境変数が指定できます.
- PATH
実行ファイルの検索パス
- LD_LIBRARY_PATH
共有ライブラリの検索パス
- C_INCLUDE_PATH
C言語のインクルードファイルパス