写在前面:封面图的清晰度已经尽力了…… 这么经典的照片分辨率却如此渣渣orz(PS:仔细看会发现黑板上有一个P=NP)
RSA,或称RSA算法、RSA公钥(第六版现代汉语词典注音为yuè,笔者则认为yào并不好听)系统,是一种密码系统(cryptosystem),简单暴力地顾名思义,其用处是加密。
关于RSA的名称,英文wiki如是说:
RSA is made of the initial letters of the surnames of Ron Rivest, Adi Shamir, and Leonard Adleman, who first publicly described the algorithm in 1977.
正是由发明它的三位科学家的last name的首字母组成的。
RSA作为一种加密算法,最基本的作用自然是确保信息传递的安全。当被传输的信息被加密之后,即使在传输过程中被窃密,也要使窃密者几乎不可能将密文破译。《模仿游戏》有一句台词大概是这样的:德军的无线电波满天飞,而我们根本无法破译其中的信息。显而易见,比起防止信息传递过程中被窃密者拦截,将信息进行有效的加密更容易实现。研究表明,除非P=NP,不可能在一个“令人接受”的时间内对一个大整数进行质因数分解。基于这一点,RSA可靠程度非常高。
像刚从Pascal转入C++的小朋友那样,让我们看看如何像使用stl中的set一样来使用RSA(也就是将其当作科技黑箱):设有信息集合,中的所有元素便是我们能使用的用来作为信息载体的文字。为了方便,不妨假设中的元素全都是正整数。设有从到一一映射的函数,它的反函数记作,也就是说有满足。此时,我们可称为一个公钥,为与之对应的密钥。假设现在Bob要给Alice发一些不可描述的信息,于是对于这段信息中的每一个文字,Bob都将计算出并把发送给Alice。Alice收到后,再计算便可以得到原来的了。
上面的叙述显得十分的啰嗦,因为“加密”和“解密”就是使用某个函数和它的反函数的两个过程。但RSA的可怕之处在于:我们甚至可以将公钥公之于众,因为通过公钥来计算出密钥几乎是不可能的。下面将对其原理进行阐述,理解它可能需要一些基本的数论知识。
先不论使用了何种方法,我们得到了两个大质数和,记,则(为欧拉函数,表示不超过且与互质的正整数的个数)。选取一个与互质的较小奇数,同时计算出在模下的唯一乘法逆元(即)。
下面证明对于~中任意整数有。
由于是质数,由费马小定理有。并且注意到一定存在整数使得,那么将费马小定理得到的同余方程两边进行乘方再乘便得到了,同理有。将看作未知数,我们得到了一个线性同余方程组。根据中国余数定理(Chinese Remainder Theorem),其在模即模意义下只有一个解。显然是其一个解,也就是说。证毕。
由此可见,我们可令公钥为,密钥即为。一个人在使用RSA时,将数对作为公钥对外公布,自己保留密钥。
RSA最基本的使用原理全部疑难至此解决了,当然要使用好它还不得不做一些其它的工作,比如安全性高的原因还没有得到阐述,如何找到足够大的质数等等,这些我们将在后续文章中进行讨论。