セキュリティ対策の基本 #3 【公開鍵暗号方式】(覚え書き)

セキュリティ

暗号って聞くと「なんだか難しそう…」と思うかもしれませんが、実はとっても面白い仕組みがいっぱい。ここでは、共通鍵暗号の課題から「公開鍵暗号」、そしてその代表格「RSA暗号」について、ポップな解説とPythonのコード例を交えながら説明していきます。

共通鍵暗号のもつ悩み

  • 仕組み: 送信側と受信側が「同じ鍵」を使ってメッセージを暗号化&復号します。
  • 問題点:
    • 鍵の配送問題: どうやって安全に鍵を送るか?
    • 管理の手間: 例えば、1000人が通信するなら、必要な鍵の数は膨大になります!

この「鍵配送問題」は、セキュリティの現場で大きな課題となっていました。

公開鍵暗号が登場!

仕組み:

  • それぞれのユーザーは「公開鍵」と「秘密鍵」という2種類の鍵を持ちます。
  • 公開鍵: みんなに公開してもOK!(これで暗号化)
  • 秘密鍵: 自分だけが持つ秘密の鍵!(これで復号)

メリット:

  • 鍵を安全に配送する手間がなくなる!
  • 送信側は受信者の公開鍵でメッセージを暗号化すればOK!

RSA暗号って何だろう?

RSA暗号は、公開鍵暗号の中でもとても有名な方式です。

③ RSAのポイント

  • 数学の力: 大きな合成数(2つの大きな素数の積)の素因数分解が「非常に困難」であることを利用。
  • 鍵生成の流れ:
    1. 素数 p, q の選定: 例として、小さな数字で p=7, q=13 とします。
    2. 合成数 N の計算: N = p × q = 7 × 13 = 91
    3. オイラー関数 φ(N) の計算: φ(N) = (p-1) × (q-1) = 6 × 12 = 72
    4. 公開指数 e の選定: 例えば e=7 (ただし、e と φ(N) は互いに素でなければならない)
    5. 秘密指数 d の計算: d は「e × d ≡ 1 (mod φ(N))」を満たす整数。ここでは d=31 とします。
  • 暗号化/復号の流れ:
    • 暗号化: 平文 M を「M^e mod N」で計算して暗号文 C を得る。
    • 復号: 暗号文 C を「C^d mod N」で計算して元の平文 M に戻す。

例えば、平文 M=5 の場合、

  • 暗号化すると C = 5^7 mod 91 = 47
  • 復号すると M = 47^31 mod 91 = 5

このように、RSAでは一度暗号化したメッセージを、秘密鍵を持つ人だけが元に戻すことができます!

PythonでRSAを体験してみよう!

ここでは、簡単なPythonコードでRSAの仕組みを実際に試してみます。以下のコードは、小さな数値(p=7, q=13, e=7, d=31, N=91)を使ったRSAの例です。

def rsa_encrypt(plaintext, e, N):
    """RSA暗号化: 平文を公開鍵で暗号化"""
    return pow(plaintext, e, N)

def rsa_decrypt(ciphertext, d, N):
    """RSA復号: 暗号文を秘密鍵で復号"""
    return pow(ciphertext, d, N)

# 例として、p=7, q=13 として N = 7×13 = 91
# オイラー関数 φ(N) = (7-1)×(13-1) = 6×12 = 72
# 公開指数 e = 7, 秘密指数 d = 31(eとφ(N)からdを計算)
N = 91
e = 7
d = 31

plaintext = 5  # 平文の例
ciphertext = rsa_encrypt(plaintext, e, N)
decrypted = rsa_decrypt(ciphertext, d, N)

print("平文:", plaintext)
print("暗号文:", ciphertext)
print("復号結果:", decrypted)

このコードでは、pow() 関数を使って「べき乗の剰余計算」を行っています。
実行すると、以下のような結果が得られます:

  • 平文: 5
  • 暗号文: 47
  • 復号結果: 5

つまり、平文の「5」が無事に暗号化され、秘密鍵を使って元の「5」に戻っていることが確認できます!

※実際のRSA暗号では、はるかに大きな素数を使って計算しますが、ここでは理解しやすいように小さな数字を使用しています。

ハイブリッド暗号方式のひと工夫

実は、RSAなどの公開鍵暗号は処理速度が遅いというデメリットもあります。
そこで登場するのがハイブリッド暗号方式です。

④ ハイブリッド方式のポイント

  • アイデア:
    • 送信ごとに「ランダムな共通鍵」を生成し、その鍵で大量のデータを高速に暗号化(共通鍵暗号)。
    • その共通鍵自体を受信者の公開鍵で暗号化(公開鍵暗号)。
  • メリット:
    • 鍵配送の簡便さと、高速なデータ処理の両方の利点を取り入れられる!

まとめ

  • 共通鍵暗号の課題: 鍵の安全な配送と管理が大変!
  • 公開鍵暗号の解決策: 公開鍵と秘密鍵のペアを使えば、送信側は公開鍵で暗号化し、受信側だけが秘密鍵で復号できる。
  • RSA暗号: 大きな合成数の素因数分解の難しさを利用した公開鍵暗号の代表例。
  • ハイブリッド方式: 公開鍵暗号と共通鍵暗号の良いとこ取りで、高速かつ安全な通信を実現!

暗号の世界は奥深いですが、基本の考え方を押さえれば「安全な通信」がどうして成り立っているかが見えてきます。

さあ、これであなたも公開鍵暗号マスターへの第一歩です!

コメント