跳转至

公钥密码


  • 公钥密码算法,又称非对称密码算法,是指加密和解密使用不同密钥的密码算法。
  • 对称加密体制的缺陷
    • 密钥分配问题:通信双方要进行加密通信,需要通过秘密的安全信道来协商加密密钥,而这种安全信道可能很难实现
    • 密钥管理问题:在有多个用户的网络中,任何两个用户之间都需要有共享的秘密钥,当网络中的用户 \(n\) 很大时,需要管理的密钥数目是非常大 \(n(n−1)/2\)
    • 没有签名功能:当主体 A 收到主体 B 的电子文档(电子数据)时,无法向第三方证明此电子文档却是来源于 B

公钥密码体制的基本原理

  • Public-Key / Two-key / Asymmetric Cryptography
    • 公钥(Public Key):加密密钥,任何人都可以知道,用于加密或者验证签名
    • 私钥(Private Key):解密密钥,只有密钥拥有者知道,用于解密或者签名
    • 加密或验证签名者不能解密或生成签名
  • 公钥加密方案

  • 公钥密码理论:

    • 由私钥及其他密码信息容易计算出公钥
    • 由公钥及算法描述,计算出私钥在计算上不可行
    • 由公钥及密文,计算出对应的明文在计算上不可行
    • 因此,公钥可以发布给其他人
    • 密钥分配问题不是一个容易的问题
  • 公钥算法分类
    • Public-Key Distribution Schemes (PKDS)
      • 用于交换秘密信息(依赖于双方主体)
      • 常用于对称加密算法的密钥
    • Public-Key Encryption (PKE)
      • 用于加密任何消息
      • 任何人可以用公钥加密消息
      • 只有私钥拥有者可以解密消息
      • 任何公钥加密方案能够用于密钥分配方案 PKDS
      • 许多公钥加密方案也是数字签名方案
    • Signature Schemes (SS)
      • 用于生成对某消息的数字签名
      • 私钥拥有者生成签名
      • 任何人都可以用公钥验证签名
  • 公钥的安全性
    • 依赖于足够大的困难性差别
    • 类似于对称算法,穷搜索理论上可以破解公钥密码
    • 但实际上,密钥足够长(>512-bit),穷搜索不可行
    • 一般情况下,有一些已知的困难问题
    • 要求足够大的密钥长度(>512-bit)
    • 导致加密速度比对称算法慢

Diffie-Hellman 密钥交换协议

  • 公钥分配方案
    • 不能用于交换任意消息
    • 可以建立共享密钥(双方共享)
    • 依赖于双方的公私钥值
    • 基于有限域上的指数问题
    • 安全性是 基于计算离散对数的困难性

Diffie-Hellman Setup

  • 两个通信主体 A 和 B 希望在公开信道上建立密钥
  • 初始化:
    • 选择一个大素数 \(p\) 和一个生成元 \(g\) (\(1 < g < p\))
    • \(p\)\(g\) 公开
  • 密钥生成:
    • A 选择一个私钥 \(x_A\) (\(1 < x_A < p\))
    • B 选择一个私钥 \(x_B\) (\(1 < x_B < p\))
    • A 计算公钥 \(y_A = g^{x_A} \bmod p\)
    • B 计算公钥 \(y_B = g^{x_B} \bmod p\)
    • A 和 B 分别公开各自的公钥 \(y_A\)\(y_B\)
  • 密钥计算:
    • A 计算共享密钥 \(K_{AB} = y_B^{x_A} \bmod p = g^{x_A x_B} \bmod p\)
    • B 计算共享密钥 \(K_{AB} = y_A^{x_B} \bmod p = g^{x_A x_B} \bmod p\)
    • 由于模幂运算的性质,A 和 B 计算出的共享密钥 \(K_{AB}\) 是相同的
  • 示例:
    • 选取素数 \(p=97\), 及生成元 \(g=5\)
    • Alice 选取秘密 \(x_A=36\) & 计算公钥 \(y_A=5^{36}=50 \bmod 97\)
    • Bob 选取秘密 \(x_B=58\) & 计算公钥 \(y_B=5^{58}=44 \bmod 97\)
    • Alice and Bob 交换公钥
    • Alice 计算公享秘密 \(K=44^{36}=75 \bmod 97\)
    • Bob 计算公享秘密 \(K=50^{58}=75 \bmod 97\)

Diffie-Hellman in Practice

  • 两个主体每次可以选择新的私钥,并计算及交换新的公钥
  • 可以抵挡被动攻击,但不能抵挡主动攻击
  • 每次可以给出一个新的共享密钥
  • 为抵抗主动攻击(如中间人攻击),需要其他新的协议,也可以建立长期公钥

