KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

ざっくり把握する暗号技術の仕組み~前提知識編~

春が来たとコートを脱げば、翌日から寒くなり体調を崩す今日このごろ。
どうも、布団からなかなか出られないエンジニアTです。

私も入社して2年目に突入しましたので、後輩が入ってくるという恐怖が怖いです。

まだまだ経験も知識も足りないので、どーにか後輩に良く見られたい願望から大学時代の参考書などを読み漁っていたところ、なにやら暗号化通信(TLS)がすこし変わっていたことに気付きました。

というわけで、 「ざっくりと従来の暗号技術を把握」 (←本稿)しつつ 「暗号化通信(TLS)がどう変わったのか」 を全2本の記事で紹介しようと思います。

注意点:本稿の正しい読み方 本稿は新卒2年目エンジニアが作成した大変引用に向かない記事です。 曖昧な表現や本質的ではない部分にフォーカスして説明している部分があります。
また、シンプルに間違っている場合もあります。
これらをご了承の上でお楽しみください。

暗号化の仕組み

「いまさら暗号の仕組みって笑」と思われるかもしれませんが、おさらいとして紹介します。 HTTPSなどに使われる暗号(AESなど)はXOR演算の2回適用すると元に戻るという特性を活用しています。

XORを2回適用すると元に戻る特性

このとき、 適当なバイナリ に当たる部分はバレないように秘密にしておきます

例として、T という文字(ASCII: 01010100)に 11001100 という適当なバイナリをXOR演算すると、10011000 という通常の文字コードでは表現できないバイナリに変化します。 しかし、10011000 に対して再び同じ 11001100 をXOR演算すると、元の T に復元されます。

T XOR 適当なバイナリ = 表現不可な文字

この適当なバイナリに当たる部分を 鍵(以降は暗号鍵と呼ぶ) のように扱うことで、秘密にしたいことを読めなくする(暗号鍵でロックする)ことができます。

こうした仕組みを発展させたのが現在の暗号化技術です。

小ネタ: ASCIIの範囲について ASCIIは0〜127の範囲の値を表現できます。
例にあげた T のASCIIコードは01010100であり10進数で84に相当します。 対して、暗号化によって生成された10011000は10進数で152に相当し、ASCIIの範囲外のため通常の文字としては表現できません。

自分で試してみたい方は以下のツールで遊べます。

暗号化して伝えるには

では、暗号化したメッセージを相手に伝えてみましょう。 インターネットを考えたとき、暗号化したい部分は 赤色 のスペースです。

赤いゾーンは暗号化したい

先ほど使った暗号鍵を使って、シンプルに渡してみましょう。

方法1: シンプルになげてみる(暗号鍵のみを使う)

  1. Aさんは、暗号鍵を生成して平文を暗号化し、暗号化したメッセージをBさんに渡します。
  2. Bさんはそれを受け取ると、暗号文に対してもう一度XOR演算を適用しメッセージを復号します。
  3. このとき、暗号文の復号にAさんが生成したものと同じ暗号鍵が必要になるので、Aさんにインターネット経由で送ってもらいます。

シンプルになげてみる(暗号鍵のみを使う)

むむ??
インターネットの怪しい人が騒がしいですね。

あっ!!
この方法だと赤色ゾーンで暗号鍵が守られていません

これではせっかく暗号化して送ったにも関わらず、「暗証番号は11001100だよ!」と大声で叫んでいるのと何ら変わりません。

このまま運用し続ければ、怪しい人に情報を盗まれてしまいます。

暗号鍵を安全に渡すには

では暗号鍵を叫ばずに伝えるにはどうしたらいいでしょうか。

答えは単純です。赤色ゾーンをそのまま通過することが問題なのであれば、 暗号鍵も暗号化しちゃえばいい のです。

しかし、単純に暗号鍵を新しい暗号鍵2で暗号化したとしても、復号する時には暗号鍵2が必要になります。そうなると結局、暗号鍵2が安全に渡せなくなり何も変わりません。

ですので、以下のような性質をもつ鍵を作ってみましょう。

  • 閉じる(専用の)鍵🔒 (公開鍵と呼ばれるもの)
  • 開ける(専用の)鍵🔑 (秘密鍵や復号鍵と呼ばれるもの)

