ElGamal暗号は、離散対数問題の困難性を安全性の根拠とする公開鍵暗号の一つです。これを楕円曲線上で定義したものが、楕円曲線ElGamal暗号です。
鍵生成 (Key Generation)
- パラメータの選択: 楕円曲線 $E$ と、その曲線上の点であるベースポイント $G$(位数 $l$)を決定します。これらは公開されます。
- 秘密鍵の生成: 秘密鍵となる整数 $x$ を、$1 \le x < l$ の範囲からランダムに選択します。
- 公開鍵の計算: 秘密鍵 $x$ とベースポイント $G$ から、公開鍵となる点 $Y = xG$ を計算します。($xG$ は楕円曲線上のスカラ倍算を表します)
- 秘密鍵: $x$
- 公開鍵: $(E, G, Y)$
暗号化 (Encryption)
平文 $m$ を暗号化するには、以下の手順を実行します。
- 一時的な乱数 $r$ を $1 \le r < l$ の範囲からランダムに選択します。
- $U = rG$ を計算します。
- $V = rY$ を計算します。この点 $V$ は送信者と受信者で共有される秘密情報となります。($V = rY = r(xG) = x(rG) = xU$)
- $V$ のx座標 $v_x$ を使い、平文 $m$ をマスク(暗号化)します: $c = v_x \oplus m$ ($\oplus$ は排他的論理和)。
- 暗号文は、点の $U$ とマスクされたメッセージ $c$ のペア $(U, c)$ となります。
復号 (Decryption)
暗号文 $(U, c)$ を復号するには、以下の手順を実行します。
- 受信者は自身の秘密鍵 $x$ を使い、$V’ = xU$ を計算します。
- 暗号化の手順で見たように、$V’ = V$ となるため、計算した点 $V’$ のx座標 $v’_x$ は、暗号化に使われた $v_x$ と一致します。
- $m = v’_x \oplus c$ を計算し、元の平文 $m$ を復元します。
Pythonによる簡易実装
【注意】 以下のプログラムは、楕円曲線ElGamal暗号の基本的な概念を理解するために、大幅に簡略化されています。特に、モジュラ逆数の計算やスカラ倍算の実装は非常に非効率かつ単純な方法で行っており、実際の暗号通信には全く使用できません。
| |