RSA暗号は安全なのであろうか?

 いろいろとRSAについて調べているところであるが、安全なのか疑問を持っている。暗号通信そのものについては専門家ではないので、様々な資料を読み漁っているところであるが、国内の日本語ベースのネット上の資料では、ほとんど安全であると太鼓判を押しているものばかりが目立っている。海外サイトにも目を向けて調査してみようと今のところ考えているが、どうだろう。とにかく、奇妙なほど高い信頼性とすばらしさを述べる国内情報ばかりなので、逆に訝っている。
 デジタル証明書としての認証についてはかなり有効な方法であろうと納得したが、肝心の暗号化の方は簡単に解読されるのではないかと実は心配している。なぜなら、暗号化の方法は公開キーによって公開されているからである。誰でも暗号化できるのであれば解読は容易と思ってしまうのであるが、いったいどうして解読できないと言っているのであろうか? 秘密キーを使わなければ復号化できないという話であるが、一般的なごく普通の暗号解読で簡単に解読できるような気がしている。まあ、世界的に使われているRSA暗号、ちゃちな暗号解読で簡単に破られてしまうとは思えないが、原理をいくら読んでも、数学上の素因数分解の話ばかりで、肝心のごく普通の暗号解読方法で解読できない理由がどこにも見当たらないように思っている。勉強不足はしかたがないが、疑問を持ちながら調査・勉強するのは逆に面白い。
 ところで、デジタル証明書の認証の場合は秘密キーを使って暗号化しているので、暗号化の方法が秘密となっている。公開キーを使って復号できるのでそれで認証となるわけであるが、それ以外の解読方法は、暗号化の方法が全く分からないので、素因数分解をスーパーコンピュータを使って膨大な予算を消費ししながら延々とする以外に方法はないようである。ん、しかし、なりすましは、もしかすると可能かもしれない。平文攻撃はこのことを言っているのかな?
 RSA暗号化、やはり安全なのかもしれない。参考資料では1文字1文字変換して説明しているものが多かったので、ついつい1文字ごとの暗号化と思ってしまったが、何文字でも数字に変換してかなり大きな数字になってもかまわないのであった。たとえば2689120536という数字の列を暗号化する場合、2689と120536の2つの数字から暗号化しても、26、891、20、536と暗号化しても、秘密キーを使えば元の数字の列が得られる。暗号化する方法は文字数が多ければ多いほどその組み合わせは膨大で、普通の暗号解読で解読するのは全ての組み合わせを考慮しなければならないので、やはり大変な作業となり、実質、解読は困難かもしれない。たとえば3文字までとか決まった文字数以下である場合は、大変面倒ではあるが解読可能な気もするが、10文字単位だと、文字コード数の10乗通りを計算しなければならない。実際のRSA暗号化、何文字までを単位にして暗号化しているのか分らないが、おそらく、かなり大きな値が設定されているのだろう。もし、1文字ごとのRSA暗号化をしていたら、簡単に解読されてしまうとは思うが、・・・
 無意味な文字列を挿入することで暗号化されるデータ長を大きくする方法が一般的なようである。パディングはそのためのもののようである。OAPDパディングは国際規格のようで、短い文字数のものも、無意味な文字列を追加して解読不可能にしている。おそらく、後で容易に削除できるよう、決まった形式の文字列が埋め込まれているのだろう。RSA暗号、なかなか難しいが、パディングによってどんな短い文章も解読不能(解読するためには膨大な計算時間を要し、素因数分解するよりも計算時間がかかってしまう、もしくは、ほぼ同程度の処理時間がかかるという意味において、解読不能と言っている)になっているため、実質的に利用価値の高い暗号化方式と言えるようである。
 RSA暗号は安全か?という題目を掲げたが、なるほど、勉強すればするほど、上手くできていると感嘆してしまった。最近は1024ビットから2048ビットへと移行しているようで、アスキー文字数に換算すると、128文字から256文字へと拡大している。使用する文字をアルファベット26文字だけとして(こんなことは通常あり得ないが、便宜上簡単にするため)、26の256乗とおり=約2×10^362(362桁)という途方もない組み合わせのマッチングをとるのはほぼ不可能と言えるだろう(大文字やその他の特殊文字を考慮するともっと膨大になる。)ただし、OAPDパディングのルールを詳細に検討すれば、マッチングの組み合わせ数を大幅に減らせる方法が見つかるかもしれない。どちらにしろ、RSA暗号を実装する場合、細心の注意を必要とするだろう。巷にある簡単な解説書で実装したものはほとんど使い物にならないのは明らかである。
 ところで、2048ビット整数のべき乗はすぐに天文学的数に発散してしまうので、数値計算上の工夫が必要になる。幸いにも、余り計算(mod)は、漸化式で前回の余り値から簡単に計算できる。それゆえ、直接のべき乗計算を避けて計算できるので、公開キーによる暗号化と秘密キーによる復号化は容易にプログラム可能となっている。しかしながら、2048ビット整数の乗除算をサポートしなければならないので、少しだけ面倒なプログラムとなる。(整数演算の基本を正しく理解していれば、容易である。)
最終更新:2018年04月14日 22:40