■ 量子コンピュータ(暗号解読)



1994年にIEEE誌に発表された素因数分解に関するShorの論文は,高速な暗号解読を可能とする量子コンピュータの研究を推進する起爆剤となった。ショアの論文の骨子は,(量子フーリエ変換)を使って,n桁の整数の素因数分解の位数rを効率よく求めるアルゴリズムを示したことにあり,因数分解の時間がnの多項式の程度でおさまることが証明されている。これは,現在のRSA方式が数分で解読されることを意味し,このことにより量子コンピュータの研究が多いに加速されることになった。ショアの論文に入るまえに,現在のRSAの公開鍵暗号システムがどのようなアルゴリズムで構成されているのかを最初に確認しておく。

(1)RSAの公開鍵暗号システム

RSA(MITのRivest, Shamir, Adleman3名の頭文字)公開鍵暗号システムは,大きな数の素因数分解が困難(非常に時間がかかる)ことに依拠したセキュリティシステムである。暗号システムの動作原理を「鍵のついた秘密箱」で考えてみる。送信者(Alice)は受信者(Bob)にMというメッセージを箱に入れて,鍵eをかけて送るとする。Bobが合鍵dを持っていれば箱は簡単に開けられるが,Bobが遠くに離れている場合,合鍵dを事前に送る上での紛失・盗難のリスクがある。通常鍵eと合鍵dは同じ物であるが,箱を開ける合鍵dが,閉める鍵eと異なるシステムがRSA方式である。RSAでは,閉める鍵eはいくらでも複製を作れる(一般に公開するので公開鍵と呼ぶ)が,開ける鍵dはただ一つ(秘密鍵)である。 Bob宛に送ることはBobの知人であれば誰でもよいので鍵eを予めコピーしておいて知人に配っておくのであるが,Bob宛の秘密箱を開けられるのはBobだけである,という仕組みである。

AliceがBobに,M mod nというメッセージを送るとする。nは後で説明する理由によって,素数pとqの積であるとする。Bobはあらかじめ素数pとqをもっていて,それは秘密になっている。Aliceは通信文を送る前に,Bobにnを送り,Bobは通信文が自分宛であることをpq= nの計算により確認する。傍受者(Eve)はnをしることができるが,因数分解が難しいので,実際上pとqを知ることができない。次にAliceは,公開鍵eを送る。これを受けて,受信者Bobは直ちにed = 1 mod (p - 1)(q - 1)を満たすdを計算する。ここで,mod (p - 1)(q - 1) = Φ(n)(p-1,q-1の最小公倍数であり,n以下の数で,nと互いに素である整数の数を表す)であり,Φ(n)をオイラー数と呼ぶ。ここで,暗号を復号化するのはdであるが,このdを計算できるのは素数pとqを知っている者,即ちBobのみ,ということがポイントである。具体的に以下のような手順である。

Aliceは通信文M mod n(=pq)を暗号化してMe mod n をBobに送る。Bobは鍵dを用いて,(Me )d= Med = MkΦ(n) +1 = M mod nと復号化できる。傍受者Eveは鍵dを計算できないので復号化できない。具体的に数字を当てはめてみる。
十分大きな素数nとして143, p = 11, q = 13(たいして大きくはないか!)をとる。暗号化したい通信文(平文)を適当に数字列に変換し,nより小さい整数Mとする。Mが5であったとする。オイラー数Φ(n)=最小公倍数(p - 1)(q - 1) = 10 x 12 = 60 と互いに素な定数eをとり,b = Me mod nを作るとこれが暗号文である。60と互いに素な定数eとして7をとると,
b = 57 mod 143 = 78125 mod 143 = (546 x 143 + 47) mod 143 = 47
となり,暗号文bとしては47が作成された。ここで,143(=n)と7(=e)は公開鍵として公表する。
次に復号化であるが,ed = 1 mod (p - 1)(q - 1)となるdを探すことになる。これは,7・d = 1 mod 60 であるが,dとして43をとると,7 x 43 = 301 = 5 x 60 + 1であり,たしかに7・d = 1 mod 60 を満たしている。この43を使うと,
暗号文4743 mod 143 = 5 となりもとの平文を数字化したMを得る。RSAにおいては2つの素数の積pq= nを用いるのがポイントである。nが公開されていてもp,qを逆計算するのは,nの桁数が大きいと非常に困難である。一説によれば200桁の整数の因数分解には現在最高速のスーパーコンピュータを使っても数十億年はかかると言われている。RSAでは1024ビットが普通であるから1024Log102 (約30桁)でも実用上ほとんど問題ない。RSAの最高は2048ビットなので60桁の整数に相当する。2048ビットは電子署名の証明書を発行する認証局の暗号化に使われている。

