🛡️共通鍵暗号方式
- 暗号化や復号に要する処理時間が 短い
- 大量のデータ の暗号化・復号に有利。
- 利用者が 増える と 通信ごとに異なる共通鍵 が必要になり、鍵の数が 爆発的に増える
- n人の利用者が相互に通信: n(n-1)/2 種類の鍵が必要。
- 復号 : 暗号文を平文に戻すこと。
- 平文 :暗号化されていないデータ。
- DES :56ビットの共通鍵を用いるブロック暗号。
- AES :DESの後継・共通鍵の代表例。
- RC4 :SSLやWEPなどで広く使われているストリーム暗号(今は脆弱性のため非推奨)。
- KCipher-2 :九州大学とKDDIが共同開発したストリーム暗号。
- データを固定長の ブロック単位で暗号化する方式: ブロック暗号
- データを ビット単位 あるいは バイト単位 に逐次暗号化する方式: ストリーム暗号
🛡️公開鍵暗号方式
- 暗号化と復号に対となる二つの鍵( 鍵ペア )を利用する方式。
- 鍵ペアは一方の鍵から、 もう一方の鍵 を推測できない。
- 利用者は、一方の鍵を 秘密鍵 ( Private Key )として他者に知られないよう厳重に管理し、もう一方を 公開鍵 ( Public Key )として公開する。
- 公開鍵方式で暗号通信を行うためには、平文を 受信者の公開鍵 で暗号化する。これを復号できるのは 受信者 のみが持つ 受信者 の 秘密鍵 なので、第三者による 盗聴 を防ぐことができる。
- 暗号化は 受信者の公開鍵 、復号は 受信者の秘密鍵
- 秘密鍵 は本人のみが保有し、 公開鍵 のみ配送することで 安全な鍵配送 が実現。
- n人の利用者が相互に通信: 2n種類 の鍵が必要。
- 不特定多数が同じサイトに送信: 2種類 の鍵が必要。(サイト側が 受信者 、 秘密鍵 を持つ・サイト側の 鍵ペアを使い回せる )
- 暗号化や復号にかかる処理時間が 長い
- RSA :大きな数の素因数分解の困難性を利用。
- 楕円曲線暗号 :楕円曲線上の離散対数問題が困難であることを利用。
- EIGamal暗号 :位数が大きな群の離散対数問題が困難であることを利用。
🛡️セッション鍵方式(ハイブリッド暗号方式)
- 公開鍵方式を使いながらも、暗号化と復号に 一時的な共通鍵 である セッション鍵 を利用する方式。
- ① 送信者が 使い捨て の 共通鍵 ( セッション鍵 )を生成
- ② 生成した セッション鍵 を受信者の 公開鍵 で暗号化して送信
- ③ 受信した セッション鍵 を受信者の 秘密鍵 で復号
- ④ セッション鍵を用いて暗号化通信を行う
- ⑤ 通信が終了したら、双方でセッションを終了する
- 💡鍵のタイプを整理
- 公開鍵暗号( 非対称 )
- ・ 暗号化: 公開鍵 (みんなが使える)
- ・ 復号: 秘密鍵 (本人だけが持ってる)
- 共通鍵暗号( 対称 )
- ・ 暗号化・復号: 同じ鍵 (=セッション鍵)
- 💡具体的な流れ
- 受信者 (例: Webサイト )は 公開鍵・秘密鍵ペアを持ってる。
- 送信者 (例: あなた )が「使い捨てのセッション鍵」を作る。
- 送信者 が、そのセッション鍵を受信者の 公開鍵 で暗号化して送信。
- 受信者 が自分の秘密鍵で復号してセッション鍵を取り出す。
- その後の通信は、共通鍵暗号(=セッション鍵)でやりとり。
- 通信中は暗号化も復号も、セッション鍵を使う!
💬閑話「でもWebサイト利用してても公開鍵受け取ってる感覚ないなあ」
- 実は、裏ではこっそり・自動で受け取ってる👀
- 🔐 それは「HTTPS」のとき!
- 「https://」って書いてあるサイトにアクセスした瞬間、 裏では
- ① あなたのブラウザ : Webサイトに「HTTPSでアクセスしたいです!」
- ② Webサイト(Webサイトのサーバ): 証明書(サーバ証明書)を返す。この中に証明情報(発行元、署名など)と 公開鍵 が入ってる🔐
- ③ あなたのブラウザ : 証明書をチェック(改ざんされてない?信頼できる?)
- ④ OKなら、その公開鍵を使って「セッション鍵(共通鍵)」を暗号化して送信する🔐
- 鍵の動作 : 何も知らなくても安全に使えるように設計されてる。
- 例:公開鍵暗号/証明書/HTTPS通信 = 自動制御
- 攻撃者だったら、正しくセッション鍵を渡せない/証明書が偽物
- → だからその時点で排除される(通信がブロックされる)
- 💡ログインするときも、買い物するときも、 実はこうなってる。
- ① その通信が暗号化されているか?(セッション鍵があるか)
- ② サーバは本物か?(証明書は信頼されているか)
- ③ データは盗まれていないか?改ざんされていないか?
- すべてコンピュータ(ブラウザとサーバ)が自動で判断してくれてる。
🛡️暗号アルゴリズムの危殆化
- アルゴリズムの安全性は「現実的な時間やコストでは 解読 が不可能である」ことを根拠にしている。
- 暗号解析の進歩やコンピュータの計算能力の向上などにより、暗号アルゴリズムの安全性が低下することを暗号アルゴリズムの 危殆化 とよぶ。
- MD5:衝突(同じハッシュ値を持つ異なるデータ)が簡単に見つかる。
- SHA-1:2017年にGoogleが実際に衝突を発見したことで、実用上の危殆化。
- RSA:鍵長が短い場合 / 現在の性能でも数百bitのRSAは解読可能。
- 安全なアルゴリズムへ移行する(例:SHA-256やSHA-3への移行)
- 鍵の長さを十分に確保する(2048bit以上のRSA、256bitのAESなど)
💬閑話「人が作るよりずっと安全」完全自動化について
- セッション鍵のランダム生成は完全に自動化されてる。
- プログラムや暗号ライブラリ(例:Python の cryptography モジュール、Javaの KeyGenerator クラスなど)によって
- 安全なランダムな値を使って
- 適切な長さ(例えばAESなら128bitや256bit)の鍵を
- 高速かつセキュアに生成する
- セッション鍵の生成は「安全なランダム」が超大事🔐
- 普通の random() 関数じゃなくて、 os.urandom() とか、OSレベルの暗号論的乱数生成器(CSPRNG)を使う
- 人間が考えるパスワードや鍵 : けっこうパターンや癖がある。
- 人間の直感じゃなくて、高品質な乱数で機械的に作る。
- 毎回違う値にする(=使い捨てで安全)
- 長さもきっちりある(128bit以上が推奨)