回顾上面的密钥生成步骤,一共出现六个数字:
> p
> q
> n
> φ(n)
> e
> d
这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
那么,有无可能在已知n和e的情况下,推导出d?
> (1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
>
> (2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
>
> (3)n=pq。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。
可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基百科这样写道:
> "对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
>
> 假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。
>
> 只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"
举例来说,你可以对3233进行因数分解(61×53),但是你没法对下面这个整数进行因数分解。
> 12301866845301177551304949
> 58384962720772853569595334
> 79219732245215172640050726
> 36575187452021997864693899
> 56474942774063845925192557
> 32630345373154826850791702
> 61221429134616704292143116
> 02221240479274737794080665
> 351419597459856902143413
它等于这样两个质数的乘积:
> 33478071698956898786044169
> 84821269081770479498371376
> 85689124313889828837938780
> 02287614711652531743087737
> 814467999489
> ×
> 36746043666799590428244633
> 79962795263227915816434308
> 76426760322838157396665112
> 79233373417143396810270092
> 798736308917
事实上,这大概是人类已经分解的最大整数(232个十进制位,768个二进制位)。比它更大的因数分解,还没有被报道过,因此目前被破解的最长RSA密钥就是768位。