(2)素因数分解の原理

(Step1)互いに素な数N,aを見つける。

複合数Nの素因数分解をするには,まずその因数を一つ見つけ,Nをそれで割り,あとはこれを繰り返す。どのようにして因数を見つけるか,というと,Nより小さい整数aを選んで,Nとaの最大公約数gcd(N,a)をユークリッドの互除法(最大公約数を引き算で計算する方法)で計算する。これが1でなかったら因数が見つかったことになる。gcd(N,a)が1ならNとaは互いに素であるから次のステップに進む。

(Step2)位数rを見つける。

Nとaが互いに素であるとき,

r = 1 mod N   ---①

であるような最小なrを位数(Order)と呼ぶ。Nとaが互いに素であるとき,位数rが必ず存在する。これを整数論では,フェルマーの小定理と呼ぶ(〔証明〕)。

rが偶数なら①式を変形して,

(ar/2 + 1)(ar/2 - 1) = 整数  x  N

を得るので,ar/2 ± 1=0 mod Nでないかぎり最大公約数gcd(ar/2 + 1, N)またはgcd(ar/2 - 1, N)が因数を与える。

rが奇数またはar/2 ± 1=0 mod Nなら別のaを選んで,rが偶数であり,ar/2 ± 1=0 mod Nでないような数aを得るまでaを変えてやればよい。大雑把には,確率50%以上で望ましいaを得ることができるので,この試行はすぐに終わる。 具体的に例を挙げる。

Nを35とし,素因数分解したいとする。aとして4をとると, 4p mod 35をpを1から始めて計算する。
41 mod 35 = 4,
42 mod 35 = 16,
43 mod 35 = 64 mod 35 = (1 x 35 + 29) mod 35 = 29,
44 mod 35 = 256 mod 35 = (7 x 35 +11) mod 35 = 11,
45 mod 35 = 1024 mod 35 = (29 x 35 +9) mod 35 = 9,
46 mod 35 = 4096 mod 35 = (117 x 35 + 1) mod 35 = 1,
47 mod 35 = 16384 mod 35 = (468 x 35 + 4) mod 35 = 4,
となり,このあとは16, 29, 11, 9, 1, 4…と続くことになる。pが6,12,18,…のときに4p mod 35が1になることが分かる。従って最小のpは6であり,偶数であることから,これが位数である。
このとき,最大公約数はユークリッドの互除法で計算して,
gcd(ar/2 + 1, N)=gcd(43 + 1, 35)=gcd(65, 35)=5,かつ
gcd(ar/2 - 1, N)=gcd(43 - 1, 35)=gcd(63, 35)=7
となってN=35の素因数として5と7を得ることができた。

以上が古典的な素因数分解のアルゴリズムであるが,実際やればわかるが大きな数の場合にrを求めるのは容易ではない。ためしにNを221,aを20としてみればrは48である(筆算でやると気が遠くなる!)。aが168ならrは8と小さいが,50でrは12,92でrは16である。上記のアルゴリズムをそのままプログラムしても計算には相当の時間を要することが理解できよう。

(3)ショアのアルゴリズム

ショアは,複合数Nが与えられた場合に,ランダムに選ばれたNと互いに素であるaの位数rが存在するならば,そのrを与える量子アルゴリズムを考案した。即ち,Nとaが互いに素であるとき,

r = 1 mod N   ---①



を満足するrを多項式時間(log N)kの範囲内で与える,確率的アルゴリズムを考案したのである。

ショアはmod qの離散フーリエ変換(DFTqと記す)と呼ばれるユニタリー変換から出発した。DFTqは,q次元ヒルベルト空間上で作用し,基底|0>,…,|q-1>に関して,次のように定義される:

