メインコンテンツへスキップ
  1. ノート/
  2. セキュリティと暗号/

RSA 暗号アルゴリズム

·274 文字·1 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
この記事は中国語版をもとにした日本語版です。技術用語は、初出では English term(日本語の専門用語)という形で表記します。説明文は日本語として自然になるように整理し、コード、画像、リンク、記事の構成は原文に対応させています。

RSA 暗号化アルゴリズムの解説
#

1. RSA 暗号化アルゴリズムの数学的原理
#

1. 鍵ペアの生成
#

手順は次のとおりです。

  • 二つの大きな素数を選ぶ: \( p \) と \( q \)。
  • \( n \) を計算する: $$ n = p \times q $$
  • Euler’s totient function(オイラーのトーシェント関数、$\varphi(n)$)を計算する:
$$ \varphi (n) = (p-1) \times (q-1) $$
  • public exponent(公開指数、$e$)を選ぶ。$1
  • private exponent(秘密指数、\( d \))を計算する。次の式を満たす値を選びます。
$$ d \times e \equiv 1 \pmod{\varphi (n)} $$

これは、\( d \) が $\varphi(n)$ を法としたときの \( e \) の乗法逆元であることを意味します。

  • key pair(鍵ペア)を生成する:
    • public key(公開鍵): \( (e, n) \)
    • private key(秘密鍵): \( (d, n) \)

2. 暗号化の流れ
#

暗号化する plaintext(平文)を \( M \)(\( M < n \))とします。

  • 暗号化の式:
$$ C = M^e\;mod\;n \; \text{即} \; M^e \equiv C(mod\;n) $$
  • ここで、\( C \) は ciphertext(暗号文)、\( M \) は平文です。

3. 復号の流れ
#

秘密鍵 \( (d, n) \) を使って暗号文 \( C \) を復号します。

  • 復号の式:
$$ M = C^d\;mod\;n\;即\;C^d \equiv M(mod\;n) $$
  • 復号すると元の平文 \( M \) が得られます。

2. RSA アルゴリズムの数学的背景
#

RSA の安全性は、次の数学的な難問に基づいています。

  • integer factorization problem(素因数分解問題): \( n = p \times q \) が与えられたとき、\( n \) を分解して \( p \) と \( q \) を求めるのは、特に両方が非常に大きな素数の場合、極めて困難です。
  • modular exponentiation(剰余べき乗)Euler’s theorem(オイラーの定理):
    • オイラーの定理より: $$

M^{\varphi (n)} \equiv 1 \pmod{n} $$

  • \( d \) と \( e \) が $d \times e \equiv 1 \pmod{\varphi (n)}$ を満たすように選ぶことで、暗号化と復号が互いに逆の操作になることを保証できます。
証明の要点を簡潔にまとめます。

条件:

e: $1

d: 次の式を満たす。

$d \times e \equiv 1(mod\;\varphi(n))$

$$ \begin{align} C = M^e\;mod\;n \; \text{即} \; M^e \equiv C(mod\;n) \tag{1} \end{align} $$$$ \begin{align} M = C^d\;mod\;n\;即\;C^d \equiv M(mod\;n) \end{align} \tag{2} $$

式 (1) の両辺を d 乗すると式 (2) が得られます

$$ \begin{align} &M^{de} \equiv C^d\equiv M(\text{mod n}) \text{即} \\ &M^{de}\equiv M(\text{mod n}) \end{align} $$

==なぜ暗号文 C を d 乗すると元の平文を復号できるのかを示します。==

$$ \begin{align} &M^{\varphi(n)}\equiv 1 \text{(mod n)} \\ &d\times e\equiv 1(\text{mod $\varphi(n)$}) \\ &\text{そのため$\varphi(n)\mid de - 1$} \\ &\text{de - 1 は $\varphi(n)$ の整数倍}\\ &\text{したがって }M^{de-1}\equiv 1(\text{mod n}) \\ \text{証明終わり} \end{align} $$

