质数分解难题
RSA 算法的安全性依赖于大整数进行质因数分解的困难
前置知识
质数
定义
质数也称素数,它是指只能被 1 和本身整除的自然数
互质
若两个数的最大公因数(或最大公约数)是 1,则称这两个数互质
同余式
这个概念很重要,对后面的 RSA 算法正确性的证明及其关键
定义
若两个数 a、b 同时除以某一个数 m 的余数相同,则称这两个数 a、b 对某一个数 m 同余,记为 a≡b(modm),比如
23÷7=3…2
65÷7=9…2
则 23 和 65 对 7 同余,记做 23≡65(mod7)
性质
同余式可以互相加:若 a≡b(modm)、 c≡d(modm),则 a+c≡b+d(modm)
同余式可以互相乘:若 a≡b(modm)、 c≡d(modm),则 a∗c≡b∗d(modm)
欧拉函数
定义
记欧拉函数 φ(n),φ(n) 表示为小于 n 的正整数中与 n 互质的数的数目
如果 n 能写作两个不同质数 p1 与 p2 的乘积,即 n=p1×p2,则 φ(n)=(p1−1)×(p2−1)
因为 φ(n)=φ(p1×p2)=φ(p1)×φ(p2)=(p1−1)×(p2−1)
欧拉定理
若 a 与 n 互质,则 aφ(n)≡1(modn)
乘法逆元
如果 ab≡1(modm),则称 a 和 b 为关于 m 互为乘法逆元
已知 a 求 b 的方法:因为 ab≡1(modm),所以不妨设 ab=mk+1,其中 a 和 m 为已知数
利用 扩展欧几里得 算法,可以在多项式时间内,计算出来一个乘法逆元 b,当然 k 也是能求出来的,只不过此处的 k 没啥用
此处利用 扩展欧几里得算法 的前提是 a 与 m 互素
RSA 算法
步骤
第一步:随机生成两个大质数 p1 和 p2
第二步:计算 n=p1×p2
第三步:计算欧拉函数 φ(n)=(p1−1)×(p2−1)
第四步:构造一个比 1 大、比 φ(n) 小、不等于 p1 或 p2 的整数 e
第五步:求出 e 对于 φ(n) 的乘法逆元 d,也就是说 ed≡1(modφ(n)),也就是说 ed=kφ(n)+1
至此,公钥和私钥生成完毕,其中
公钥: (n,e)
私钥: (n,d)
对于一个明文数据 m,其中 m 与 n 是互质的,并且 m 小于 n
可以利用公钥 (n,e) 加密 m 为密文 c,具体加密算法如下
c≡me(modn)对于密文数据 c,可以利用私钥 (n,d) 解密 c 为明文 a,具体解密算法如下
m≡cd(modn) 证明
如何由 c≡me(modn),推导出 m≡cd(modn) ?其中 c 为密文数据, m 为明文数据
以下的证明是基于明文数据 m 与 n 是互素的情况
当 m 与 n 不是互素的话,结果也是一样的
由于 m 与 n 互素,根据欧拉定理可知 aφ(n)≡1(modn),所以
mφ(n)≡1(modn)mφ(n)≡1(modn)…mφ(n)≡1(modn)⎭⎪⎪⎪⎬⎪⎪⎪⎫k个由同余式的性质之互相乘可知
mkφ(n)≡1(modn)又因为
m≡m(modn)所以
mkφ(n)≡1(modn)m≡m(modn)}2个由同余式的性质之互相乘可知
mkφ(n)+1≡m(modn)又因为
ed=kφ(n)+1所以
med≡m(modn)(1)所以,若
c≡me(modn)所以
c≡me(modn)c≡me(modn)...c≡me(modn)⎭⎪⎪⎪⎬⎪⎪⎪⎫d个由同余式的性质之互相乘可知
cd≡med(modn)(2)所以,由 (1) 和 (2) 式可知 a 与 cd 模 n 的结果是一样的,即
m≡cd(modn)为何 d 很难破解?
攻击者可以获得的数据有密文数据 c 和公钥 (n,e)
又因为
m≡cd(modn)要想根据密文数据 c 获得明文数据 m,就必须再知道私钥 (n,d) 中的 d
由于
ed=kφ(n)+1所以只要知道 φ(n),就能求出 d
又因为
φ(n)=(p1−1)(p2−1)所以只要知道 p1和p2 就能求出 φ(n) 继而求出 d
又因为
n=p1×p2所以只要通过 n 求得 p1和p2 即可求出 d
但是因为 n 太大了,而分解质因数需要指数时间,所以没有人能够将 n 质因数分解求出 p1 和 p2
这种将大整数进行质因数分解的问题就称为质数分解难题
所以理论上任何人都不能推导出私钥 d
RSA 的安全性条件
∣p−q∣ 要大
p−1 和 q−1 都应有大素因子
代码实现(TODO)
可参考 KeyPairGenerator (Java SE 11 & JDK 11 ) (opens new window) API 及其源码
参考资料