Man-in-the-Middle Attack(中间人攻击)

  • 两个通信主体 A 和 B,以及一个攻击者 E
  • 初始化:
    • 选择一个大素数 \(p\) 和一个生成元 \(g\) (\(1 < g < p\))
    • \(p\)\(g\) 公开
  • 密钥生成:
    • A 选择一个私钥 \(x_A\) (\(1 < x_A < p\)),计算公钥 \(y_A = g^{x_A} \bmod p\)
    • B 选择一个私钥 \(x_B\) (\(1 < x_B < p\)),计算公钥 \(y_B = g^{x_B} \bmod p\)
  • 密钥计算:
    • A 将公钥 \(y_A\) 发送给 B,但被 E 截获
      • E 选择一个私钥 \(x_A^\prime\),计算公钥 \(y_A^\prime = g^{x_A^\prime} \bmod p\) 发送给 B
    • B 将公钥 \(y_B\) 发送给 A,但被 E 截获
      • E 选择一个私钥 \(x_B^\prime\),计算公钥 \(y_B^\prime = g^{x_B^\prime} \bmod p\) 发送给 A
    • A 和 E 共享密钥 \(K_{AE} = (y_B^\prime)^{x_A} \bmod p = g^{x_A x_B^\prime} \bmod p\)
    • B 和 E 共享密钥 \(K_{BE} = (y_A^\prime)^{x_B} \bmod p = g^{x_A^\prime x_B} \bmod p\)
  • 结果:
    • A 和 E 共享密钥 \(K_{AE}\)
    • B 和 E 共享密钥 \(K_{BE}\)
    • A 和 B 之间没有共享密钥

RSA

  • 使用最广泛的公钥加密算法
    • 由 Ron Rivest, Adi Shamir 和 Leonard Adleman 在 1977 年提出
    • 基于大整数分解的困难性

RSA 密钥生成

  • 随机选择两个大素数 \(p\)\(q\)(>500-bit)
    • 计算模数 \(n = p \times q\)
    • 计算欧拉函数 \(\phi(n) = (p-1)(q-1)\)
  • 随机选择一个加密指数 \(e\),满足 \(1 < e < \phi(n)\)\(\gcd(e, \phi(n)) = 1\)
    • 计算解密指数 \(d\),满足 \(d \times e \equiv 1 \bmod \phi(n)\)\(1 < d < \phi(n)\)
  • 得到密钥对:
    • 公钥为 \(K = \{e, n\}\)
    • 私钥为 \(K^{-1} = \{d, p, q\}\)

RSA 参数选择

  • 需要选择足够大的素数 \(p\)\(q\)(>500-bit)
  • 通常选择小的加密指数 \(e\),且与 \(\phi(n)\) 互质
    • 常用 \(e\) 的值为 \(3, 17, 65537 (= 2^{16} + 1)\)
    • \(e\) 对所有用户可以是相同的
    • 最初建议使用 \(e=3\)
  • 解密指数 \(d\) 比较大

RSA 加解密算法

  • 加密:
    • 使用公钥 \(K = \{e, n\}\)
    • 将消息 \(M\) 映射为整数 \(m\),满足 \(0 \leq m < n\)
    • 计算密文 \(c = m^e \bmod n\)
  • 解密:
    • 使用私钥 \(K^{-1} = \{d, p, q\}\)
    • 计算明文 \(m = c^d \bmod n\)
  • 示例:
    1. 选素数 \(p=47\)\(q=71\),得 \(n=pq=47\times 71=3337\)\(\phi(n)=(p-1)(q-1)=46\times 70=3220\)
    2. 选择 \(e=79\),求得解密指数 \(d=e^{-1}\bmod \phi(n)=1019\)
    3. 公开公钥 \(K=\{n=3337, e=79\}\),保留私钥 \(K^{-1}=\{d=1019, p=47, q=71\}\)
    4. 现要发送明文 \(688\),计算:\(688^{79} \bmod 3337=1570\)
    5. 收到密文 \(1570\) 后,用私钥 \(d=1019\) 进行解密:\(1570^{1019} \bmod 3337=688\)

RSA 理论

  • 基于 Fermat's Theorem

    • 如果 \(n = pq\),其中 \(p, q\) 是素数,则有:\(x^{(\phi(n))} = 1 \bmod n\),对于所有与 \(n\) 互质的 \(x\),即 \(\gcd(x, n) = 1\),其中 \(\phi(n) = (p−1)(q−1)\)
    • 在 RSA 中,\(e\)\(d\) 是经过特殊选择的:
      • \(e \cdot d = 1 \bmod \phi(n)\)\(e \cdot d = 1 + R \cdot \phi(n)\)
    • 因此可以推导出:

      \[ C^d = M^{(e \cdot d)} = M^{(1 + R \cdot \phi(n))} = M^1 \cdot (M^{(\phi(n))})^R = M^1 \cdot 1^R = M^1 \bmod n = M \]
    • 这表明解密后的明文 \(M\) 与加密前的明文一致。

    • 相关理论
  • RSA 加密实质上是一种 \(\mathbb{Z}_n \rightarrow \mathbb{Z}_n\) 上的单表代换

    • 给定 \(n = p \times q\) 和合法明文 \(m \in \mathbb{Z}_n\),可以唯一地计算出密文 \(c = (m^e \bmod n) \in \mathbb{Z}_n\),对于 \(m \neq m^\prime\),有 \(c \neq c^\prime\)
    • \(\mathbb{Z}_n\) 中的任一元素(\(0, p, q\) 的倍数除外)是一个明文,但它也是与某个明文相对应的一个密文。
    • 因此,RSA 是 \(\mathbb{Z}_n \rightarrow \mathbb{Z}_n\) 的一种单表代换密码,关键在于 \(n\) 极大时在不知陷门信息下极难确定这种对应关系,而用模指数算法又易于实现一种给定的代换。正由于这种一一对应性使 RSA 不仅可以用于加密也可以用于数字签字。