DFTq:|a> → 1/√qΣc=0q-1exp(2πiac/q)|c>

この(量子フーリエ変換)は,状態|a> が|0>のときは,基底|0>,…,|q-1>の等しい重みで重ね合わされていることに注意する。従って,a mod Nを適当に選んで,|0>にDFTqを施すと,

1/√qΣm=0q-1|N,a>|m>

を得る。この状態からam mod Nを各成分毎に計算し,直積をとると,

1/√qΣm=0q-1|N,a>|m>|am mod N>

を得ることができる。この状態において,|am mod N>の観測を行う。その結果として,aj mod N (= y mod N)という値を得たとする。rが位数とすると,このときaj≡akr+j(kは整数)が成立している。従って,mの値としては,j,j + r, j + 2r,…,j + Arが観測により選ばれたことになる。ここで,Aは(q - j)/rより小さい最大の整数とする。

jは観測によって選択されていることが本質的である。j≦ rであり,j≦ r < N かつ q ≒ N2であるから,A ≒ (q - j)/r = q/r - 1であることに注意すると,観測後の状態は,

j> = 1/√(A+1)Σk=0A|N,a>|kr+j>|y>
   = √r/√qΣk=0q/r - 1|k r + j>
   ---②

と表すことができる。以降,状態|N,a>|y>は固定されているので記載は省略する。

【位数rの抽出】

ショアのアルゴリズムの本質は位数rの抽出を量子コンピュータで行うことにある。上記②式までを,状態|0>にDFTqを施し(量子フーリエ変換を行う),結果を観測することで得ることができた。ショアは,②に再度DFTqを施すことで位数rが抽出できることを示した。M = q/rとおき,②に再度DFTqを施すと,

out> = √r/qΣc=0q-1Σk=0M - 1exp(2πi(k r + j)c/q)|c>
= √r/qΣc=0q-1exp(2πijc/q)Σk=0M - 1exp(2πikc/M)|c>
= Σc=0q-1 αc |c>

このとき,以下のことが成り立つ。

Σk=0M - 1exp(2πikc/M)
= M (cがMの倍数の時)または
= 0 (それ以外の時)

従って,|c>の振幅である αc は,

αc = Mexp(2πijc/q)(cがMの倍数の時)
    = 0 (それ以外の時)

となる。従って,|Ψout> はcがMの倍数(c = sM)の時のみ値を持つので,

out> = √r/q・MΣc=0q-1exp (2πijc/q)|c>
= 1/√r Σs=0r-1exp (2πijsM/q)|sM>

= 1/√r Σs=0r-1 exp(2πijs/r)|sq/r>   ---③

となって,周期qの状態から周期rの状態に変換されることが分かる。この状態で観測を行うと,s = 0, 1, 2, …, r - 1 なる倍数sq/rが等確率1/rで選ばれる。最初のシフトjは,もはやどこにも出てこないことが重要である。つまり,最初の観測の値は重要ではない。重要なのは,s = 0, 1, 2, …, r - 1 なる倍数sq/rが等確率1/rで選ばれることである。数式で書くと,

c = 整数・q/r,即ち,

c/q = 整数・(1/r)   ---④

cは観測値,qはq ≒ N2で既知であることから,観測を繰り返すことにより④の周期性(1/r)を計算で求めることができる。即ち,位数rを求めることができる。

ここで注意すべきことは,④からrが正しく求められるのは,整数(s)とrが互いに素の場合に限ることである。c/q < 1なので④の右辺の整数はrより小さい。rよりも小さい数で,rと互いに素な数の総数はオイラー数Φ(r)と呼ばれ,その数は e-γr / log(logr)より多いことが数論で知られている(γはオイラー定数)。言い換えると,log(logr)回も試行すれば互いに素な整数に当たる,ということである。rはNより小さいので,最大でもlog(logN)回の試行で正しいrを得ることができる。この試行を検算と呼ぶ。

以上見てきたように,ショアのアルゴリズムを量子コンピュータで実行するのにかかる時間は,フーリエ変換,検算,最大公約数gcd,観測時間の総数である。いずれも多項式時間で実行可能であることがポイントである。



(2002年6月16日;第一版 Copyright 寒泉)