素因数分解問題とは、整数 n( > 1)が与えられた時、n = pq となるような 1 より大きな整数(素因数)p、q を求める問題である。
素因数分解問題の主な解法を表1-1 に示す。
解法 | 内容 |
---|---|
試行割算法 | 合成数 n を小さな素数から順に割っていく方法。 |
p-1法、p+1法 | 合成数 n の素因数 p に対して、それぞれ(p-1)、(p+1) が小さい素因数の積に分解される時に有効な方法。 |
Fermat法 | 合成数 n の素因数 p、q に対して |p-q| が小さい場合に有効な方法。 |
楕円曲線法 | Zp 上の楕円曲線E(Zp) の位数(楕円曲線の点(元)の個数)が小さな素数の積に分解できる時に有効な方法。 |
2次ふるい法 | 2次合同式 k2 = l2 (mod n) を満たす k と l を求め、gcd(k±l, n)より n の素因数を求める方法。 |
数体ふるい法 | 2次ふるい法を一般化した方法。 |
表において、上4つの解法は解読計算量が素因数の性質に依存する解法であり、その他の解法は解読計算量が合成数 n のサイズのみによって決まる解法である。
表から n を 2 素数 p、q の積とする時、(p±1)、(q±1) がそれぞれ大きな素因数をもち、かつ |p-q| が大きい場合、現時点で最強の解法は、数体ふるい法でとされている。
離散対数問題とは、有限群 G の 2 つの元 g、y ∈ G について、y = gxを満たす指数 x を求める問題である。
Y(=gx mod p)、g、p(ここで p は素数または素数のべき、g は有限体Fpの原始元)から x を求める問題である。
有限体上の離散対数問題に対する主な解法を表1-2 に示す。
表から (p-1) が大きな素因数をもつ場合、離散対数問題に対する現時点で最強の解法は数体ふるい法であるとされている。
解法 | 内容 |
---|---|
Pohig-Hellman法 | y = gx (mod p) において g の位数(g が原始元の場合(p-1)) が小さな素数の積に分解される時に有効な方法。 |
Index Caliculus法(指数計算法) | ある素数の集合に対する対数をまず求め、それを利用して所望の離散対数を求める方法。 |
数体ふるい法 | Index Caliculus(指数計算)法の一種で、素因数分解問題に対する最強の解読方法である数体ふるい法を離散対数問題に応用した方法。 |
楕円曲線とは、三次の多項式 f(x) = a3x3 + a2x2 + a1x + a0 が重解を持たない場合において E; y2 = f(x) で表される曲線のことをいう。また、式を成り立たせる x、y が、共に有理数である時、点(x, y)を有理点という。
この式を満たす有理点(x, y)をすべて集めると、滑らかな1 本あるいは2 本の曲線となる(f(x) が重解を持つ時、途中で折れ曲がった、あるいは交わりのある1 本の曲線となるため、重解を持つ場合は除く)。
楕円曲線E(Fp)に関する離散対数問題は、以下のように記述される。
任意の点P ∈ E(Fp)に対して、[P] = {0, P, 2P, 3P,…}は有限巡回群となる。この巡回群の位数を q とすると,任意の[P] の要素(点)に対して、xP = Q となる x ∈ Zqが常にただ一つ存在する。従って、Q ∈ [P] が与えられた時に、xP = Q となる x ∈ Zqを求める問題である。
楕円曲線上の離散対数問題に対する主な解法を表1-3 に示す。
解法 | 内容 |
---|---|
Pohig-Hellman法 | 楕円曲線上のベース点 G の位数が小さな素数の積に分解されるときに有効な方法。 |
MOV-reduction法 | Trace = 0の楕円曲線(supersingular)に対して有効な方法。楕円曲線E(Fp)上の離散対数問題を、有限体上の離散対数問題に帰着させる解法であり、楕円曲線上の離散対数問題が、Fpの小さな拡大体上の離散対数問題に帰着できる。 |
Smartおよび佐藤-荒木の攻撃 | Trace = 1の楕円曲線(anomalous)に対して有効な方法。素数 p を法とする有限体Fp上で構成される楕円曲線E(Fp)においてその楕円曲線の点の個数がちょうど p である場合に有効である。 |
MOV-Reduction法、および、Smartおよび佐藤−荒木の攻撃法の適用を受けない楕円曲線を利用する場合、楕円曲線上の離散対数問題に対する現時点での最強の解読法は、Pohig-Hellman法であるとされている。
このことから、楕円曲線に基づく暗号・署名方式では、従来の素因数分解問題や有限体上の離散対数問題に基づく暗号・署名方式に比べて鍵サイズを小さくでき、処理を高速に行えると見られている。
ユークリッドの互除法を利用すると、二つの整数a、b それぞれの素因数分解を知らなくても、それらの最大公約数 gcd(a, b) を容易に求めることができる。
ユークリッドの互除法のアルゴリズムは、以下のように与えられる。
[入力]
0でない二つの整数 a0、a1。但し、a0 ≧ a1と仮定する。
[出力]
gcd(a0, a1)
[アルゴリズム]
ai+1 = ai-1 mod ai、i ← i + 1
(例題.1) ユークリッドの互除法を使い、gcd(10, 7)を求めると、表1-1より、a4 = 0 なので、a3 = 1 がgcd(10, 7)である。
i | ai |
---|---|
0 | 10 |
1 | 7 |
2 | 3 = 10 mod 7 |
3 | 1 = 7 mod 3 |
4 | 0 = 3 mod 1 |
ユークリッドの互除法のアルゴリズムの正しさは、以下の定理に基づいている。
[証明]
i. gcd(a, b) ≧ gcd(b, c) を示す。a を b で割った余りが c なので、以下の式が書ける。
※ 但し、q は商である。
ここで、m = gcd(b, c)とおくと、以下のことが言える。
@、Aより、m は (a, b)の公約数と言える。
また、一般に、(a, b)の公約数 ≦ (a, b)の最大公約数であるから、m ≦ gcd(a, b)である。故に、gcd(b, c) ≦ gcd(a, b)が成り立つ。
ii. gcd(a, b) ≦ gcd(b, c) を示す。m' = gcd(a, b)とおき、c = a - qb とする。
i. と同様に、
@、Aより、m' は (b, c)の公約数と言える。
i. と同様で、m' ≦ gcd(b, c)である。故に、gcd(a, b) ≦ gcd(b, c)が成り立つ。
∴ i. ii.より、gcd(a, b) = gcd(b, c)となる。
定理より、a0 を a1 で割った余りを c とすると、gcd(a0, a1) = gcd(a1, a2) である。また、a1 を a2 で割った余りを a3 とすると、gcd(a1, a2) = gcd(a2, a3) である。この処理を続けると、
なので、ついに余りは 0 となる。今、a2 が a3 で割り切れると仮定すると、gcd(a2, a3) = a3 である。従って、
となる。これがユークリッドの互除法である。
0 でない二つの整数 a、b の最大公約数 d = gcd(a, b) は、ある二つの整数 x、y を使って、以下の式のように書くことができる。
(例題.2) 20 と 12 の最大公約数は、d = gcd(20, 12) = 4 である。この時、
と書ける。従って、x = 2、y = -3 である。
二つの整数 a、b から d = gcd(a, b) かつ d = ax + by となる整数 x、y を求めるアルゴリズムを拡張ユークリッドの互除法といい、以下のアルゴリズムによって与えられる。
[入力]
0でない二つの整数 a、b である。但し、a ≧ b と仮定する。
[出力]
d = gcd(a, b) かつ d = ax + by となる(d, x, y)である。
[アルゴリズム]
A 次に、ai ≠ 0 である間、以下を実行する。
(ai-1について整理すると、ai-1 = qi+1ai + ai+1 と書ける。すなわち、ai-1をaiで割った余りがai+1である。)
B ai = 0 になった時、(ai-1, xi-1, yi-1) を (d, x, y) として出力する。
(例題.3) 拡張ユークリッドの互除法を、a0 = 10、a1 = 7 に適用してみると、表2-2 が得られる。
まず、10 を 7 で割った商は 1 なので q2 = 1 である。また、
なので、(a2, x2, y2) = (3, 1, -1)である。最後に、a4 = 0 なので、(a3, x3, y31) = (1, -2, -3) が (d, x, y) である。この時、確かに、
が成り立っている。
i | qi | ai | xi | yi | ai = 10xi + 7yi |
---|---|---|---|---|---|
0 | − | 10 | 1 | 0 | 10 = 10 × 1 + 7 × 0 |
1 | − | 7 | 0 | 1 | 7 = 10 × 0 + 7 × 1 |
2 | 1 | 3 | 1 | -1 | 3 = 10 × 1 + 7 × (-1) |
3 | 2 | 1 | -2 | 3 | 1 = 10 × (-2) + 7 × 3 |
4 | 3 | 0 | − | − | − |
拡張ユークリッドの互除法の正しさは、以下のようにして分かる。
まず、アルゴリズムの{ai}に関する部分は、ユークリッドの互除法そのものである。従って、まず、d = gcd(a0, s1) であることが分かる。
次に、明らかに、
である。ここで、数学的帰納法を利用すると、各 i に対し、
が成り立つことを示せる(表3-1 を参照)。従って、
が成り立つことになる。
ここでは、ICカードに本当に耐タンパ性が備わっているかをETCカード(接触型ICカード)を例に検討する。
図7-1 分解する前
図7-2 表面剥離後
今回は接触型のICカードを用いてる。
接触型は専用のリーダ・ライタ(ここでは車載端末)を用いることが必要だが、
非接触型のICカードでは普通ICチップの周りにアンテナが埋め込まれている。
図7-3 ICチップ剥離後(表)
図7-4 ICチップ剥離後(裏)
図7-5 ICチップ表面・裏面の剥離後