RSA

6/25/2023 crypto

# 质数分解难题

RSA 算法的安全性依赖于大整数进行质因数分解的困难

# 前置知识

# 质数

  1. 定义

    质数也称素数,它是指只能被 11 和本身整除的自然数

  2. 互质

    若两个数的最大公因数(或最大公约数)是 11,则称这两个数互质

# 同余式

这个概念很重要,对后面的 RSA 算法正确性的证明及其关键

  1. 定义

    若两个数 aba、b 同时除以某一个数 mm 的余数相同,则称这两个数 aba、b 对某一个数 mm 同余,记为 ab(modm)a \equiv b (mod m),比如

    23÷7=3223÷7=3 \dots 2

    65÷7=9265÷7=9 \dots 2

    2323656577 同余,记做 2365(mod7)23 \equiv 65 (mod 7)

  2. 性质

    1. 同余式可以互相加:若 abmodma ≡ b(mod m)cdmodmc ≡ d(mod m),则 a+cb+dmodma+c ≡ b+d(mod m)

    2. 同余式可以互相乘:若 abmodma ≡ b(mod m)cdmodmc ≡ d(mod m),则 acbdmodma*c ≡ b*d(mod m)

# 欧拉函数

  1. 定义

    记欧拉函数 φ(n)\varphi (n)φ(n)\varphi (n) 表示为小于 nn 的正整数中与 nn 互质的数的数目

  2. 如果 nn 能写作两个不同质数 p1p_{1}p2p_{2} 的乘积,即 n=p1×p2n=p_{1} \times p_{2},则 φ(n)=(p11)×(p21)\varphi(n) =(p_{1} - 1) \times (p_{2} - 1)

    因为 φ(n)=φ(p1×p2)=φ(p1)×φ(p2)=(p11)×(p21)\varphi(n) = \varphi(p_{1} \times p_{2}) = \varphi(p_{1}) \times \varphi(p_{2}) = (p_{1} - 1) \times (p_{2} - 1)

# 欧拉定理

aann 互质,则 aφ(n)1(modn)a^{\varphi (n)} \equiv 1 ( mod n )

# 乘法逆元

如果 ab1modmab ≡ 1(mod m),则称 aabb 为关于 mm 互为乘法逆元

已知 aabb 的方法:因为 ab1modmab ≡ 1(mod m),所以不妨设 ab=mk+1ab=mk+1,其中 aamm 为已知数

利用 扩展欧几里得 算法,可以在多项式时间内,计算出来一个乘法逆元 bb,当然 kk 也是能求出来的,只不过此处的 kk 没啥用

此处利用 扩展欧几里得算法 的前提是 aamm 互素

# RSA 算法

# 步骤

  1. 第一步:随机生成两个大质数 p1p_{1}p2p_{2}

  2. 第二步:计算 n=p1×p2n = p_{1} \times p_{2}

  3. 第三步:计算欧拉函数 φ(n)=(p11)×(p21)\varphi (n) = (p_{1} - 1) \times (p_{2} - 1)

  4. 第四步:构造一个比 11 大、比 φ(n)\varphi (n) 小、不等于 p1p_{1}p2p_{2} 的整数 ee

  5. 第五步:求出 ee 对于 φ(n)\varphi (n) 的乘法逆元 dd,也就是说 ed1modφ(n)ed \equiv 1(mod  \varphi(n)),也就是说 ed=kφ(n)+1ed=k\varphi (n)+1

至此,公钥和私钥生成完毕,其中

公钥: (n,e)(n, e)

私钥: (n,d)(n, d)

对于一个明文数据 mm,其中 mmnn 是互质的,并且 mm 小于 nn

可以利用公钥 (n,e)(n, e) 加密 mm 为密文 cc,具体加密算法如下

