RSA利用了大数分解的不对称性——分解出因子需要很大计算量,知道因子计算数则很容易。
很多人会产生疑惑,这样的话,任何一个大数都是这样,为什么一定要两个素数相乘得到大数呢?有人回答说,这样可以确保分解成两个因子,否则就可能有很多种组合了,这时解密方法就不唯一了。这其实是错误的回答,因为在公钥和私钥都确定的情况下,解密方法是唯一的,即使这个大数不是两个素数相乘产生的。
有人更困惑了,如果用两个合数相乘得到大数,即使分解了还有排列组合问题,这样不是更加保险了吗?
我的解释如下:
RSA需要计算大数的欧拉函数值φ(n),即小于等于n的正整数中和n互质的数的数量。对于素数显然φ(p)=p-1,如果n=p1 x p2,则φ(n)=(p1-1)x(p2-1),计算量可以忽略不计。但是如果选择合数,计算欧拉函数就需要非常大的计算量了,首先需要获得n的标准分解式,再用欧拉函数的公式计算。对于很大的合数,获得标准分解式需要很大的计算量(RSA难破解靠的就是这个),这不是自己给自己挖坑吗?
然后,至于合数的可能的组合更多,的确,但是要考虑一个问题,就是合数可能被恰好分解为少数几个小素数的乘积,这时就成了排列组合问题,分解难度大大下降,这时可谓是得不偿失。
例如20932169866834634=2x17x33857x87313x208261,暴力破解发现2就可以,直接将数值减半,继续分解发现17也可以,又大大简化。得到这5个因子后,也就是怎么组合成两个数的可能性,一共只有 C(1,5)+C(2,5)=15 种,比唯一的两个大素数要好找多了。为了避免这种情况,当然可以选择因子很多、每个因子很大的合数,但是这对欧拉函数的计算量提升不说,已经和直接用素数没有太大区别了。何况目前不需要排列组合也很难破解了,所以没有必要。