GMP プログラム
GNUプロジェクトの多倍長精度演算ライブラリ (GMP:GNU Multiple Precision Arithmetic Library)を使った暗号関係のサンプルプログラムです.
形式変換
mpz_t 型の多倍長整数の形式を変換する関数ライブラリです.バイト配列と mpz_t 型の多倍長整数との相互変換等を行います. ソースコードは,
mpconv.c です.
以下の関数があります.
- void mpz_mptoc (unsigned char *ch, unsigned int *n, mpz_ptr a)
mpz_t 型の多倍長整数を ch で指定された領域に格納する.
領域は必要十分な大きさを呼び出し側で確保する.実際にデータが格納されたサイズが変数 n に設定される.
- void mpz_mptouc (unsigned char *ch, unsigned int n, mpz_ptr a)
mpz_t 型の多倍長整数を指定された大きさ n の領域に格納する.
実際のデータが n より小さい場合は,格納領域の先頭に 0 が埋め込まれる.また,実際のデータが n より大きい場合は,データの先頭の n バイトのみ格納される.
- void mpz_ctomp (mpz_ptr a, unsigned char *ch, unsigned int n)
ch から始まる n バイトのデータを mpz_t 型の多倍長整数に変換する.
- int mpz_bytelen(mpz_ptr a)
多倍長整数 a の占めるバイト単位の長さを返す.
指定された条件の素数を生成する関数ライブラリです. ソースコードは,
genprime.c です.
以下の関数があります.
- void mpz_random_prime (mpz_ptr p, int bits)
ビット長が bits の素数 p をランダムに生成する.
- void mpz_random_prime2 (mpz_ptr p, mpz_ptr pmax, mpz_ptr pmin)
pmin < p < pmax の素数 p をランダムに生成する.
指定された条件の乱数を生成する関数ライブラリです. ソースコードは,
random.c です.
以下の関数があります.
- void mpz_random_max (mpz_ptr r, const mpz_ptr limit)
0 < r < limit の乱数 r を生成する.
- void mpz_random_bit (mpz_ptr r, const int bits)
ビット長が bits の乱数 r を生成する.
GMP を用いて RSA 暗号処理を行うプログラムです.ソースプログラムは,rsa_gmp.c です.
プログラムはコマンドとして起動するもので,仕様は以下です.
rsa_gmp [plainText]
パラメータ:
plainText: 平文テキスト(省略時は内部の固定テキスト)
RSA 暗号に関する以下の処理を行います.
- ランダムに素数 p,q および n = pq を生成する(n は 1024ビット).
- 公開鍵 e と秘密鍵 d をランダムに生成する.
- 公開鍵 e で平文を暗号化する.
- 秘密鍵 d で暗号文を復号する.
- 復号結果が平文に一致することを確認する.
コンパイル時の注意点は,以下です.
- mpconv.c,genprime.c および random.c をリンクすること.
- GNU MP をリンクすること (-lgmp).