はじめに
この数年、量子コンピュータの研究・開発が盛んである。米国のベンチャー企業の中には株式上場を行った企業もある。現在の量子コンピュータは実用化されていないが商用化されている(実用的な計算はできないがAmazonやIBMのクラウドサービスとして提供されている)という中途半端な状態にあるが、将来2000万量子ビットまで実装されれば2048ビットのRSA暗号を8時間で解くことができると主張する論文が昨年公開された。今回の記事では、このRSA暗号について解説する。量子コンピュータを用いた解法の紹介は回を改める。
RSA暗号とは
1970年代にMITの3人(Ron Rivest、Adi Shamir、Leonard Adleman)が発明した暗号手法である。彼らの名前の頭文字を取りRSA暗号と呼ばれる。暗号手順は以下の通りである。
- 最初に2つの自然数
を決める。これを公開鍵と呼ぶ。これと対応する秘密鍵
も同時に決めておく。秘密鍵は復号時に使う。
- 暗号化する文字を適当な方法で数値に置き換える。例えば、50音順を11から始まる自然数に一対一に対応させる。「あ」は11、「い」は12になる。このとき、「そすう」を数値に直すと、「そ」は25、「す」は23、「う」は13なので、これらを並べて「252313」を作る。この数を
と置く。
を計算し、この値を
で割った余りを
とする。
が暗号化された値である。
復号手順は以下の通りである。
- 秘密鍵
を使い、
を計算する。その結果を
で割った余りが復号結果
である。
を元の文字列に戻す。
秘密鍵を見つけるには、
を素因数分解する必要がある(後述)。従って、2つの巨大な素数の積として
を与えておけば、現在のコンピュータ(古典コンピュータ)では
を見つけ出すことはほぼ不可能である。以上がRSA暗号の概要である。
次に、RSA暗号を数学的に説明するため「オイラーの定理」を紹介する。
オイラーの定理
オイラーの定理とは次のものである。
を2以上の自然数とする。1以上
以下の自然数のうち
と互いに素な(1以外の公約数を持たない)数の個数を
とする。このとき、
と互いに素な任意の自然数
に対し、
は
で割り切れる。
具体例で確認してみる。いま、とする。
以上
以下の自然数のうち
と互いに素な数は、
の
つである。従って、
となる。
と互いに素な
を選ぶと、
となる。これは
で割り切ることができる。従って上の定理が成り立つ。
後の説明のため上の定理を合同式を用いたものに書き換えておく。
を2以上の自然数とする。1以上
以下の自然数のうち
と互いに素な(1以外の公約数を持たない)数の個数を
とする。このとき、
と互いに素な任意の自然数
に対し次式が成り立つ。
(1)
ここで、とは、
を
で割った余りが
であること表す。さらに、RSA暗号に使われる次の事実も紹介しておく。
を2以上の自然数とする。1以上
以下の自然数のうち
と互いに素な数を小さい順に
と並べる。これを数列
とする(常に
である)。このとき、
の中の任意の値
を数列内の全ての数に掛け、
で割った余りを並べると、数列
を並べ替えたものが得られる。
これも具体例で確認する。のとき、
である。
から
を選ぶ。
の全ての数に2を掛けると
となる。これを
で割った余りを並べると
となる。これは
を並べ替えたものである。同じことが
以外の数
を掛けた場合も成り立つ。
ここでの注目点は、の中に必ず1という要素が存在することである。つまり、
となるペア
が必ず存在するということである。この事実を後の説明で使用する。
RSA暗号の詳細
上で紹介した定理を用いてRSA暗号を再度詳しく説明する。まず最初に2つの異なる素数と
を用意し、それらの積を
とする。実際の暗号化では巨大な素数から選ばれるので、
を素因数分解し元の素数
と
を求めることはほぼ不可能となる。ここでは説明の都合上、
とする。従って、
である。
以上
以下の自然数のうち
と互いに素な数の個数は
である。
以上
以下の自然数で
と互いに素な数の組は
である。
の中から適当に数
を選ぶ。ここでは
を取る。
を
の全ての数に掛けると、
となる。これらを
で割った余りは、
となる。これは
を並べ替えたものである。ここまでの議論で、
の2番目の要素
に
を掛けて
で割ると1余ることが分かる。
(2)
(3)
が成り立つようにを決めるのである。公開鍵は
、秘密鍵は
となる。
準備ができたので実際に暗号化を行う。ここでは「す」を暗号化してみる。
- 先と同じように50音順を
から始まる自然数に割り当てると「す」は
である。
を
で割った余りを求める。これが暗号化された値
になる。いまの場合、
を
で割った余りなので
である。合同式で書けば
である。
ここで、式(1)のオイラーの定理を考える。としたから
(4)
が成り立つ。ところで
(5)
が成り立つから、両辺を乗すると
(6)
となる。ここでを用いた。最後の式に
(式(4))を使うと
(7)
となる。つまり、暗号化された値を
乗し
で割った余りを求めれば、元の値
を得ることができる。
の値が式(3)を満たすように決められているので
を
で割ったとき必ず1余る数であることが保証され、上の変形が成り立つのである。
さて、公開鍵から秘密鍵
を見破るにはどのような情報が必要になるであろうか。
(8)
であったから、が分かれば良さそうである。しかし、
は
を素因数分解しない限り求めることはできない。なぜなら、
が成り立つからである。先に見たように実際の暗号化では
と
は巨大な素数が選択される。従って、
を素因数分解することは現実的にはほぼ不可能であり、従って
を求めることもできない。
まとめ
今回は、RSA暗号について説明した。2040年ごろに2000万量子ビットが実現するだろうとDARPAが予想しているが、さてどうなるか?