3. RSA の実際の利用場面
#

  • 暗号化通信: 対称鍵を暗号化するために使われます(TLS/SSL の証明書交換における鍵交換など)。
  • digital signature(デジタル署名): メッセージやファイルの完全性と送信元を検証するために使われます(メール署名、ソフトウェア配布の検証など)。
  • authentication(認証): データが正当な送信者から来たことを確認するために使われます(デジタル証明書など)。

RSA と Hash の組み合わせ
#

RSA と hash algorithm(ハッシュアルゴリズム)の組み合わせ
#

1. デジタル署名
#

RSA は hash algorithm(ハッシュアルゴリズム)と組み合わせて**digital signature(デジタル署名)**に使われます。これにより、データの完全性と送信元の真正性を確認できます。流れは次のとおりです。

  • 手順 1: メッセージ \( M \) のハッシュを計算し、hash value(ハッシュ値)\( H (M) \) を得る。
  • 手順 2: 送信者の秘密鍵 \( d \) でハッシュ値を暗号化し、署名 \( S \) を生成する。
$$ S = H (M)^d \mod n $$
  • 手順 3: 署名 \( S \) とメッセージ \( M \) を受信者へ送る。
  • 手順 4(検証側):
    • 受信者は送信者の公開鍵 \( e \) で署名を復号する。
