RSA算法原理
RSA加密算法是一种非对称加密算法。对称加密算法中加密和解密都得用同一个秘钥,必须保证秘钥不泄露才能保证数据的安全,加解密两方之间密钥的传递是存在安全隐患的。非对称加密算法中加密和解密使用不同的秘钥(公钥和私钥)。比如:甲方可以使用乙方给的公钥进行加密,乙方收到密文后使用自己的私钥进行解密。
RSA算法是一种基于大数分解的非对称加密算法,由已知加密密钥推导出解密密钥在计算上是不可行的。
相关数论知识
使用一个秘钥进行加密,使用另外一个秘钥可以解密成功,这对秘钥在数学上肯定存在某种联系。为了便于理解RSA算法,应该先了解一些相关的数论知识。
互质关系
如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系。关于互质关系,有以下结论:
- 任意两个质数构成互质关系,比如13和61。
- 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。
- 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。
- 1和任意一个自然数是都是互质关系,比如1和99。
- p是大于1的整数,则p和p-1构成互质关系,比如57和56。
- p是大于1的奇数,则p和p-2构成互质关系,比如17和15。
欧拉函数
在数论中,欧拉函数φ(n)表示小于n的正整数中与n互质的数的数目。例如φ(8)=4,因为1,3,5,7均和8互质。
欧拉函数的值可以使用下列等式进行计算:
当n为质数时,n只有一个质因子n,则 φ(n)=n(1−1n)=n−1 φ ( n ) = n ( 1 − 1 n ) = n − 1 。
欧拉定理
欧拉定理:如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立。
上式表示a的φ(n)次方除以n余数为1,或者说 aφ(n)mod n=1 a φ ( n ) m o d n = 1 。这里我们就不证明欧拉定理了,有兴趣的可以自己搜索相关资料。
费马小定理
费马小定理是欧拉定理的一个特殊情形,即 假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成:
这个就是费马小定理。
模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得ab-1被n整除,或者说ab被n除的余数是1。
这里把b叫做a的模反元素。比如3和11互质,因为3x4-1可以被11整除,所以4是3的一个模反元素。模反元素不止一个。
欧拉定理可以来证明模反元素一定存在。
上式可见, aφ(n)−1 a φ ( n ) − 1 就是a的模反元素。
RSA秘钥生成步骤
加密和解密过程可以通过下列式子来表示:
式中Plain为明文数据,Cipher为密文数据,那么公钥和私钥则为:
下来来计算秘钥中的E/D/N。
- 选择两个不相等的质数p&q,计算两者的乘积作为 N=p∗q N = p ∗ q 。(实际使用中这两个质数越大越难破解,而且可以使用多个质数,但是通常使用两个)。
- 计算N的欧拉函数值 φ(N)=(p−1)(q−1) φ ( N ) = ( p − 1 ) ( q − 1 ) 。
- 选择一个整数e,条件是 1<e<φ(n) 1 < e < φ ( n ) ,且e与φ(n) 互质。
- 求得e关于 φ(n) φ ( n ) 的模反元素d, e∗d≡1(modφ(N)) e ∗ d ≡ 1 ( m o d φ ( N ) ) 。
- 把N和e封装为公钥,把N和d封装成私钥。
RSA算法证明
实际数据验证
假设要使用公钥钥(N, e)对明文数据m进行加密,m必须是整数(计算机中字符串可以取ASCII值作为数字进行加解密),且m必须小于N。这里我们选择数字65作为明文, m=65 m = 65 。
1. 选择两个不相等的质数p和q,这里我们使用61和53两个数字作为p和q。
p=61,q=53 p = 61 , q = 53
2. 计算二者的乘积作为N。
N=p∗q=61∗53=3233 N = p ∗ q = 61 ∗ 53 = 3233
3. 计算N的欧拉函数
φ(N)=(p−1)(q−1)=60∗52=3120 φ ( N ) = ( p − 1 ) ( q − 1 ) = 60 ∗ 52 = 3120
4. 随机选一个整数e,满足条件 1<e<φ(n) 1 < e < φ ( n ) 且与 φ(n) φ ( n ) 互质
这里我们选择17作为e, e=17 e = 17 。
5. 计算e对于 φ(n) φ ( n ) 的模反元素,即使得ed被 φ(n) φ ( n ) 整除的余数为1
e∗d≡1(modφ(N))⇒11∗d=1(mod3120)
e
∗
d
≡
1
(
m
o
d
φ
(
N
)
)
⇒
11
∗
d
=
1
(
m
o
d
3120
)
。
这里不详细介绍模反元素的算法了,模反元素可能有多个,当d=2753时,公式成立,即
17∗2753=46801=3120∗15+1
17
∗
2753
=
46801
=
3120
∗
15
+
1
。所以
d=2753
d
=
2753
。
6. 加密
使用公钥
(e,N)=(17,3233)
(
e
,
N
)
=
(
17
,
3233
)
对数字65进行加密,Plain=65。
6517mod 3233=2790
65
17
m
o
d
3233
=
2790
,即加密后的数字,即Cipher=2790。
7. 解密
使用私钥
(d,N)=(2753,3233)
(
d
,
N
)
=
(
2753
,
3233
)
,
27902753mod 3233=65
2790
2753
m
o
d
3233
=
65
。即解出明文为65,解密成功。
公式推导证明
我们来证明为什么用私钥解密,一定可以正确地得到明文m。也就是证明下面这个式子:
Plain≡Cipherd(mod n) P l a i n ≡ C i p h e r d ( m o d n )
因为,根据加密规则
Cipher≡Plaine(mod n) C i p h e r ≡ P l a i n e ( m o d n )
于是,Cipher可以写成下面的形式:
Cipher=Plaine−kn C i p h e r = P l a i n e − k n
将Cipher代入要我们要证明的那个解密规则:
(Plaine−kn)dmod n≡Plain ( P l a i n e − k n ) d m o d n ≡ P l a i n
它等同于求证
Plained (mod n)≡Plain P l a i n e d ( m o d n ) ≡ P l a i n
由于
ed≡1(mod φ(n)) e d ≡ 1 ( m o d φ ( n ) )
所以
ed=hφ(n)+1 e d = h φ ( n ) + 1
将 ed 代入:
Plainhφ(n)+1(mod n)≡Plain P l a i n h φ ( n ) + 1 ( m o d n ) ≡ P l a i n
接下来,分成两种情况证明上面这个式子。
1. Plain与n互质。
根据欧拉定理,
Plainφ(n)≡1(mod n) P l a i n φ ( n ) ≡ 1 ( m o d n )
得到
(Plainφ(n))h∗Plain≡Plain(mod n) ( P l a i n φ ( n ) ) h ∗ P l a i n ≡ P l a i n ( m o d n )
原式得到证明。
2. Plain与n不是互质关系。
由于n等于质数p和q的乘积,所以Plain必然等于 kp 或 kq。
以 Plain = kp 为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:
(kp)q−1≡1(mod q) ( k p ) q − 1 ≡ 1 ( m o d q )
进一步得到
[(kp)q−1]h(q−1)∗kp≡kp(mod q) [ ( k p ) q − 1 ] h ( q − 1 ) ∗ k p ≡ k p ( m o d q )
即
(kp)ed≡kp(mod q) ( k p ) e d ≡ k p ( m o d q )
将它改写成下面的等式
(kp)ed=tq+kp ( k p ) e d = t q + k p
这时t必然能被p整除,即 t=t’p
(kp)ed=t′pq+kp ( k p ) e d = t ′ p q + k p
因为 Plain=kp,n=pq,所以
Plained≡m(mod n) P l a i n e d ≡ m ( m o d n )
原式得到证明。