暗号鍵が担っていた役割を、「開ける🔑」「閉じる🔒」の2つに分けてみました。

開ける(専用の)鍵🔑と閉じる(専用の)鍵🔒

このとき、開ける鍵🔑は秘密にしておきます。閉じる鍵🔒はバレてもOKです。
なぜなら、 閉じる鍵🔒だけでは復号化ができないからです。 復号化ができるのは開ける鍵🔑なので、閉じる鍵🔒はネットワークの不審者にバレても問題ありません。

方法2: 開ける(専用の)鍵🔑と閉じる(専用の)鍵🔒を使ってみる

  1. Aさんがメッセージを送るとき、Bさんから閉じる鍵🔒をもらいます。
  2. そして、閉じる鍵🔒で暗号鍵を暗号化し、Bさんに送ります。
  3. Bさんは暗号を受け取ると、開ける鍵🔑で復号し暗号鍵を入手します。
  4. そのあとは、先ほどの方法1と同じです。(下の図では省略)

開ける(専用の)鍵🔑と閉じる(専用の)鍵🔒を使ってみる

こうすれば、少なくとも赤ゾーンには 閉じる鍵🔒しか渡らない ので、インターネット不審者も悪さできないですね!

とはいえ、「開ける鍵🔑・閉じる鍵🔒はどんな理論だよ!」と思いますよね?

実は先ほどのXORの特性よろしく 素因数分解問題の特性 を活用すれば実現できます。

素因数分解問題の特性とは、簡単にいうと大きな数字での素因数分解がめっちゃ難しいということです。

p(奇数の素数)*q(奇数の素数) = N(600桁ぐらいのでっかい整数)

上の式を考えたとき、Nからpとqを求めることは現代のコンピュータでも困難です。

ですので、この特性を使えば・・・と説明したいところですが、
今回は私が数学を書きたくないので省略します・・・(スミマセン)

興味のある方は以下の資料やChatGPTに聞いてください。

とりあえず、 素因数分解問題の特性を活用すれば開ける鍵🔑・閉じる鍵🔒が作れる! ことだけ抑えて貰えば大丈夫です。

小ネタ: RSA暗号 開ける鍵🔑・閉じる鍵🔒を使った暗号方式は公開鍵暗号方式と呼ばれます。
実際には RSA暗号 という公開鍵暗号方式を用いて開ける鍵🔑(秘密鍵)・閉じる鍵(公開鍵)を生成します。

RSA暗号を使うと強力な鍵を生成できますが、その反面、大きい数字の素因数分解を行う必要があるため、鍵生成に時間がかかります。

ハイブリット暗号方式

さて、鍵を安全に渡す方法がわかったので、改良した方法をまとめてみましょう。
メッセージの暗号化に加え暗号鍵すらも暗号化してみました。

ハイブリット暗号方式

お、いい感じじゃないでしょうか。赤色ゾーンには暗号化されたものだけしか存在してません。
これなら安全と言えるでしょう!!!

とはいえ、まだ中間者攻撃(Bさんの閉じる鍵🔒ではなく第三者Cさんの閉じる鍵🔒で暗号化してしまった場合)などの危険性はありますが、、、今回の話とは関係ないので知りません。

安全な通信ができた・・・?

ということで、通信(TLS)に限ってではありますが、安全で完璧な暗号化ができました!
これで、人には話せない恥ずかしいメッセージだってバレることはありません!




ま、てきとーな茶番はさておき、~前提知識編~ということで、ここまでは前座です。

実は、今回話した
ハイブリット暗号方式はほとんど使われていません。



・・・ ここまで読んでもらった人には申し訳ないです。ハイブリット暗号方式は忘れて大丈夫です。

この記事を読んでいる方にも、学生時代に

「共通鍵と公開鍵を組み合わせたハイブリット暗号方式で通信してるんだぞ☆」

と教わった人もいらっしゃるのではないでしょうか?

実は、
TLS1.3以降でRSA暗号を使ったハイブリット暗号方式は廃止されました。
(量子耐性アルゴリズムなどは除きます。)

ということで、次回は「なぜハイブリット暗号方式が使われなくなったのか」「代わりに何を使うのか」をお話していこうと思います。

それではまた。

引用文献

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp