1970年左右科学家们开始思考公钥加密系统的可能性。经过科学家多年的研究,终于在1977年时,来自MIT的Ron Rivest,AdiShamir和Leonard Adlemn三个人合写了一篇论文,给出了至今仍然安全的公钥加密算法,即以三个人姓氏的首字母命名的RSA算法。
RSA的过程步骤如下:
1) 找两个大质素p和q
2) 设n=p·q 算出m=(p-1)(q-1)
3) 找出e和d,使得 e·d mod = 1 (随便找出一个与m互质的数e,求解方程e·d mod = 1)
4) 把e,n作为公钥,d,n作为私钥
5) 设X为原始报文,Y为密文
则 Y=Xe mod n
X=Y dmod n
即某个人用公钥e和n加密后,只有拥有私钥d和n的另一个人才能进行解密。
看以上的算法步骤你会产生很多疑问,如为什么要找两个大质素p、q;为什么需要按照(p-1) ·(q-1)算出m,然后根据e·d mod m= 1这个公式找出e和d,…等等。
RSA背后所依赖的数学定理已经存在300年以上,但是根据这么古老的定理创造RSA算法却是最近几十年的事,主要原因是随着计算机运算速度的提升以及网络的建立带来安全通讯的需求,因此开始了研究公钥算法的可行性,并终于在1977年时由MIT的三位教授发明了RSA公钥加密算法。
由数学定理找出RSA公钥算法是一条异常曲折的道路,但是对RSA算法扩展然后用数学定理证明似乎就平坦多了。因此本文对RSA算法的详解从结果开始,然后提出疑问逐步反推并用数学定理证明,最后再回头看是如何用现存的数学定理找出RSA算法。
我们根据RSA算法的步骤,首先列出疑问
1. 为什么X=Y dmod n,而Y=Xe mod n,也就是X的e次方除以n取余的值的d次方再除以n的取余又等于X了呢?
1.1 因为Xe除以n的余数(Xe mod n)的d次方再模n,相当于Xe·dmod n,证明如下:
(1) Y=Xemod n 即是算X的e次方除以n的余,
(2) 换成公式:Xe= nx + Y x为n的倍数
(3) 则Y= Xe – nx
(4) Y dmod n = (Xe – nx)d mod n
(5) (Xe –nx)d 是一个多项式,展开后除了第一项为Xe·d外,其余项都携带n,因此其余项都能被n除尽,(Xe –nx)d mod n可以简化为Xe·dmod n
1.2 由1.1可知Y dmod n = (Xe – nx)d mod n = Xe·dmod n,而为什么Xe·dmod n = X呢?
1.2.1 如果某个整数n等于两个质数p,q的乘积,那么对于任意一个整数a,写出ai 依次除以n所得的余数序列,那么p-1 和 q-1的最小公倍数将成为该序列的一个周期,这是一个费马小定理的扩展。为什么p-1 和 q-1的最小公倍数将成为该序列的一个周期呢?具体证明见2节,先记住这个结论,继续往下分析。
1.2.2 m就是(p-1)和(q-1)的乘积,因此该序列的周期是m,a mod n 、a1+mmod n 、a1+2m mod n 和a1+3m modn的余数都相等。
1.2.3 所以计算e·d = 1 + m