$$ H' (M) = S^e \mod n $$
  • 受信者はメッセージ \( M \) のハッシュ値 \( H (M) \) を再計算し、復号して得た \( H' (M) \) と比較します。
    • \( H (M) = H' (M) \) なら署名は有効で、メッセージは改ざんされていません。

2. なぜ Hash アルゴリズムと組み合わせるのか
#

  • 性能最適化: RSA は大きなデータの暗号化が遅いため、通常はメッセージ全体ではなくハッシュ値だけに署名します。
  • データ完全性: ハッシュアルゴリズムは任意の長さのメッセージを固定長のハッシュ値へ変換し、データの改ざんをすばやく検出できます。
  • collision attack(衝突攻撃)の防止: 強力なハッシュアルゴリズムを使うことで、異なるメッセージから同じハッシュ値が生成される可能性を下げ、安全性を高めます。
2.1 性能优化
#
この最適化はメッセージへの署名に関するものであり、大きなファイルそのものを暗号化する最適化ではありません。
  • 問題: RSA は大きなデータの暗号化と復号に時間がかかります。RSA の暗号化と復号は大きな整数の剰余べき乗に基づいているためです。メッセージ全体(たとえばファイル)を RSA で直接暗号化または署名すると、データ量が大きいほど性能が低下します。

  • 解決策:

    • hash algorithm(ハッシュアルゴリズム)で任意の長さのメッセージ \( M \) から固定長のハッシュ値 \( H (M) \)(たとえば 256 ビット)を生成する。
    • メッセージ全体ではなく、この固定長のハッシュ値だけを RSA で暗号化する。
    • これにより計算量が大幅に減り、暗号化と署名を高速化できます。

:

  • 1 GB のファイルに署名するとします。RSA で直接署名すると 1 GB のデータを処理する必要があり、非常に時間がかかります。
  • 先にファイルへ SHA-256 などのハッシュアルゴリズムを適用し、256 ビット(32 バイト)のハッシュ値に変換してから RSA で署名すれば、処理対象は 32 バイトだけです。署名の効率を大幅に高められます。
2.2 データ完全性
#
  • 問題: メッセージが送信中に改ざんされていないことを確認する必要があります。元のメッセージを RSA で直接暗号化すれば安全性は得られますが、効率が悪くコストも高くなります。

  • 解決策:

    • ハッシュアルゴリズムでメッセージ \( M \) を固定長のハッシュ値 \( H (M) \) に変換する。
    • メッセージ \( M \) に変更があれば、ハッシュ値 \( H (M) \) も変化する。
    • そのため受信者は、メッセージが改ざんされたかどうかを簡単に検出できる。

:

  • 送信者がメッセージ \( M \)(たとえば “Hello, World!")を送る。
  • 送信前にハッシュ値 \( H (M) \) を計算し、( H (M) = $\text{0x1a2b3c...}$) を得る。
  • 送信者は秘密鍵で \( H (M) \) に RSA 署名を行い、署名とメッセージ \( M \) を一緒に送る。
  • 受信者は受信後にメッセージのハッシュ値 \( H' (M) \) を再計算し、署名を検証する。
    • \( H (M) = H' (M) \) なら、メッセージは改ざんされていない。
    • 一致しなければ、メッセージが変更された可能性がある。
2.3 衝突攻撃の防止
#
  • 問題: 攻撃者は、異なる二つのメッセージ \( M_{1} \) と \( M_{2} \) から同じハッシュ値 \( H (M_{1}) = H (M_{2}) \) を生成しようとする可能性があります。成功すると、正当なメッセージ \( M_{1} \) で署名を作り、受信者には偽造メッセージ \( M_{2} \) を検証させられます。

  • 解決策:

    • SHA-256 や SHA-3 などの安全なハッシュアルゴリズムを使い、collision resistance(耐衝突性)を確保する。
    • 強力なハッシュアルゴリズムでは衝突の発見が非常に困難になるため、全体の安全性が向上する。

:

  • Alice が正当なメッセージ ($M_{1}$) に署名し、($S = H (M_{1})^d\text{(mod n)}$) を生成するとします。
  • Bob は別のメッセージ ($M_{2}$) を探し、($H(M_{2})=H(M_{1})$) を成立させて Alice の署名を偽装しようとします。
  • Alice が SHA-256 などの強力なハッシュアルゴリズムを使っていれば、Bob がそのような ($M_{2}$) を見つけるのはほぼ不可能です。
  • したがって、ハッシュアルゴリズムと組み合わせた RSA デジタル署名は、衝突攻撃を効果的に防止できます。

完全な例: RSA と Hash アルゴリズムを組み合わせたデジタル署名の流れ
#

Alice が Bob にメッセージを送り、その真正性と完全性を保証するものとします。

  1. Alice がメッセージのハッシュ値を計算する:

    • メッセージ \( M \): “Hello, Bob!”
    • SHA-256 などのハッシュアルゴリズムを使い、ハッシュ値 ( H (M) ) を得る。
  2. Alice がデジタル署名を生成する:

    • Alice は秘密鍵 \( d \) でハッシュ値 \( H (M) \) を RSA 暗号化し、署名 \( S \) を生成する。
$$ S = H (M)^d \mod n $$
  • Alice は署名 \( S \) と元のメッセージ \( M \) を Bob に送ります。
  1. Bob が署名を検証する:
    • Bob はメッセージ \( M \) と署名 \( S \) を受け取り、Alice の公開鍵 \( e \) で署名を復号します。
$$ H' (M) = S^e \mod n $$
  • Bob は受信したメッセージ ( M ) のハッシュ値 ( H (M) ) を再計算します。
  • \( H' (M) = H (M) \) なら署名は有効で、メッセージは改ざんされておらず、Alice から送られたものだと確認できます。

まとめ
#

Hash アルゴリズムを組み合わせることで、RSA 暗号化システムの性能と安全性が向上します。

  • 性能最適化: メッセージ全体ではなく、固定長のハッシュ値だけに RSA 演算を行います。
  • データ完全性: メッセージを改ざんするとハッシュ値が変わるため、改ざんを検出できます。
  • 衝突攻撃の防止: 強力なハッシュアルゴリズムによって署名の安全性を保ちます。

そのため、RSA と Hash アルゴリズムの組み合わせは、SSL/TLS、デジタル証明書、メール署名など、現代の安全な通信で重要な役割を果たします。


评论