数据结构与算法: El Gamal加密算法

Introducing El Gamal Encryption Algorithm

Posted by R1NG on March 25, 2022 Viewed Times

El Gamal 加密算法

本节简单介绍 El Gamal 加密算法的基本原则, 涉及的计算算法和操作步骤.

El Gamal 加密算法的基本原则

El Gamal 算法是一种 公钥-私钥 加密算法, 其基本思路是: 构造一个 从自变量计算出因变量相对容易, 但反过来给定因变量反推自变量极其困难单向函数.

而在公钥-私钥加密算法中, 我们将包含部分自变量信息, 可以用于解密的信息作为 私钥, 只有信息接收者拥有; 而信息接收者通过使用私钥生成 可以加密信息但无法将密文解密公钥 自由分发, 任何人都可以使用公钥向接受者发送加密的信息, 而这些信息 只有掌握私钥的接受者自己 才能解密.

20220508162722

El Gamal 算法中, 核心的加密思想涉及下列的单向函数:

20220508162746

在知道 $y, a, p$ 的情况下反推出 $b$ 基本是不可能的.

下面介绍一些在 El Gamal 算法中涉及的数论概念:

模运算

20220508163147

下面给出 剩余系, 简化剩余系, 模逆 (Modular Inverse), 生成元 (Generator) 和 原根 (Primitive Root) 的定义:

剩余系, 简化剩余系和模逆

记 $\mathbf{Z}_n$: 模 $n$ 的剩余系.

同时有结论: 若 $x$ 和 $n$ 互素, 则 $x$ 在 $\mathbf{Z}_n$ 中的代表元对于 $n$ 有 模逆, 即:

存在 $x$ 在 $\mathbf{Z}_n$ 中的模逆 $x^{-1}$, 使得

\[x \cdot x^{-1} \equiv 1 ~ (\text{mod} n).\]

记 $\mathbf{Z}^{*}_n$: 模 $n$ 的 简化剩余系: 其中任何代表元 均和 $n$ 互素.

故对素数 $p$, 有: $\mathbf{Z}_p = \mathbf{Z}^{*}_p$. 立即可知:

  1. 素数的剩余系就是其简化剩余系.

  2. 素数的剩余系中的任何代表元都关于该素数的模运算存在模逆.

阶, 生成元和原根

记 $m$ 为素数 $p$ 的简化剩余系中的一个代表元. 若存在 $k$, 满足

\[m^1 ~ \text{mod}~ p, m^2 ~ \text{mod}~ p, \cdots, m^{k} ~ \text{mod}~ p\]

恰好构成了 模 $p$ 的简化剩余系, 则称 $k$ 为数 $m$ 在 $p$ 的简化剩余系中的 , 方便记忆可记为 “$m$ 关于 $p$ 的阶”, 你自己知道实际上表示什么含义就行.

若 $m$ 关于 $p$ 的阶恰为 $p-1$ (任何素数 $p$ 的剩余系, 简化剩余系恰含 $p-1$ 个代表元), 则称 $m$ 为 $p$ 的简化剩余系的 一个 生成元 (Generator), 或称 $m$ 为 $p$ 的一个 原根 (Primitive Root).

下面给出一些关于生成元存在性的证明:

20220508164950

可以不记, 官宣不考.

El Gamal 加密算法中涉及的计算算法

下面介绍一些 El Gamal 加密算法中涉及的必须计算算法. 由于大概率这些算法 要求记忆, 请务必 谨慎对待.

欧几里得算法

欧几里得算法用来计算 两个数的最大公约数:

20220508171357

20220508171411

快速欧几里得算法

快速欧几里得算法用来计算 模逆, 应用在 解密过程中. (计算的是 $a^{-1} ~\text{mod}~b$, 就是返回的 $j$)

20220508171541

20220508171515

快速模幂算法

快速模幂算法用于给定 $p, q, x$, 计算 $q^x ~\text{mod}~ p$, 应用在 加密过程中. (按照下图算法计算的是 $a^{p} ~\text{mod}~ n$)

20220508171431

El Gamal 加密算法的操作步骤

创建公钥和私钥

El Gamal 算法的 公钥:

20220508165237

注意:

  1. $g$ 是 $p$ 的 原根, 考试时会直接提供.

  2. $x$ 是 $p$ 的简化剩余系中的任意元素, 除此以外没有选择限制.

El Gamal 算法的 私钥:

构造公钥时, 在 $p$ 的简化剩余系中挑选的 $x$ 就是 只有信息接收者持有的 私钥.

加密

El Gamal 算法中的加密过程是:

  1. 信息发送者接收到广播的私钥: $(p, g, y)$.

  2. 信息发送者选择要发送的信息 $M$.

  3. 信息发送者 随便选择某个数 $k$.

  4. 信息发送者发送密文:

    \[(g^k ~\text{mod}~p, ~M\cdot y^k ~\text{mod}~p).\]

解密

记信息接收者得到的信息为

\[(a, b).\]

解密步骤:

  1. 使用私钥 $x$ 计算 $a^{x} ~\text{mod}~p.$
  2. 计算 $a^{x} ~\text{mod}~p.$ 关于 $p$ 的 模逆 $r$.
  3. 计算 $b \cdot r ~\text{mod}~p$, 所得结果即为明文.

回顾构造密文的精密之处: 站在旁观者角度我们知道这里的 $y$ 实际上就是 $g^{x} ~\text{mod}~p$. 在解密时, 解密者只需用私钥计算出 $g^{kx} ~\text{mod}~p$, 进一步算出这个数关于 $p$ 的模逆, 乘上 $M\cdot y^k ~\text{mod}~p$ 就恢复得到了被加密的明文.