序言
RSA算法是最早得到广泛应用的公钥加密算法。它在通信加密、签名认证等领域都起着重要作用。
RSA算法最早由英国数学家Clifford Cocks在1973年发明,但由于当时被英国政府列为最高机密,直到死后不久其工作成果才被公布。而1977年,Ron Rivest、Adi Shamir 和 Leonard Adleman三人在MIT合作发表了一篇完整描述RSA算法的论文,被正式承认为该算法的发明者。RSA这个名字也正是由三人姓氏的首字母组成。
很有意思的一件事情是,RSA算法并不是第一个公钥加密算法,比RSA算法更早的是一个基于背包问题的公钥加密算法。该算法作者悬赏100美元寻找能够破解他的加密的人,结果这100美元被RSA中的S(Adi Shamir)轻松拿到了。之后不信邪的作者改进了算法,悬赏1000美元继续寻找能破解改进算法的人,不久又被RSA中的R(Ron Rivest)破解了,并且该破解方法适用于背包加密及其变种。
而RSA算法作者也在首次公布RSA算法时悬赏100美元寻找能破解他们的加密信息的人。这个挑战直到17年后,也就是1994年才被破解。而且这个破解有超过600人参与,使用了1600台计算机运算七个多月后才最终得到结果。当然,没有人能拿到那100美元,因为17年已经远远超出了当年作者设置的破解时限。
数学背景知识
RSA算法是一个基于数论的算法,要弄懂RSA,一些数论中的基础知识是必要的,如果你此前已经学过数论相关内容,可以直接跳到下一章。
同余
两个整数a、b,如果他们除以正整数m的余数相等,那a和b同余。用公式来表示就是:
amodm=bmodm⇔a≡bmodm a mod m = b mod m ⇔ a ≡ b mod m
符号“≡”表示同余相等。比如37跟13关于模24同余,也就是 37≡13mod24 37 ≡ 13 mod 24
而形如 a+b≡cmodm a + b ≡ c mod m 这样带有同余相等符号的式子被称为同余式。我们也可以把它转化为常见的形式 a+bmodm=cmodm a + b mod m = c mod m ,但这样写未免太繁琐了。
根据同余关系的性质,在求模运算中,任何大于或等于模数的数都可以用跟它同余的数来代替。比如:
因为
56≡8mod24 56 ≡ 8 mod 24
25≡1mod24 25 ≡ 1 mod 24
所以下列等式都是成立的:
(56+25)mod24=(8+1)mod24 ( 56 + 25 ) mod 24 = ( 8 + 1 ) mod 24
(56−25)mod24=(8−1)mod24 ( 56 − 25 ) mod 24 = ( 8 − 1 ) mod 24
(56×25)mod24=(8×1)mod24 ( 56 × 25 ) mod 24 = ( 8 × 1 ) mod 24
利用同余性质,将较大的操作数替换为同余的较小的数,可以大大加快模运算的速度。
数论倒数
普通算术运算中,如果 ab=1 a b = 1 ,那么我们说a和b互为倒数。类似地,在同余式中,如果 ab≡1modm a b ≡ 1 mod m ,我们说在模m下,a和b互为数论倒数,或者说乘法逆元。有时候也记作 a≡b−1modm a ≡ b − 1 mod m 或者 b≡a−1modm b ≡ a − 1 mod m
欧拉函数
欧拉函数 φ(n) φ ( n ) ,也就是对于正整数n,小于或等于n且与n互质的正整数的个数。比如 φ(6) φ ( 6 ) ,不超过6并且跟6互质的有1和5两个数,则 φ(6)=2 φ ( 6 ) = 2 。
特别地,对于任意素数p,所有小于p的正整数都跟它互质,所以 φ(p)