RSA 的安全性

  • 基于大整数分解的困难性
    • 需要分解模 \(n\) 的素因子 \(p\)\(q\),才能计算出 \(\phi(n)\),进而计算出解密指数 \(d\)
  • 要求分解模 \(n\)
    • 在理论上,RSA 的安全性取决于模 \(n\) 分解的困难,但数学上至今还未证明分解模就是攻击 RSA 的最佳方法,也未证明分解大整数就是 NP 问题,可能有尚未发现的多项式时间分解算法。
    • 人们完全可以设想有另外的途径破译 RSA,如求解密指数 \(d\) 或找到 \((p_1-1)(p_2-1)\) 等。
    • 但这些途径都不比分解 \(n\) 来得容易。甚至 Alexi 等在 1988 曾揭示,从 RSA 加密的密文恢复某些 bit 的困难性也和恢复整组明文一样困难。
  • 采用广义数域筛选分解不同长度 RSA 公钥模所需的计算机资源

    密钥长(bit) 所需的 MIPS-年
    116(Blacknet 密钥) 400
    129 5,000
    512 30,000
    768 200,000,000
    1024 300,000,000,000
    2048 300,000,000,000,000,000,000
    • MIPS-年指以每秒执行 1,000,000 条指令的计算机运行一年

RSA 的实现问题

  • 需要计算模 300 digits (or 1024+ bits) 的乘法
    • 计算机不能直接处理这么大的数(计算速度很慢)
    • 需要考虑其它技术,加速 RSA 的实现
  • RSA 的快速实现
    • 加密很快,指数小
    • 解密比较慢,指数较大
    • 利用中国剩余定理 CRT:对 RSA 解密算法生成两个解密方程(利用 \(M = C^d \bmod R\)

      • 即:

        \[ \begin{aligned} M_1 = M \bmod p\\ M_2 = M \bmod q \end{aligned} \]
      • 解方程:

        \[ \begin{aligned} M = M_1 \bmod p\\ M = M_2 \bmod q \end{aligned} \]
      • 具有唯一解(利用 CRT):\(M = (q \cdot q' \cdot M_1 + p \cdot p' \cdot M_2) \bmod R\)

        • 其中 \(q \cdot q' \bmod p = 1 , p \cdot p' \bmod q = 1\)
        • 中国剩余定理

RABIN

  • 第一个可证安全的公钥加密方案
  • 基于模合数下求平方根的困难性,即二次剩余问题
  • 说明:
    • 二次剩余问题,给定一个奇合数 \(n\) 和整数 \(a\),判断 \(a\) 是否为 \(\bmod n\) 的平方剩余或二次剩余,即判断是否存在整数 \(x\) 使得 \(x^2 \equiv a \bmod n\)
    • \(n\) 的平方根问题(SQROOT),在 \(n\) 的分解未知的情况下,求模 \(n\) 的平方根,即求解同余式 \(x^2 \equiv a \bmod n\)
    • 在模 \(n = pq\) 的分解未知情况下,上述问题均为困难问题
  • 进一步说明:
    • RSA 的破译难度不超过大数分解
    • Rabin 的提出是对 RSA 的一种修正
    • 可以证明对它的破译等价于对 \(n\) 的分解
    • RSA 是选择加密密钥 \(e\) 满足 \(1 < e < \phi(n)\)\((e, \phi(n)) = 1\),Rabin 是取 \(e = 2\)

二次剩余的概念

  • \(QR_n\) 表示模 \(n\) 的二次剩余集合,\(QR_n \triangleq \{a \mid \exists x \in Z, x^2 \equiv a \bmod n\}\)
    • \(Z\) 表示整数集合
    • 即若存在 \(x \in Z\) 满足 \(x^2 \equiv a \bmod n\),则称 \(a \in QR_n\),表 \(a\) 为模 \(n\) 的二次剩余,否则 \(a \notin QR_n\) 或称 \(a\) 为非二次剩余。非二次剩余集合用 \(NQR_n\) 表示它。
  • 定理 1:假定 \(n = p_1 p_2\)\(p_1\)\(p_2\) 是不相同的素数,\(Z_n\) 中有 \((p_1−1)(p_2−1)/4\) 个元素属于 \(QR_n\),每个属于 \(QR_n\) 的元素有 \(4\) 个平方根。
  • 定理 2:若 \(\alpha\)\(\gamma\) 属于本质上不同的 \(\beta\) 的平方根, 且 \(\alpha\)\(\gamma\) 为小于 \(n/2\) 的正整数,\(\alpha\)\(\gamma\) 满足 \(x^2 \equiv \beta \bmod n\),则 \(\gcd(\alpha+\gamma,n)=p_1\), 或 \(\gcd(\alpha+\gamma,n)=p_2\), 其中必有一式成立。

RABIN 密钥生成

  • \(p\)\(q\) 是两个素数,在模 4 下与 3 同余(即 \(p \bmod 4 = q \bmod 4 = 3\)),计算 \(n=pq\)(这样的 \(n\) 称为 blum 整数)。
  • 公钥为 \(K=\{n\}\)
  • 私钥为 \(K^{-1}=\{p,q\}\)

RABIN 加解密算法

  • 加密:设 \(M\) 为待加密消息,计算密文

    \[ C=M^2 \bmod n, \quad 0 \leq M < n \]
  • 解密:计算

    \[ \begin{aligned} &\begin{cases} W_1 = C^{(p+1)/4} \bmod p \\ W_2 = p - C^{(p+1)/4} \bmod p \\ W_3 = C^{(q+1)/4} \bmod q \\ W_4 = q - C^{(q+1)/4} \bmod q \end{cases} \\ &\begin{cases} u = q \cdot (q^{-1} \bmod p) \\ v = p \cdot (p^{-1} \bmod q) \end{cases} \\ &\begin{cases} M_1 = (u \cdot W_1 + v \cdot W_3) \bmod n \\ M_2 = (u \cdot W_1 + v \cdot W_4) \bmod n \\ M_3 = (u \cdot W_2 + v \cdot W_3) \bmod n \\ M_4 = (u \cdot W_2 + v \cdot W_4) \bmod n \end{cases} \end{aligned} \]
    • 利用中国剩余定理,可以得到 \(4\) 个解 \(M_1, M_2, M_3, M_4\),其中必有一个与 \(M\) 相同,若 \(M\) 是文字消息则易于识别;若 \(M\) 是随机数字流,则无法确定哪一个 \(M_i\) 是正确的消息。
    • 定理:

RABIN 的安全性

  • 定理:设 \(n=pq\), \(p\)\(q\) 为 blum 整数,\(x^2 \equiv a \bmod n\) 有解,则求解该同余式等价于分解大整数 \(n\)
    • 证明:

      • 原同余式等价于

        \[ \begin{aligned} x^2 \equiv a \bmod p \\ x^2 \equiv a \bmod q \end{aligned} \]
      • 若能求出四个解 \(x_1, -x_1, x_2, -x_2\),且 \(x_1\)\(x_2\)\(n\) 不同余且为小于 \(n/2\) 的正整数,则由 \(x_1^2 \equiv a \bmod p\)\(x_2^2 \equiv a \bmod q\) 可得 \(x_1 \equiv x_2 \bmod n\),而 \(x_1 + x_2 < n\), 不可能为 \(n\) 的倍数,所以 \(x_1 - x_2\)\(x_1 + x_2\) 分别含有 \(n\) 的一个因子,也即

        \[ \begin{aligned} \gcd(x_1 - x_2, n)\\ \gcd(x_1 + x_2, n) \end{aligned} \]
      • 因此就相当于分解了整数 \(n\)

      • 反之,如果知道 \(n\) 的分解,则类似于解密过程可将同余式的四个解求出来
      • 等价于对 \(n\) 的因数分解
        • 选择密文攻击不安全
        • 对 Rabin 签名的选择密文攻击可以描述如下:攻击者首先随机选取整数 \(r\) ,并且计算 \(C = r^2 \bmod n\);如果攻击者能够成功骗取签名者对 \(m\) 进行签名,他将能够以 ½ 的概率从签名 \(s\)\(x\) 中破解 \(n\) 的分解。
        • 因为签名者不知道 \(x\),对 \(m\) 的签名 \(s\) 若不同于 \(x\),即 \(s \not\equiv x \bmod n\),则由定理 2 可从 \(\gcd(s+x,n)\) 得到 \(n\) 的素数因子 \(p_1\)\(p_2\)

RSA VS RABIN

  • 安全性
  • 加密
    • Rabin 仅一次乘法运算
  • 解密
    • Rabin 解密比 RSA 困难,解密过程要解一个求平方根的问题,当 \((p_1−1)/2\)\((p_2−1)/2\) 为奇数,要做两次幂运算,还要解中国剩余定理

ElGamal

  • Diffie-Hellman key distribution scheme 的变形
    • 能够用于安全交换密钥
    • 1985 年由 ElGamal 提出
    • 安全性是 基于求解离散对数问题的困难性
    • 缺点:增加了消息长度(2 倍)

ElGamal 密钥生成

  • 选取一个大素数 \(p\) 及生成元 \(g\)
  • 随机选取一个私钥 \(x\) 满足 \(0 < x < p-1\)
    • 计算公钥 \(y = g^{x} \bmod p\)
  • 公钥为 \(K = \{p, g, y\}\)
  • 私钥为 \(K^{-1} = \{x\}\)

ElGamal 加解密算法

  • 为加密 \(M\):

    • 发送者 选择随机数 \(k,0 < k < p−1\)\(k\) 需要永久保密或销毁
    • 计算消息密钥 \(K\)

      \[ K = y^k \bmod p \]
    • 计算密文对:\(C = \{C_1,C_2\}\),并发送到接收者

      \[ \begin{aligned} C_1 &= g^k \bmod p\\ C_2 &= KM \bmod p \end{aligned} \]
  • 为解密 \(C = \{C_1,C_2\}\):

    • 接收者 首先计算 \(K\)

      \[ K = C_1^{x} \bmod p = g^{(k\cdot x)} \bmod p = y^k \bmod p \]
    • 然后利用费马小定理计算 \(K^{-1}\):

      \[ K^{-1} = K^{p-2} \bmod p \]
    • 计算明文 \(M\):

      \[ M = C_2\cdot K^{-1} \bmod p \]
  • 示例:

    • 选择 \(p=97\) 以及生成元 \(g=5\)
    • 接收者 Bob:
      • 选择私钥 \(x_B=58\)
      • 计算并发布公钥 \(y_B=5^{58} \bmod 97 = 44\)
    • Alice 要加密 \(M=3\)

      • 首先得到 Bob 的公开密钥 \(y_B=44\)
      • 选择随机 \(k=36\) 计算: \(K=44^{36} \bmod 97 = 75\)
      • 计算密文对:

        \[ \begin{aligned} C_1 &= g^k \bmod p = 5^{36} \bmod 97 = 50\\ C_2 &= K\cdot M \bmod p = 75\cdot 3 \bmod 97 = 31 \end{aligned} \]
      • 发送 \(\{50,31\}\) 给 Bob

        • Bob 接收密文 \(\{50,31\}\)
      • 恢复 \(K=50^{58} \bmod 97 = 75\)
      • 计算 \(K^{-1} = 22 \bmod 97\)
      • 恢复明文 \(M = (31\cdot 22) \bmod 97 = 3\)

ECC

  • 椭圆曲线密码体制(Elliptic Curve Cryptography,ECC)
    • 于 1985 年,由 Neal Koblitz 和 Victor Miller 分别独立提出
    • 数学难题:基于椭圆曲线的离散对数难题
    • ECC 算法所需的密钥长度远比 RSA 算法低
    • 有研究指出,ECC 算法 160-bit 密钥长度所提供的安全性,与 RSA 算法 1024-bit 密钥所提供的安全性相当

椭圆曲线的概念

  • 椭圆曲线(Elliptic Curve)
    • 由于连续的椭圆曲线,并不适合进行加解密操作,因此考虑将其定义在有限域上
    • 域的定义:
      • 可以在其上进行加、减、乘、除运算,而结果不会超出其范围的集合
      • 有理数域、实数域、复数域,但整数集合不是
    • 有限域的定义:
      • \(F\) 只包含有限个元素。有限域中元素的个数称为阶
      • 每个有限域的阶必为素数的幂,即有限域的阶可表示为 \(p^n\)
      • 该有限域通常称为 Galois 域,记为 \(GF(p^n)\)
  • 通信双方(A 和 B)共享一套公开的椭圆曲线参数,包括曲线方程(如 \(y^2 = x^3 + ax + b\))、一个公开基点 \(G\),以及 \(G\) 的阶 \(p\)(最小正整数 \(n\) 满足 \(nG=O\)\(O\) 为无穷远点)
  • 椭圆曲线的核心数学基础:
    • 在有限域上的椭圆曲线定义“点加”和“点乘”
    • 点乘是核心——即一个整数(私钥)与曲线上一个固定点(基点 G)进行多次点加,得到曲线上另一个点(公钥)。该过程“正向易、反向难”,是安全性的根本
  • 椭圆曲线(Elliptic Curve)

    • 椭圆曲线方程计算公式

      \[ y^2 \equiv x^3 + ax + b \bmod p \]
    • 椭圆曲线上的点加法

      • \(P(x_1,y_1)\)\(Q(x_2,y_2)\) 是椭圆曲线 \(E\) 上的两个点,定义点加运算 \(R = P + Q\) 如下:
        • \(P \neq Q\),则连接 \(P\)\(Q\) 的直线与曲线 \(E\) 相交于第三个点 \(R^\prime\),则 \(R\)\(R^\prime\) 关于 \(x\) 轴的对称点
        • \(P = Q\),则过点 \(P\) 的切线与曲线 \(E\) 相交于另一个点 \(R^\prime\),则 \(R\)\(R^\prime\) 关于 \(x\) 轴的对称点
      • 数学表达:设 \(P = (x_1, y_1)\)\(Q = (x_2, y_2)\),则

        • \(x_1 = x_2\) 且 $y_1 = -y_2 $,则 \(P + Q = O\)(无穷远点),记 \(P=-Q\)
        • 否则,设 \(R = P + Q = (x_3, y_3)\),则

          \[ \begin{aligned} &x_3 = \lambda^2 - x_1 - x_2 \bmod p \\ &y_3 = \lambda(x_1 - x_3) - y_1 \bmod p \\ &\lambda = \begin{cases} \frac{y_2 - y_1}{x_2 - x_1} \bmod p, & x_1 \neq x_2 \\ \frac{3x_1^2 + a}{2y_1} \bmod p, & x_1 = x_2, y_1 \neq 0 \\ \end{cases} \end{aligned} \]
      • 点加法满足交换律和结合律

        • 椭圆曲线上的点乘法
      • \(P\) 是椭圆曲线 \(E\) 上的一个点,\(k\) 是一个整数,定义点乘运算 \(Q = kP\) 如下:
        • \(k = 0\),则 \(Q\) 是无穷远点 \(O\)
        • \(k > 0\),则 \(Q\) 是将点 \(P\) 自身加 \(k\) 次的结果,即在 \(P\) 点作切线交于曲线并取关于 \(x\) 轴对称点 \(P_1\),重复 \(k\) 次得到 \(Q = P_k\)
        • \(k < 0\),则 \(Q\) 是将点 \(-P\) 自身加 \(|k|\) 次的结果,即取 \(P\) 关于 \(x\) 轴的对称点 \(-P\),重复 \(|k|\) 次得到 \(Q = P_{|k|}\)
      • 点乘法满足分配律和结合律

ECC 密钥生成

  1. 公开参数
    • 选取定义在有限域 \(GF(p)\) 上的椭圆曲线 \(E_p(a,b): y^2=x^3+ax+b\)
    • 选取椭圆曲线上一点作为基点 \(G(x_G,y_G)\)(公开固定点,类似 DH 中的 \(g\)
    • 有限域的模值 \(p\) (类似 DH 中的大质数 \(p\)
  2. 公私钥生成
    • 选定一个大数 \(x\) 作为私钥
    • 生成公钥 \(Q=xG\) (类似 DH 中的 \(y=g^x\)
    • 公钥为 \(K = \{p, G, Q\}\)
    • 私钥为 \(K^{-1} = \{x\}\)

ECC 加解密算法

  • 加密

    • 选取一个随机数 \(k\)\(1 < k < p-1\)
    • 对于要加密的明文 \(M\),分别计算:

      \[ \begin{aligned} R &= kG \\ K &= kQ \\ S &= M + K \end{aligned} \]
    • 生成密文 \(C=(R, S)\)

    • 解密
    • 接收密文 \(C=(R, S)\)
    • 计算:

      \[ \begin{aligned} T &= xR ~(= x(kG) = k(xG) = kQ = K) \\ M &= S - T ~(= S - K = M) \end{aligned} \]

ECC VS RSA

  • 与 RSA 相比,ECC 在许多方面都有优势:
  • 抗攻击性强。相同的密钥长度,其抗攻击性要比 RSA 强很多倍。
  • 计算量小,处理速度快。ECC 总的速度比 RSA 要快。
  • 存储空间占用小。

ECC 的应用

  • ECC 的签名算法:ECDSA
  • ECC 与 DH 算法的结合:ECDH、ECDHE
  • 增强的密钥交换算法:ECMQV
  • 国密标准公钥加密算法:SM2

ECDSA

  • 基于 ECC 的签名算法:ECDSA(Elliptic Curve Digital Signature Alg)
    • 不同于 ECC,ECDSA 主要目的是确保消息 M 不被篡改和伪装
    • ECDSA 不对消息 M 进行加密,因此无法保证其机密性
    • ECDSA 的密钥生成过程与 ECC 相同
    • 基础思路:使用私钥进行签名,使用公钥进行验签
  • ECDSA 签名与验签算法
    • 使用椭圆曲线参数 \(E_p(a,b): y^2=x^3+ax+b\),基点 \(G\),以及私钥 \(x\) 和公钥 \(Q=xG\)
    • 签名算法
      1. 计算消息摘要 \(h=H(M)\)
      2. 计算签名 \(s=xh\)
      3. 输出消息签名对 \((M,s)\)
    • 验签算法
      1. 计算消息摘要 \(h=H(M)\)
      2. 计算 \(sG\)\(hQ\)
      3. \(sG = hQ\),则签名有效;否则签名无效

ECDH 与 ECDHE

  • 基于 ECC 的密钥分配(交换)算法:
    • ECDH:Elliptic Curve Diffie-Hellman
    • ECDHE:Elliptic Curve Diffie-Hellman Ephemeral
  • 与传统 D-H 方案相同,该方案不能用于交换任意信息
    • 传统 D-H 方案基于有限域上的离散对数计算困难问题
    • ECDH、ECDHE 基于有限域上椭圆曲线离散对数计算困难问题
  • ECDH 密钥交换算法

    1. 双方公开椭圆曲线参数 \(E_p(a,b): y^2=x^3+ax+b\),基点 \(G\)
    2. 双方生成各自的公私钥对 \((x_A, Q_A=x_AG)\)\((x_B, Q_B=x_BG)\)
    3. 双方交换公钥 \(Q_A\)\(Q_B\)
    4. 双方分别计算共享密钥:

      \[ \begin{aligned} K_A &= x_A Q_B = x_A (x_B G) \\ K_B &= x_B Q_A = x_B (x_A G) \\ K_A &= K_B \end{aligned} \]
  • ECDHE 密钥交换算法

    • 与 ECDH 相同,但每次会话使用不同的临时密钥对 \((x_A^\prime, Q_A^\prime=x_A^\prime G)\)\((x_B^\prime, Q_B^\prime=x_B^\prime G)\)
    • 提供 前向保密性:即使服务器存储的长期私钥泄露,也不会影响历史通信的安全
  • ECDH、ECDHE、DH、DHE 的比较
    • ECDH 无法提供前向安全性,ECDHE 则解决了这一缺点
    • ECDHE 由于生成了多轮密钥,因此需要服务器提供密钥管理功能
    • DH 也可以提供类似的算法 DHE
    • DHE 由于密钥长度、需要大量乘法运算等原因,性能很差
  • ECDHE 由于其良好的运算性能及安全性,目前在工业界广泛应用
    • TLS 1.2+
    • WPA3 SAE(Simultaneous Authentication of Equals) 对等实体同时验证

ECMQV

  • 基于 ECC 的增强型密钥交换算法:ECMQV(Elliptic Curve Menezes-Qu-Vanstone)
  • 引入可信中心,获取通信双方的公钥 \(Q_a, Q_b\) 及私钥 \(k_a, k_b\) 分别为 Alice 和 Bob 的私钥
  • ECMQV 密钥交换算法

    1. 选择椭圆曲线参数 \(E_p(a,b): y^2=x^3+ax+b\),基点 \(G\)
    2. Alice 选择随机数 \(r_a\),计算临时公钥 \(R_a = r_a G\),并发送给 Bob,计算 \(R_a\)\(x\) 坐标 \(\overline{R_a}\)
    3. Bob 选择随机数 \(r_b\),计算临时公钥 \(R_b = r_b G\),并发送给 Alice,计算 \(R_b\)\(x\) 坐标 \(\overline{R_b}\)
    4. Alice 验证 \(R_b\),计算其 \(x\) 坐标 \(\overline{R_b}\),计算共享密钥:

      \[ \begin{aligned} &s_a = r_a + \overline{R_b} k_a \bmod p \\ &K_{a,b} = s_a (Q_b + \overline{R_b} R_b) \end{aligned} \]
    5. Bob 验证 \(R_a\),计算其 \(x\) 坐标 \(\overline{R_a}\),计算共享密钥:

      \[ \begin{aligned} &s_b = r_b + \overline{R_a} k_b \bmod p \\ &K_{b,a} = s_b (Q_a + \overline{R_a} R_a) \end{aligned} \]
    6. 由于 \(K_{a,b} = K_{b,a}\),因此 Alice 和 Bob 获得相同的共享密钥

    7. ECMQV 算法的分析
    8. 与 DH 密钥交换协议的共享密钥为 \(r_A,r_B,p\) 不同,ECMQV 共享的信息包括了一个重要结构 \((\overline{R_a} k_a, \overline{R_b} k_b, P)\),这是一个既利用了随机数 \(r_A, r_B\),也使用了通信双方的公钥计算出来的结构
    9. \(s_b=(r_b+\overline{R_b} k_b) \bmod p\) 可以看作 Bob 对 \(R_b\) 的“隐式签名”。“签名”是因为只有 Bob 可以计算这个值;“隐式”是因为 Alice 在计算共享秘密的时候可以利用 \(s_b P=R_b+\overline{R_b} Q_b\) 间接验证其正确性
    10. ECMQV 算法的优势与不足
    11. 优势
      • 使用双重公钥,可以防止中间人攻击
      • 隐式签名的方式,避免产生额外开销(引入 CA 等)
    12. 不足
      • 计算过程复杂,运算量大
    13. ECMQV 算法的应用
    14. ANSI X9.63、IEEE 1363-2000、ISO/IEC 15946-3 等

SM2

  • SM2 算法是中国国家密码管理局(CNCA)发布的一种基于椭圆曲线的非对称加密算法,包含密钥交换、数字签名和公钥加密等功能具体为:
    • SM2-1 椭圆曲线数字签名算法
    • SM2-2 椭圆曲线密钥交换协议
    • SM2-3 椭圆曲线公钥加密算法

SM2 密钥生成

  1. 公开参数
    • 选取定义在有限域 \(GF(p)\) 上的椭圆曲线 \(E_p(a,b): y^2=x^3+ax+b\)
    • 选取椭圆曲线上一点作为基点 \(G\)
    • 有限域的模值 \(p\)
  2. 计算公私钥对
    • 选定一个大数 \(k\) 作为私钥
    • 生成公钥 \(Q=kG\)
    • 公钥为 \(K = \{Q\}\),私钥为 \(K^{-1} = \{k\}\)

SM2 加解密算法

  • 加密
    1. 选取随机数 \(r\)\(1 < r < p-1\)
    2. 计算点 \(C_1 = rG\)
    3. 计算点 \(S = rQ = (x_S, y_S)\)
    4. 计算密钥 \(t = KDF(x_S \parallel y_S, klen(M))\)
      • 其中 \(KDF\) 是密钥派生函数,\(klen(M)\) 是明文 \(M\) 的比特长度
    5. 计算密文 \(C_2 = M \oplus t\)
    6. 计算 \(C_3 = Hash(x_S \parallel M \parallel y_S)\)
    7. 生成密文 \(C = (C_1, C_2, C_3)\)
  • 解密
    1. 计算点 \(S = C_1 \cdot k^{-1}\)
    2. 计算密钥 \(t = KDF(x_S \parallel y_S, klen(C_2))\)
    3. 计算明文 \(M = C_2 \oplus t\)
    4. 验证 \(C_3 = Hash(x_S \parallel M \parallel y_S)\)

SM2 VS ECC

  • 在加密过程中,引入了多个校验点
  • 引入密钥派生函数(KDF),增强了 SM2 算法随机性,提高破解强度
  • 引入哈希函数(如 SM3),加入了对传递消息完整性校验的特性
  • 加密运算是异或操作,运算速度快
  • 密文长度有所扩张,对于计算带宽要求更高

公钥密码现状

  • 已知的安全算法是有限域上指数运算素数域 \(GF(p)\) 上的整数运算
    • 多项式运算 \(GF(2^n)\)
    • 椭圆曲线上的运算
    • 基于其它困难问题的体制
    • NTRU
  • 实际应用
    • 实现速度较慢
      • 通常用于交换对称算法的加密密钥
      • 数字签名算法

简单攻击方法(弱参数攻击,以 RSA 为例)

共模攻击

  • 当多个用户使用相同的模数 \(n\),使用不同的公钥指数 \(e\) 对同一明文 \(x\) 进行加密时,攻击者可通过共模攻击还原出明文 \(x\)
  • 攻击条件
    1. 使用相同的模数 \(n\)
    2. 对同一明文 \(x\) 加密
    3. 各公钥指数 \(e_1,e_2,\cdots,e_k\) 之间两两互质
  • 攻击原理(以两个用户为例)

    1. \(e_1\)\(e_2\) 是两个互素的不同密钥,共用模为 \(n\),对同一消息 \(x\) 加密得

      \[ \begin{aligned} y_1 &= x^{e_1} \bmod n \\ y_2 &= x^{e_2} \bmod n \end{aligned} \]
    2. 攻击者已知 \(n,y_1,y_2,e_1,e_2\),由于 \(\gcd(e_1,e_2)=1\),所以存在整数 \(a,b\) 使得 \(e_1a+e_2b=1\)

    3. 计算明文:

      \[ \begin{aligned} x &= (y_1^a \cdot y_2^b) \bmod n \\ &= (x^{e_1})^a \cdot (x^{e_2})^b \bmod n \\ &= x^{e_1a + e_2b} \bmod n \\ &= x^1 \bmod n \\ &= x \end{aligned} \]
  • 为对抗该攻击,建议每个用户使用不同的模数 \(n\)

低加密指数攻击

  • 当公钥指数 \(e\) 取过小值(如 \(e=3\)\(e=17\))时,若同一明文被多次加密(或加密后数据满足特定条件),攻击者可通过数学运算直接还原明文,无需破解私钥。
  • 攻击条件
    1. 公钥指数 \(e\) 取较小值,典型值为 \(e=3\)\(17\)
    2. 同一明文 \(x\) 被不同的模数 \(n_1,n_2,\cdots,n_k\) 多次加密
  • 攻击原理(以 \(e=3\) 为例)

    1. 设有三个用户,公钥分别为 \((e=3,n_1)\)\((e=3,n_2)\)\((e=3,n_3)\),对同一消息 \(x\) 加密得密文

      \[ \begin{aligned} y_1 &= x^3 \bmod n_1 \\ y_2 &= x^3 \bmod n_2 \\ y_3 &= x^3 \bmod n_3 \end{aligned} \]
    2. 攻击者已知 \(n_1,n_2,n_3,y_1,y_2,y_3\),可利用中国剩余定理求解以下同余方程组

      \[ \begin{aligned} X &\equiv y_1 \bmod n_1 \\ X &\equiv y_2 \bmod n_2 \\ X &\equiv y_3 \bmod n_3 \end{aligned} \]

      \(n_1,n_2,n_3\) 互素,则该方程组有唯一解 \(X\) 满足 \(0 \leq X < N\),其中 \(N = n_1 n_2 n_3\)

    3. 计算明文:

      \[ x = \sqrt[3]{X} \]
  • 为对抗该攻击,建议公钥指数 \(e\) 取较大值(如 \(e=2^{16}+1=65537\)),或在加密前对明文进行填充处理(如使用 OAEP 填充方案)。

  • \(e < n\)\(d < n/4\) 时,同样可以攻破这类 RSA 系统