cme(modn)\mathbf{\color{#f40} c \equiv m^{e} (mod n)}

对于密文数据 cc,可以利用私钥 (n,d)(n, d) 解密 cc 为明文 aa,具体解密算法如下

mcd(modn)\mathbf{\color{#008c8c} m \equiv c^{d} (mod n)}

# 证明

如何由 cme(modn)c \equiv m^{e} (mod n),推导出 mcd(modn)\color{orage} m \equiv c^{d} (mod n) ?其中 cc 为密文数据, mm 为明文数据

以下的证明是基于明文数据 mmnn 是互素的情况

mmnn 不是互素的话,结果也是一样的

由于 mmnn 互素,根据欧拉定理可知 aφ(n)1(modn)a^{\varphi (n)} \equiv 1 ( mod n ),所以

mφ(n)1(modn)mφ(n)1(modn)mφ(n)1(modn)}k\left.\begin{matrix} m^{\varphi (n)} \equiv 1 ( mod n ) \\ m^{\varphi (n)} \equiv 1 ( mod n ) \\ \dots \\ m^{\varphi (n)} \equiv 1 ( mod n ) \end{matrix}\right\} k 个

由同余式的性质之互相乘可知

mkφ(n)1(modn) m^{k\varphi (n)} \equiv 1 ( mod n )

又因为

mm(modn) m \equiv m (mod n)

所以

mkφ(n)1(modn)mm(modn)}2\left.\begin{matrix} m^{k\varphi (n)} \equiv 1 ( mod n) \\ m \equiv m (mod n) \end{matrix}\right\} 2个

由同余式的性质之互相乘可知

mkφ(n)+1m(modn) m^{k\varphi (n) + 1} \equiv m ( mod n )

又因为

ed=kφ(n)+1ed=k\varphi (n)+1

所以

medm(modn)1m^{ed} \equiv m ( mod n ) \color{#f40} \quad(1)

所以,若

cme(modn)c \equiv m^{e} (mod n)

所以

cme(modn)cme(modn)...cme(modn)}d 个\left.\begin{matrix} c \equiv m^{e} (mod n) \\ c \equiv m^{e} (mod n) \\ ... \\ c \equiv m^{e} (mod n) \end{matrix}\right\} d 个

由同余式的性质之互相乘可知

cdmed(modn)2 c^{d} \equiv m^{ed} (mod n) \color{#f40} \quad(2)

所以,由 (1)\color{#f40} (1)(2)\color{#f40} (2) 式可知 aacdc^{d}nn 的结果是一样的,即

mcd(modn)\mathbf{\color{#008c8c} m \equiv c^{d} (mod n)}

为何 dd 很难破解?

攻击者可以获得的数据有密文数据 cc 和公钥 (n,e)(n,e)

又因为

mcd(modn)\color{orage} m \equiv c^{d} (mod n)

要想根据密文数据 cc 获得明文数据 mm,就必须再知道私钥 (n,d)(n,d) 中的 dd

由于

ed=kφ(n)+1ed=k\varphi (n)+1

所以只要知道 φ(n)\varphi (n),就能求出 dd

又因为

φ(n)=(p11)(p21)\varphi (n) = (p_{1}-1)(p_{2}-1)

所以只要知道 p1 和 p2p_{1} 和 p_{2} 就能求出 φ(n)\varphi (n) 继而求出 dd

又因为

n=p1×p2n = p_{1} \times p_{2}

所以只要通过 nn 求得 p1 和 p2p_{1} 和 p_{2} 即可求出 dd

但是因为 nn 太大了,而分解质因数需要指数时间,所以没有人能够将 nn 质因数分解求出 p1p_{1}p2p_{2}

这种将大整数进行质因数分解的问题就称为质数分解难题

所以理论上任何人都不能推导出私钥 dd

RSA 的安全性条件

  1. pq|p-q| 要大

  2. p1p-1q1q-1 都应有大素因子

# 代码实现(TODO)

可参考 KeyPairGenerator (Java SE 11 & JDK 11 ) (opens new window) API 及其源码

# 参考资料

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