Zenn
🔐

暗号化と復号化とハッシュ化の基本

2025/03/05に公開

初めに

以前、基本的なメールの送受信についてまとめたのですが、それを調べている際に暗号化にも少し触れていました。
基本情報技術者試験の過去問を解いている中で、そういえばあやふやなまま解いていたな...と思い出したので、こちらも知識の整理がてらまとめていきたいと思います。

そもそも暗号化とは

暗号化とは、データをある規則をもとに違うデータに変えることです。
暗号化を行うことで、送受信するデータを盗聴・改竄・なりすましされないようにすることができます。
一方で、受信側で暗号化されたデータを見ても、元のデータから全く異なっているデータになっているので、暗号化後のデータを見ても何が何だかわかりません。
そこで、復号化という技術を用いて、送信者が送った元のデータに戻す作業が行われます。

この暗号化と復号化には、現在3つの主要な方式があります。

  • 共通鍵暗号方式
  • 公開鍵暗号方式
  • ハイブリッド暗号方式
    上記3つの方式について見ていきます。
    が、その前にいくつか用語を説明します。

共通鍵

暗号化と復号化をするための鍵です。
1本で暗号化と復号化を行います。

公開鍵

暗号化するための鍵です。
1本で暗号化だけ行います。

秘密鍵

復号化するための鍵です。
1本で復号化だけ行います。

共通鍵暗号方式

共通鍵暗号方式とは、暗号化も復号化も同じ共通鍵を使って行う方式です。

  1. 送信者が共通鍵を生成して、その共通鍵を用いてデータを暗号化する
  2. 送信者が暗号化されたデータと共通鍵を受信者に送信する
  3. 受信者側で暗号化されたデータを共通鍵を使って復号化する

この方式ではコンピューターへの負担が軽いことや暗号化と復号化が早く行えることがメリットとしてあります。
一方で、複数人とデータをやり取りする場合だと、人数分の共通鍵が必要になってきます。
また、共通鍵を受信者に送るため、送信中の途中で共通鍵が見られてしまうと、せっかく暗号化したデータが第三者に見られてしまうリスクもあります。
そのため、簡単に行えるが、セキュリティなどの観点から取り扱いが難しい方式です。

公開鍵暗号方式

公開鍵暗号方式とは、2つの鍵を用いて暗号化と復号化を行う方式です。

  1. データの受信者が暗号化するための公開鍵と復号化するための秘密鍵を生成し、公開鍵をデータの送信者に送信する
  2. データの送信者が受け取った公開鍵を用いて、データを暗号化する
  3. 送信者が受信者に暗号化したデータを送信する
  4. 受信者が受け取った暗号化されたデータを秘密鍵で復号化する

私が大変混乱した方式です。
まず送信者ではなく、受信者側で鍵を生成します。しかも2つ。
やはり公開鍵も途中で盗聴される可能性があります。
勉強している最中に「え?大丈夫なの?」って思ったのですが、よく考えてみると...
公開鍵は暗号化する専用の鍵であるため、この鍵だけあったとしてもデータを復号化することができません。
しかも、公開鍵を送信しているということは、まだデータは送信すらされていない状態です。
鍵だけあっても、開くものがなければ持っている意味がないですもんね。
そして、データの送信者は暗号化されたデータだけを送信します。
復号化するための鍵は、受信者が最初に生成していて、外部に漏らしていなければ、誰にも復号化されずに手元にデータが届きます。

先ほどの共通鍵暗号方式と比べると、ぐんとセキュリティが向上しています。
複数人に公開鍵を共有しても問題ありません。復号化できるのは受信者だけなので。
しかし、2つの鍵を用いるという複雑な方式なのでコンピューター側で負担がかかるというデメリットがあります。
よりセキュアな通信が行えるが、ちょっと負担がかかる方式です。

ハイブリッド暗号方式

ハイブリッド暗号方式とは、共通鍵暗号方式と公開鍵暗号方式のいいとこ取りをした方式です。

  1. 受信者が暗号化するための公開鍵と復号化するための秘密鍵を生成し、公開鍵を送信者に送信する
  2. 送信者が共有鍵を生成して、共有鍵でデータを暗号化する
  3. 送信者が公開鍵を用いて、共有鍵を暗号化する
  4. 送信者が暗号化されたデータと暗号化された共有鍵を送信する
  5. 受信者が共有鍵を復号化して、復号化した共有鍵でデータを復号化する

ネット上に復号化するための鍵が盗聴されない(されにくい?)方式です。
共有鍵が盗聴されても、暗号化されているために受信者が持っている秘密鍵でしか復号化ができません。
しかも、公開鍵暗号方式でデメリットだった復号化の処理の負担が、共通鍵で暗号化されていることで負担が少なく復号化することができます。
ただやはり複数の鍵をやり取りするので、その分処理がめんどくさい方式だと言えます。

ハッシュ化とは

暗号化と似たものでハッシュ化というものがあります。
これは暗号化は行うけど、復号化は行わない(できない)方式です。
復号化できるものを可逆性といい、復号化できないものを不可逆性と呼びます。
これは、特にログインに必要なパスワードを保存しておくのに使われたりします。
例えば、パスワードを登録する際などにデータベース上に平文でパスワードが載っていると、流出した際に簡単にログインされてしまいます。
そこで、あらかじめハッシュ化したパスワードをデータベースに保存しておくことで、万が一流出してしまった場合でも簡単にログインできません。
しかし、ログインしたくて正しいパスワードを入力しても復号化できないのであれば、ログインができないのではないかと思うかもしれません。
結論から言うと、ログインできます。
ハッシュ化は、複雑な規則をもとに暗号化しますが、同じ文字列であれば、暗号化した結果の文字列は全て同じ文字列に変換されます。
そのため、パスワードを入力した際にハッシュ化した状態で送信して、登録時にハッシュ化して登録してあったパスワードと合致すれば、復号化できなくても、元々の文字列の内容が分からなくても、同じであるということがわかるからです。

暗号化/ハッシュ化アルゴリズム

ここまで暗号化と復号化とハッシュ化の方式を見てきましたが、暗号化とハッシュ化の主要なアルゴリズムについて簡単に見ていきます。

AES(Advanced Encryption Standard)

共通鍵暗号方式で用いられるアルゴリズムです。
データを一定の大きさに区切って、置き換えたり並び替えたりしています。

RSA(Rivest-Shamir-Adleman cryptosystem)

公開鍵暗号方式で用いられるアルゴリズムです。
大きな素数を掛け合わせて、解読が難しいことを利用しています。

SHA-256(Secure Hash Algorithm 256-bit)

ハッシュ値を生成するためのハッシュ関数です。
文字列ごとに256ビットのランダムな値に置き換えています。

最後に

今回は暗号化と復号化とハッシュ化について見ていきました。
アルゴリズムの内容まで解説しているサイトとかもあって、「勉強すると面白そうだけど沼ってしまいそう...」と危機感を持ちました笑
最近ほんのちょっとだけTryHackMeを触っていたので、セキュリティ分野にもちょっと興味が出てきています。(フロントエンドエンジニアの私にとってはあまり必要ないかな?)
ついでにデジタル署名についても調べてまとめたかったのですが、長くなってしまったので一旦ここで一区切りつけて、また次回まとめてみようと思います。

Discussion

ログインするとコメントできます