DH

6/29/2023 crypto

# 离散对数难题

DH 密钥交换算法的安全性依赖于离散对数求解的困难

全称 Discrete Logarithm Problem,简称 DLP

# 前置知识

# 原根

  1. 定义

    nan、a 为正整数,且 nan、a 互质,令 ad1(modn)a^{d} ≡ 1 (mod n),可知,使该式成立的 dd 的取值可能多个,又由欧拉定理可知 dd 中的一个取值一定为 φ(n)\varphi (n) ,只不过此时并不确定 φ(n)\varphi (n) 是否是 dd 中所有取值中最小的那个。重点来了,如果此时所有 dd 的可能取值中 φ(n)\varphi (n) 恰好是最小的,那么就称 aa 为模 nn 的原根

    还有一个问题:当 nn 为何值时,才会存在原根呢?因为并不是所有的素数都是有原根的

    答:只有当 n=124pe2pen=1、2、4、p^{e}、2p^{e} 时才会存在原根,其中 pp 为奇素数, ee 为正整数

    重新看下下面对原根的定义:

    一个素数 qq 的原根,为其各次幂能够产生从 11q1q−1 所有整数

    也就是说,如果 aa 是素数 qq 的一个原根,那么数值 amodq,a2modq,...,aq1modqa mod q, a^{2} mod q, ..., a^{q-1} mod q 是各不相同的整数,并且以某种排列方式组成了从 11q1q-1 的所有整数。

  2. 应用

    题目:已知若 aann 互质,并且 aann 的原根,求满足该式 ax1(modn)a^{x} \equiv 1 ( mod n )xx 的最小值 ?

    答案:根据欧拉定理,若 aann 互质,则 aφ(n)1(modn)a^{\varphi (n)} \equiv 1 ( mod n ),又因为 aann 的原根,所以 xx 的最小值一定为 φ(n)\varphi (n),即 x=φ(n)x = \varphi (n)

# 离散对数

  1. 定义

    对于一个整数 bb 和素数 qq 的一个原根 aa,可以找到惟一的指数 ii,使得 b=aimodqb=a^{i} mod q,其中 0i(q1)0≤i≤(q−1) ,指数 ii 称为 bb 的以 aa 为基数的模 qq 的离散对数,该值被记为 inda,q(b)ind_{a, q}(b)

    也就是说,已知 baqb、a、q,要想求其对应的离散对数 ii ,几乎是不可能的,尤其是在素数 qq 值很大的情况下

  2. 应用

    公钥密码学

注意

原根离散对数这两个概念即可以从数论的角度来理解,也可以从抽象代数之群论的角度来理解

