RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的
其实RSA加密算法最主要的就是两个公式,在理解这两个公式之前需要学习数论中的四个概念:互质、欧拉函数、欧拉定理、模反元素
如果两个正整数,除了1以外没有其他公因子,则称这两个数互质,比如6和21的公因子有3和1,所以6和21就不互质;而10和21只有一个公因子1,所以它们互质。不是质数也可以构成互质关系
只要满足以下几点就可构成互质关系:
请问10以内的正整数有哪些与10互质呢?
答案是:{1,3,7,9},10以内用手就可以算的过来,那100呢?1000呢?数字越大越难手算出来,有公式可以计算,就是欧拉函数
欧拉函数以 ψ ( n ) \psi(n) ψ(n)表示。在1到10之中,与10形成互质关系的是{1,3,7,9},所以 ψ ( 10 ) = 4 \psi(10) = 4 ψ(10)=4
ψ ( n ) \psi(n) ψ(n)的计算方法并不复杂,推到步骤可以在网上找到,这里只要记住最终结论就行
第一种情况
如果n = 1,则 ψ ( 1 ) = 1 \psi(1)=1 ψ(1)=1,因为1与任何数(包括自身)都构成互质关系
第二种情况
如果n是质数,则 ψ ( n ) = n − 1 \psi(n) = n - 1 ψ(n)=n−1。因为质数与小于他的每一个数都构成互质关系。比如5与1、2、3、4都构成互质关系
如果n是质数的某一个次方值,即 n = p k n = p^k n=pk(p为质数,k为大于等于1的整数),则:
ψ ( p k ) = p k − p k − 1 \psi(p^k) = p^k - p^{k-1} ψ(pk)=pk−pk−1
例如, ψ ( 8 ) = ψ ( 2 3 ) = 2 3 − 2 2 = 4 \psi(8) = \psi(2^3) = 2^3 - 2^2 = 4 ψ(8)=ψ(23)=23−22=4
这是因为只有当一个数不包含质数p,才可能与n互质,而包含质数p的数共有 p k − 1 p^{k-1} pk−1个,即 p , 2 p , 3 p . . . p k p,2p,3p...p^k p,2p,3p...pk,把他们去除,剩下的就是与n互质的数
上面的式子还可以写成下面的形式:
ψ ( p k ) = p k − p k − 1 = p k ( 1 − 1 p ) \psi(p^k) = p^k - p^{k-1} = p^k(1-\frac{1}{p}) ψ(pk)=pk−pk−1=pk(1−p1)
可以看出,上面的第二种情况是k=1时的特例
根据第四条结论,得到:
ψ ( n ) = ψ ( p 1 k 1 ) ψ ( p 2 k 2 ) . . . ψ ( p r k r ) \psi(n)=\psi(p^{k_1}_1)\psi(p^{k_2}_2)...\psi(p^{k_r}_r) ψ(n)=ψ(p1k1)ψ(p2k2)...ψ(prkr)
再根据第三条结论,得到:
ψ ( n ) = p 1 k 1 p 2 k 2 . . . p r k r ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p r ) \psi(n) = p^{k_1}_{1} p^{k_2}_{2} ... p^{k_r}_{r} (1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_r}) ψ(n)=p1k1p2k2...prkr(1−p11)(1−p21)...(1−pr1)
也就等于
ψ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p r ) \psi(n) = n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_r}) ψ(n)=n(1−p11)(1−p21)...(1−pr1)
这就是欧拉函数的通用计算公式。比如1323的欧拉函数,计算过程如下
ψ ( 1323 ) = ψ ( 3 3 ∗ 7 2 ) = 1323 ( 1 − 1 3 ) ( 1 − 1 7 ) = 756 \psi(1323) = \psi(3^3 * 7^2) = 1323(1-\frac{1}{3})(1-\frac{1}{7})=756 ψ(1323)=ψ(33∗72)=1323(1−31)(1−71)=756
欧拉定理指的是:如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
a ψ ( n ) ≡ 1 ( m o d n ) a^{\psi(n)} \equiv 1(mod\; n) aψ(n)≡1(modn)
也就是说,a的 ψ ( n ) \psi(n) ψ(n)次方除以n的余数为1。或者说,a的 ψ ( n ) 次 方 减 1 可 以 整 除 n \psi(n)次方减1可以整除n ψ(n)次方减1可以整除n。例如,3和7互质,而7的欧拉函数 ψ ( 7 ) = 6 \psi(7)=6 ψ(7)=6,所以 ( 3 6 − 1 ) / 7 = 728 / 7 = 104 (3^6 - 1) / 7 = 728 / 7 = 104 (36−1)/7=728/7=104
科普:mod为取模,取模运算与取余运算还是有区别。取余的商靠近0,而取模的商是靠近负无穷的
欧拉定理可以大大简化某些运算。比如,7和10互质,根据欧拉定理,则 7 ψ ( 10 ) ≡ 1 ( m o d 10 ) 7^{\psi(10)} \equiv 1(mod\; 10) 7ψ(10)≡1(mod10)
因此,7的任意次方的个位数(例如7的222次方),心算就可以算出来,因为 7 222 = ( 7 4 ) 55 ∗ 7 2 7^{222} = (7^4)^{55} * 7^2 7222=(74)55∗72,又因为某个整数的个位数,就是这个整数mod 10,所以 ( 7 ψ ( 10 ) ) 55 ∗ 7 2 ≡ 9 ( m o d 10 ) (7^{\psi(10)})^{55} * 7^2 \equiv 9 (mod\; 10) (7ψ(10))55∗72≡9(mod10)
欧拉定理是RSA算法的核心,只有理解这个定理,才能理解RSA
如果两个正整数a和n互质,那么一定可以找到整数b,使得(a*b)-1整除n
a ∗ b ≡ 1 ( m o d n ) a * b \equiv 1(mod\; n) a∗b≡1(modn)
这时,b就叫a的“模反元素”
比如,3和11互质,找到3的模反元素4,使得(3*4)-1可以整除11。显然,模反元素不止一个,4加减11的非零整数倍都是3的模反元素{…,-18,-7,4,15,…}。即如果b是a的模反元素,则 b + k n b+kn b+kn都是a的模反元素
欧拉定理可以用来证明模反元素必然存在
a ψ ( n ) = a ∗ a ψ ( n ) − 1 ≡ 1 ( m o d n ) a^{\psi(n)} = a * a^{\psi(n) - 1} \equiv 1 (mod\; n) aψ(n)=a∗aψ(n)−1≡1(modn)
可以看到, a ψ ( n ) − 1 a^{\psi(n) - 1} aψ(n)−1就是a的模反元素
首先假设小红和小明两个人进行通信
因为RSA是非对称加密算法,这也就意味着加密和解密使用的是不同的密钥,生成密钥具体分为六步:
(1)随机选择两个不相等的质数p和q
小红随机选择61和53(实际应用中,两个质数越大,就越难破解)
又因为61和53都是质数,于是可以根据欧拉函数求解的第二种情况:
如果n是质数,则 ψ ( n ) = n − 1 \psi(n)=n-1 ψ(n)=n−1,所以 ψ ( 65 ) ∗ ψ ( 53 ) = 60 ∗ 52 = 3120 \psi(65) * \psi(53)=60*52=3120 ψ(65)∗ψ(53)=60∗52=3120
所以 ψ ( n ) = 3120 \psi(n)=3120 ψ(n)=3120
小红在1到3120之间,随机选择了17
这个公式等价于
e ∗ d − k ∗ ψ ( n ) = 1 e * d - k * \psi(n) = 1 e∗d−k∗ψ(n)=1
将 e = 17 , ψ ( n ) = 3120 e=17,\psi(n)=3120 e=17,ψ(n)=3120带入得
17 d − 3120 k = 1 17d - 3120k = 1 17d−3120k=1
令 d = x , − k = y d = x,-k = y d=x,−k=y,则
17 x + 3120 y = 1 17x + 3120y = 1 17x+3120y=1
所以我们要求的模反元素d就是对上面的二元一次方程求解,根据扩展欧几里得算法(辗转相除法)得
上图我们使用拓展欧几里得求得d=-367,但通常我们习惯取正整数,利用模反元素的特性
3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {…,-18,-7,4,15,26,…},即如果b是a的模反元素,则 b+kn 都是a的模反元素
所以取 d = d + k ψ ( n ) = − 367 + 1 ∗ 3120 = 2753 d = d + k\psi(n) = -367+1*3120=2753 d=d+kψ(n)=−367+1∗3120=2753
到现在为止,所有的计算都已结束
在这个例子中n=3233,e=17,d=2753,所以公钥就是 (n,e)=(3233,17),私钥就是(n,d)=(3233, 2753),这样小红就可以将公钥公布出去,自己保存好私钥就可以了
加密要用公钥(n,e)
假设小明先试探性的给小红发一个字母m = ‘A’,由于在通信传输中只能传输0和1,所以我们先将’A’转ASCII码为65,所以m = 65**(m必须是整数,且m必须小于n)**
所谓加密,就是使用下面的加密公式算出密文c
m e = c ( m o d n ) m^e = c(mod \; n) me=c(modn)
小明得到的公钥是(n,e) = (3233,17),m = 65,那么得到下面的等式
6 5 17 = c ( m o d 3233 ) 65^{17} = c (mod \; 3233) 6517=c(mod3233)
小明通过计算得到c = 2790,所以他就把2790发给小红了
而小红的私钥为(n,d) = (3233,2753),所以得到下面的等式:
279 0 2753 ≡ m ( m o d 3233 ) 2790^{2753} \equiv m (mod \; 3233) 27902753≡m(mod3233)
小红通过计算器以算,得m = 65,然后小红对着ASCII码表得出65对应的字母为A
至此,整个加密过程就演示完了,总结一下: