前号: No 396 / 次号: No 398 / 一覧(note.com)へ / ブログページに戻る

メールマガジン「がんばりすぎないセキュリティ」No397 (25/03/17)

暗号よもやま話(397号)


現代インターネット通信はほぼ暗号化されています。
初期のインターネット通信は平文(暗号化しない方式)が当然でしたから、随分と変わったものです。

ですが、暗号ってよくわからない方が大半だと思います。

筆者は結構暗号理論が好きなのですが、どうしても話が難しくなりがちですので、このメルマガではあまり触れていません。

でも、現代において暗号の知識はあるに越したことはありません。
できるだけ易しく書きますので、ぜひご一読ください。


1. 第三者に知られない方法

ここでは、3名の人物を登場させます。  アリス(Alice): メッセージを送りたい人  ボブ(Bob):メッセージを受け取りたい人  イブ(Eve):メッセージを傍受(盗聴)したい人 余談: なんでいきなりアリスなんだよ?と思われるでしょうが、暗号理論ではこの3名は常連です。Aさんよりアリス、Bさんよりボブの方が覚えやすいというのが理由のようです。この他にもCharlie(Cさん役)やDave(Dさん役)も使われます。 ちなみに、イブの(Eve)は盗聴者(eavesdropper)から来ています。 アリスはボブには知らせたいが、イブには知られたくない情報(文章)を持っています。 情報をそのまま送れば、ボブだけでなくイブにも盗聴されてしまうかもしれません。だからといって、ボブにも通じない暗号にしては本末転倒です。 ここで、考えられる方法は2つあります。  1.イブに盗聴されない方法で情報を送る  2.イブに盗聴されても内容がわからないようにする イブがインターネットで盗聴をできるというのであれば、郵送や電話を使おうというのが最初の方法、インターネット上でもボブだけに理解できるような方式で情報を送るのが2つ目の方法になります。 今回は、このうち、2つ目のボブだけに伝えられる方式である「暗号」についてお話します。

2. 暗号とは?

暗号というのは、平文(ひらぶん:元の文章のこと)に手を加えて、一見元の文章がわからないようにする方法です。 子ども向けの暗号として「たぬき暗号」というものがあります。 暗号文から「た」を抜く(たぬき)と平文があらわれるというものです。 暗号化文:これはたからばこ(これは宝箱) ↓ 平文:これはからばこ(これは空箱) また、符丁として、山!といえば川!のような合言葉や、別の意味を持たせたもの(トラトラトラ→ワレ奇襲に成功セリ)といったものもあります。 「たぬき」言葉などは暗号というより言葉遊びの領域ですし、符丁には汎用性がありませんから、様々な文章を記述するには不適切です。 では、汎用的な暗号というものはあるのでしょうか? もちろんあります。 例えば、最古の汎用暗号にシーザー暗号(シーザ暗号)があります。 これは換字型暗号と呼ばれる方式で、平文を数文字ズラす方式です。 例を示します。(ここでは3文字ずらすものとします)  平文: APPLE  暗号化計算: A+3→D、P+3→S、L+3→O、E+3→H  暗号文: DSSOH アリス:APPLE → DSSOH に変換して送信 ボブ: DSSOH → APPLE に逆算してメッセージを理解 イブ: DSSOH ??? 暗号化の方式とずらす文字数の2つの情報がなければ、DSSOHがAPPLEを示すというのはなかなか気づけません。

2. 鍵とは?

暗号化を施してもそれがカンタンに元の文に戻せるようでは、暗号としての価値はありません。 暗号の価値は以下の2つの要素の掛け算で決まります。  1. 計算方法の複雑さ  2. 鍵の種類(鍵空間)の多さ 鍵というのは、シーザ暗号でいう「ずらす文字数」のことで、これを鍵空間と呼びます。 シーザ暗号という方式の戻し方を知っていても「ずらす文字数」がわからなければ、すぐには平文を得ることができません。 結局のところ、暗号の強さ(バレにくさ)というのは以下の式で表現できます。  暗号強度=計算量×鍵空間 上述のシーザ暗号ですとこのようになります。  1. 計算は単純  2. ずらす範囲は1〜25までの25種類(アルファベットは26文字だから) シーザ暗号は計算もカンタンですし、変化させられるパターンも25種類しかありません。全パターン攻撃(ブルートフォース攻撃)をしたって、たかだか25パターンですから、すぐに正解がわかってしまいます。 シーザ暗号程度ではイブにバレる可能性がかなり高いのです。 では、現代暗号ではどのようにして安全を確保しているのでしょうか? 現代でもっともよく使われているAES(Advanced Encryption Standard)という方式を例にあげて説明します。 AESに限らず、現代暗号では鍵空間が圧倒的に広大です。  1. 計算はそこそこ複雑。  2. 鍵空間は78ケタ。(256ビットの場合) AESの78桁という鍵空間は強烈に大きな値で、1の後にゼロが77個続く数字です。 決して78種類ではありません。 このように現代暗号では、組合せを膨大にすることで、事実上逆算ができない(天文学的な時間がかかる)ことを安全性の根拠としています。

3. 暗号方式は公開する方が安全?

もう一つ、暗号については面白い話があります。 暗号の計算手順を公開にすべきか、非公開にすべきか?という話です。 1940年代1950年代までは暗号手順を秘密にする派が圧倒的でした。その頃、暗号を必要としたのが軍事利用でした。例えばドイツ軍はエニグマ暗号方式を使っていましたが、その計算手順は極秘でした。 一方、現代暗号はほぼ全てが数学的な計算に基づいています。 そのためもあり、計算手順を公開することが圧倒的多数です。 なぜだと思いますか? かつてのドイツ軍のように計算方法を秘密にしておいた方が安全っぽく感じませんか? ですが、秘密方式だとその安全性を数値化できませんから、どれだけ安全なのかが外から見てわかりません。 また、計算方法が秘密だと、穴やミスがあったとしても誰も指摘ができません。 そのうえで犯罪者にその穴を突かれたりすると目も当てられません。 実際、エニグマを解読した一つのきっかけが、「暗号結果は1つとして平文と同じ文字にならない」という方式の穴(機構上の制限)でした。 そんな穴を残したままにするくらいなら、計算手順を公開し、多くの研究者(主に数学者)にその穴探しをしてもらった方が安全性は高まるだろうというのが現代暗号の常識となっています。 そんなヒマな研究者がいるのか?と思われるかもしれませんが、著名な(今まで穴が発見されていない)暗号方式の穴を見つければ大金星なのです。 野心あふれる数学者たちがそのチャンスを見逃すはずがないですよね。

4. 鍵空間の広さだけが指標ではない

ここまでの話で、鍵空間さえ広ければ完璧なように感じるかもしれませんが、そういうわけでもありません。 例えば、RSAという暗号方式があります。公開鍵暗号というちょっと変わった方式があります。同様に公開鍵暗号でECC(楕円暗号)という方式があります。 この2つの方式を比べると、同じ安全強度と言われる鍵空間がまるで違います。 RSAでの1024ビット(10進数なら300桁越え)がECCでは160ビット(10進数で50桁弱)と同等程度の安全強度だと言われます。 300桁と50桁が同程度と言われると面喰いますが、上述の式を思い出してください。  暗号強度=計算量×鍵空間 鍵空間が小さくても暗号強度があるということは、計算量が多いことを示しています。 実際、ECC(楕円暗号)の一回の計算量はRSAよりケタ違いに多いのです。 ここでは、その詳細は述べませんが、暗号方式によって計算量はまるで違うということです。上の例でいえば、RSAが小学生の四則演算なのに対してECCが微分積分の計算のような複雑さだと思ってください。 計算量が多いということは1パターンの計算をするのに時間がかかる、だから結果として暗号強度は保たれている、という理屈です。 鍵のビット数だけの判断では本当の暗号強度を誤解する可能性があるということです。

5. ん?計算時間が暗号強度?

ここまで読んで勘の良い人は気づいたかもしれません。 暗号の本質って「時間稼ぎ」です。 「え?暗号化してあれば、絶対安全じゃないの?」と思われるかもですが、ここまでの話で、全組合せを試せば必ず答えがみつかるということは納得いただけると思います。 ただ、全組合せを計算するのに天文学的な(例えば太陽系が滅びるとか)の時間を要するため、事実上安全である、ということにすぎません。 これは現代の暗号理論が数学に根ざしているためですので避けようがありません。数学では逆算できない計算はないのですから。 視点を変えると、計算が劇的に早くなれば、この安全性はもはや失われるという意味でもあります。 実際、1970年代に開発されたDESという方式は1990年代になって「もはや安全とは言えない」という研究結果が多数出てきたことから2000年に上述のAESという暗号方式に切り替わったという事例もあります。 さらに、現在研究が進んでいる量子コンピュータやバイオコンピュータが実用化されると、「難しい計算には時間がかかる」という概念が覆される可能性もあります。

6. まとめ

インターネットでの暗号化の流れは、ますます強くなってきています。 インターネットの初期にはメールも平文でそのまま送っていましたが、現在は大半が暗号化されています。皆さんがよく使うブラウザの通信やSNSなどの通信もほぼほぼ暗号化されています。 また、サーバ管理者やプログラマが使う通信手順も暗号化するのが普通です。 暗号化というのは、要は第三者が内容を見てもわからなくする方法です。 現代暗号は数学的な手法ですので、時間さえ許せば元に戻せます。 それを防ぐために、計算方法を複雑化させ、鍵空間を拡げる、という2つの側面で、その可能性を事実上ゼロにするという方法でもあります。 ところで、通信相手は元に戻せるのに、第三者は戻せない、という矛盾をどうやって乗り越えてるのか?という手法に興味がある方は以下のバックナンバーをご覧ください。 キーワードは「鍵交換」です。  No179 暗号化ってどうやって鍵を渡すの?  https://note.com/egao_it/n/nb19a432ec44c  ※鍵交換の話はNo179〜No181まで続きます。   それだけ複雑な話ということです。 今回は久しぶりに暗号のお話をしました。 久しぶりというのは、前回の暗号の話が2020年の10月〜11月にかけてだったからです。もう4年以上も前ですね。 最近は、過去の記事の書き直しが増えてきていますが、書いてから何年も経つとやはり書き直しやアップデートが必要となるケースが増えてきます。 バックナンバーで「あれ?」というものがありましたら、是非リクエストをください。 きっと以前よりわかりやすく皆さまにご案内できると思います。 次回もお楽しみに。 (本稿は 2025年3月に作成しました)

前号: No 396 / 次号: No 398 / 一覧(note.com)へ / ブログページに戻る