# 模运算

  1. 定义

    “模”是“Mod”的音译,意为求余 给定一个正整数 pp,任意一个整数 nn,一定存在等式 n=kp+rn=kp+r 其中 krk、r 是整数,且 0r<p0 \leqslant r<p,称 kknn 除以 pp 的商, rrnn 除以 pp 的余数

    取模运算: a%pa \% p (或 amodpa mod p),表示 aa 除以 pp 的余数

  2. 性质

    1. (a+b)modp=(amodp+bmodp)modp(a + b) mod p = (a mod p + b mod p) mod p

    2. (ab)modp=(amodpbmodp)modp(a - b) mod p = (a mod p - b mod p) mod p

    3. (ab)modp=(amodpbmodp)modp(a * b) mod p = (a mod p * b mod p) mod p

      • (ab)modp=((amodp)b)modp\color{#f40} (a^b) mod p = ((a mod p)^b) mod p

    其中第三条性质很重要,对于后面 DH 算法的证明很关键

# DH 算法

# 步骤

  1. 第一步:选取两个全局公开的参数,一个素数 qq 和一个整数 aa,其中 aaqq 的一个原根

  2. 第二步:用户 A 生成私钥和公钥,私钥保密,公钥公开

    1. 私钥:SAS_{A},它是一个随机数,并且满足 SA<qS_{A}<q

    2. 公钥:PA=aSAmodqP_{A}=a^{S_{A}} mod q,其中 SAS_{A} 称为 PAP_{A} 的以 aa 为基数的模 qq 的离散对数

  3. 第三步:用户 B 生成私钥和公钥,私钥保密,公钥公开

    1. 私钥:SBS_{B},它是一个随机数,并且满足 SB<qS_{B}<q

    2. 公钥 :PB=aSBmodqP_{B}=a^{S_{B}} mod q,其中 SBS_{B} 称为 PBP_{B} 的以 aa 为基数的模 qq 的离散对数

  4. 第四步:用户 A 生成共享秘密密钥

    KA=(PBSA)modqK_{A}=(P_{B}^{S_{A}}) mod q
  5. 第五步:用户 B 生成共享秘密密钥

    KB=(PASB)modqK_{B}=(P_{A}^{S_{B}}) mod q

至此,用户 A 和用户 B 都生成了一个共享秘密密钥 KAK_{A}KBK_{B},并且它们是相等的,WHY?

# 证明

如何证明共享秘密密钥 KAK_{A}KBK_{B} 相等呢?

已知

KA=(PBSA)modqK_{A}=(P_{B}^{S_{A}}) mod q

因为

PB=aSBmodqP_{B}=a^{S_{B}} mod q

所以

KA=((aSBmodq)SA)modqK_{A}=((a^{S_{B}} mod q)^{S_{A}}) mod q

又因为模运算的第三条性质

(ab)modp=((amodp)b)modp\color{#f40} (a^b) mod p = ((a mod p)^b) mod p

所以

KA=(aSB)SAmodq=(aSA)SBmodq=(aSAmodq)SBmodqK_{A}=  (a^{S_{B}})^{S_{A}} mod q =  (a^{S_{A}})^{S_{B}} mod q = (a^{S_{A}} mod q)^{S_{B}} mod q

又因为

PA=aSAmodqP_{A}=a^{S_{A}} mod q

所以

KA=(PA)SBmodq=(PASB)modqK_{A} = (P_{A})^{S_{B}} mod q = (P_{A}^{S_{B}}) mod q

又因为

KB=(PASB)modqK_{B}=(P_{A}^{S_{B}}) mod q

所以

KA=KBK_{A} = K_{B}

为什么很难破解共享秘密密钥 KAK_{A}

攻击者可以获得的数据有 qaPAPBq、a、P_{A}、P_{B}

要想由这些数据获取共享秘密密钥 KA=(PBSA)modqK_{A}=(P_{B}^{S_{A}}) mod q,就必须再知道 SAS_{A}

又因为 SAS_{A}PAP_{A} 的以 aa 为基数的模 qq 的离散对数

qq 值很大时,离散对数 SAS_{A} 几乎不可求,这就是离散对数难解之题

所以攻击者很难破解共享秘密密钥 KAK_{A}

同理,KBK_{B} 也很难破解

# ElGamal 算法

ElGamal 加密算法是基于 DH 密钥交换算法的非对称加密算法,其原理如下

  1. 密钥生成过程

    选择一个素数 pp 以及两个小于 pp 的随机数 ggxx,计算

    y=gxmodpy = g^{x} mod p

    其中公钥 (y,g,p)(y,g,p) ,私钥 xx

    由离散对数的定义可知,xx也称为 ygpy、g、p 的离散对数

    因此,当素数 pp 很大时,由公钥 (y,g,p)(y,g,p) 推导出私钥 xx 是极其困难的事

  2. 加密过程,使用公钥 (y,g,p)(y,g,p)

    对于明文信息 MM,随机选择一个与 p1p-1 互素的整数 kk,计算

    C1=gkmodpC_{1} = g^{k} mod p
    C2=ykMmodpC_{2} = y^{k} M mod p

    密文为 C=(C1,C2)C=(C_{1},C_{2})

  3. 解密过程,使用私钥 xx

    M=C2C1xmodpM = \frac{C_{2}}{C_{1}^{x}} mod p

因为

C2C1xmodp=ykMmodpgkxmodpmodp=ykMgkxmodp=ykMykmodp=Mmodp\frac{C_{2}}{C_{1}^{x}} mod p = \frac{y^{k} M mod p}{g^{kx} mod p} mod p =  \frac{y^{k} M }{g^{kx}} mod p =  \frac{y^{k} M }{y^{k}} mod p =  M mod p

# 参考资料

Last Updated: 7/14/2023, 4:58:23 PM