Javaプログラム (Math)
Java言語で記述された暗号機能の実装に利用できる数学関連プログラムです.
パッケージ名は,Blanclux.math としていますので,コンパイル時にはディレクトリ構成に注意して下さい.
多倍長整数演算を実行するクラス(Blanclux.math.MPInt)です.ソースプログラムは,
MPInt.java です.
java.math.BigIntegerのラッパクラスとなっており,基本的には BigIntegerクラスと同様に利用できます.ただし,次に示すメソッド(暗号機能の実装に必要な関数)が追加になっています.
- 値の設定
- void setOne()
1 を設定する.
- void setZero()
0 を設定する.
- static MPInt psetBit(MPInt n, int sb, int eb)
n のビット位置 sb から eb (ab > eb )までを 1 に設定する.
- static MPInt stuff(MPInt n)
LSB が 1 になるまで右シフトする.
- 数の判定
- static boolean isZero(MPInt n)
n= 0 のとき真,さもなくば偽を返す.
- static boolean isOne(MPInt n)
n= 1 のとき真,さもなくば偽を返す.
- static boolean isEven(MPInt n)
n が偶数のとき真,さもなくば偽を返す.
- static boolean isOdd(MPInt n)
n が奇数のとき真,さもなくば偽を返す.
- static boolean isMult3(MPInt n)
n が 3 の倍数のとき真,さもなくば偽を返す.
- static boolean isMult5(MPInt n)
n が 5 の倍数のとき真,さもなくば偽を返す.
- 算術演算
- static MPInt expu(MPInt n, long e)
ae を返す.
- 剰余演算
- static MPInt modadd(MPInt a, MPInt b, MPInt n)
a + b mod n を返す.
- static MPInt modsub(MPInt a, MPInt b, MPInt n)
a - b mod n を返す.
- static MPInt modmult(MPInt a, MPInt b, MPInt n)
a × b mod n を返す.
- static MPInt modexpCrt(MPInt n, MPInt dp, MPInt dq, MPInt p, MPInt q, MPInt qi)
中国人の剰余定理を使い,
nd mod pq を返す.
ここで,
dp = d mod p-1, dq = d mod q-1,qi = 1/q mod p である.
- static MPInt modsqrt(MPInt a, MPInt p)
x2 = a mod p なる x を返す.
- 数論関数
- static MPInt sqrt(MPInt n)
floor(sqrt(n)) を返す.
- static MPInt gcd(MPInt a, MPInt b)
GCD (a, b) を返す.
- static MPInt lcm(MPInt a, MPInt b)
LCM (a, b) を返す.
- static MPInt[] exgcd(MPInt a, MPInt b)
拡張ユークリッド互助法により,
g = GCD(a, b) と g = as + bt となる s と t を返す.
- static int jacobi(MPInt a, MPInt b)
jacobi 記号 (a|b) を返す.
- static boolean isPrime(int n)
n が素数か否かを判定する.
- static int order(int g, int p)
g の位数 k (gk = 1 mod p なる最小の k)を返す.
- 形式変換
- static byte[] toByteArray(MPInt n, int len)
整数 n を長さ len のバイト列に変換する.n を超える上位バイトには,0 が埋め込まれる.
- static byte[] toFixedBytes(MPInt n, int len)
整数 n を長さ len のバイト列に変換する.n を超える上位バイトには,0 が埋め込まれる.n が負数の場合,および len が
n を格納するには小さい場合は例外が発生する.また,符号バイトは削除される.
- static byte[] i2OSP(MPInt bi)
整数 bi からオクテット列への変換 (I2OSP) を行う.
- static MPInt os2IP(byte[] os)
オクテット列 os から整数への変換 (OS2IP) を行う.
- static MPInt fe2IP(int[] fe, int p)
p 進数表現の有限体の要素 fe を整数へ変換 (FE2IP) する.
- static MPInt fe2IP(int[] fe, MPInt p)
p 進数表現の有限体の要素 fe を整数へ変換 (FE2IP) する.
- static int[] i2FEP(MPInt n, int p)
整数 n から p 進数表現の有限体の要素への変換 (I2FE) を行う.
- static int[] i2FEP(MPInt n, MPInt p, int m)
整数 n から p 進数表現の有限体の要素への変換 (I2FE) を行う.n の大きさによらず返却される配列の長さを m とする.
- その他
- static MPInt random(java.security.SecureRandom rng, MPInt limit)
0 ~ limit-1 の乱数を返す.