一 , 概述
在现代密码学诞生以前,就已经有很多的加密方法了。例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊。16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码、猪圈密码,基于多表代换的维吉尼亚密码,二战中德军广泛使用的恩格玛加密机….但最终都找到了有效的破解算法。
现代密码学的诞生标志是1977年1月由美国国家标准局公布的数据加密标准(Data Encryption Standard,DES)。
在经过20多年之后,为适应现代的安全要求,2000年美国国家和标准技术协会筛选和评测出了被称为AES(Advanced Encryption Standard)的加密算法作为新的加密标准。目前,AES已被广泛使用,且未发现致命缺陷。到目前为止,AES是一个安全的加密算法。
然而,在加密算法之外,面临一个问题,那就是:秘钥的分发。就是说,解密方如何获得加密方的秘钥呢? 从而出现了:对称加密和非对称加密。
二,对称加密和非对称加密
1. 对称加密
对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。
常见的对称加密算法:DES,AES,3DES等等。
2. 非对称加密
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。
常见的非对称加密算法:RSA,ECC
3. 区别
对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用.
例如针对C/S模型,
1. 服务端计算出一对秘钥pub/pri。将私钥保密,将公钥公开。
2. 客户端请求服务端时,拿到服务端的公钥pub。
3. 客户端通过AES计算出一个对称加密的秘钥X。 然后使用pub将X进行加密。
4. 客户端将加密后的密文发送给服务端。服务端通过pri解密获得X。
5. 然后两边的通讯内容就通过对称密钥X以对称加密算法来加解密。
三,RSA原理
我们先来看这样一些基础知识,并且以下我们讨论全都是整数:
整数运算
在整数运算中 我们定义一个整数 x x ,那么他的负数为- x x ,并且有 x x +(- x x )=0;
他的倒数为 x−1 x − 1 , 并且有 x×x−1 x × x − 1 =1;
同余运算
有整数a,b,正整数m。 假如a除以m余b。我们称为a模m同余b,模数为m。并且记为 a≡b(modm) a ≡ b ( mod m ) ,例如10除以3余1
我们称10模3同余1,记为 10≡1(mod3) 10 ≡ 1 ( mod 3 ) 。
我们分别讨论模数为合数和质数情况下,基于同余运算的负数和倒数。
1. 当模数为合数 n n 时
简单起见,我们讨论当 n n 为10的情况,10是两个质数乘积
当模数为10的时候,参与运算的都是小于10的数。因为大于10的数除模取余之后都会小于10,所以只需要考虑小于模的数。
那么在同余运算中
一个小于10的数a,他的负数 x x 是什么? 也就是说使得 (a+x)≡0(mod10) ( a + x ) ≡ 0 ( mod 10 ) ; 那就是 n−a n − a ,即 x=n−a x = n − a 。这里的 x x 就像是常规运算下的-a。常规运算下 a+(−a)=0 a + ( − a ) = 0 ,我们说 −a − a 是 a a 的负数,这里 (a+x)≡0(mod10) ( a + x ) ≡ 0 ( mod 10 ) ,我们说 x x 是 a a 的负数。;
有 a+(n−a)=a+(−a)+n=n≡0(modn) a + ( n − a ) = a + ( − a ) + n = n ≡ 0 ( mod n ) 。 当 n=10 n = 10 的时候 ,有如下表
a a | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
x x | 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
那么, a a 的倒数 a−1 a − 1 是什么呢? 它要使得 a×a−1 a × a − 1 在模数为n的情况下等于1,即 a×a−1≡1(modn) a × a − 1 ≡ 1 ( mod n )
当 n=10 n = 10 的时候我们会发现,对于有的数我们可以找到它的倒数,有的数却找不到
例如当 a=3 a = 3 ,我们可以找到7,使得 3×7=21≡1(mod10) 3 × 7 = 21 ≡ 1 ( mod 10 ) ;
而当a=4的时候,我们有 4×0=0 4 × 0 = 0 , 4×1=4 4 × 1 = 4 , 4×2=8 4 × 2 = 8 , 4×3=12 4 × 3 = 12 , 4×4=16 4 × 4 = 16 , 4×5=20 4 × 5 = 20 , 4×6=24 4 × 6 = 24 , 4×7=28 4 × 7 = 28 , 4×8=32 4 × 8 = 32 , 4×9=36 4 × 9 = 36 ,在模10的情况下,都不会等于1。
我们对于所有小于10的 a a 都找他的倒数 a−1 a − 1 ,有下表
a a | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
a−1 a − 1 | 1 | 不存在 | 7 | 不存在 | 不存在 | 不存在 | 3 | 不存在 | 9 |
有什么规律呢?
数学界已证明:当 a<n a < n 时,只有当 a a 和 n n 互质才能找到 a−1 a − 1 。 同时还有以下结论,当 n=p×q n = p × q ,且 p p 和 q q 都为质数时,所有小于 n n 的数中,能找到倒数的个数为 (p−1)×(q−1) ( p − 1 ) × ( q − 1 ) 个。如果n有更多的质因子,那么计算会更复杂点。
我们把所有小于n,并且能和n互质的数的总个数记为一个函数 φ(n) φ ( n ) ,这个函数叫做欧拉函数。例
即当 n=p×q n = p × q ,且 p p 和 q q 都为质数时,有 φ(n)=(p−1)×(q−1) φ ( n ) = ( p − 1 ) × ( q − 1 ) , 那么就有 φ(10)=(2−1)×(5−1)=4 φ ( 10 ) = ( 2 − 1 ) × ( 5 − 1 ) = 4
同时这些数还有以下两个有趣的情况
这些数之间进行互乘的同余运算,结果还是这些数。
例如对于1: 1×1≡1(mod10) 1 × 1 ≡ 1 ( mod 10 ) , 1×3≡3(mod10) 1 × 3 ≡ 3 ( mod 10 ) , 1×7≡7(mod10) 1 × 7 ≡ 7 ( mod 10 ) , 1×9≡9(mod10) 1 × 9 ≡ 9 ( mod 10 )
对于3: 3×1≡3(mod10) 3 × 1 ≡ 3 ( mod 10 ) , 3×3≡9(mod10) 3 × 3 ≡ 9 ( mod 10 ) , 3×7≡1(mod10) 3 × 7 ≡ 1 ( mod 10 ) , 3×9≡7(mod10) 3 × 9 ≡ 7 ( mod 10 )
对于7: 7×1≡7(mod10) 7 × 1 ≡ 7 ( mod 10 ) , 7×3≡1(mod10) 7 × 3 ≡ 1 ( mod 10 ) , 7×7≡9(mod10) 7 × 7 ≡ 9 ( mod 10 ) , 7×9≡3(mod10) 7 × 9 ≡ 3 ( mod 10 )
对于9: 9×1≡9(mod10) 9 × 1 ≡ 9 ( mod 10 ) , 9×3≡7(mod10) 9 × 3 ≡ 7 ( mod 10 ) , 9×7≡3(mod10) 9 × 7 ≡ 3 ( mod 10 ) , 9×9≡1(mod10) 9 × 9 ≡ 1 ( mod 10 )
如果一些数在互相运算之后,得到的结果还是这些数中,我们称这些数在这个运算条件下具有封闭性。
对这些数进行求幂运算,并且再模10,结果如下表
a a | 1 | 3 | 7 | 9 |
---|---|---|---|---|
a0 a 0 | 1 | 1 | 1 | 1 |
a1 a 1 | 1 | 3 | 7 | 9 |
a2 a 2 | 1×1=1 1 × 1 = 1 | 3×3=9 3 × 3 = 9 | 7×7=9 7 × 7 = 9 | 9×9=1 9 × 9 = 1 |
a3 a 3 | 1×1×1=1 1 × 1 × 1 = 1 | 3×3×3=7 3 × 3 × 3 = 7 | 7×7×7=3 7 × 7 × 7 = 3 | 9×9×9=9 9 × 9 × 9 = 9 |
a4 a 4 | 1×1×1×1=1 1 × 1 × 1 × 1 = 1 | 3×3×3×3=1 3 × 3 × 3 × 3 = 1 | 7×7×7×7=1 7 × 7 × 7 × 7 = 1 | 1×1×1×1=1 1 × 1 × 1 × 1 = 1 |
其中,
我们规定 a0≡1(mod10) a 0 ≡ 1 ( mod 10 )
所有 aφ(10) a φ ( 10 ) 的结果都为1,即有 aφ(n)≡1(mod10) a φ ( n ) ≡ 1 ( mod 10 ) 。(根据前面的介绍可知这里的 φ(10)=(2−1)×(5−1)=4 φ ( 10 ) = ( 2 − 1 ) × ( 5 − 1 ) = 4 )
对于3和7来说,他们的 a0 a 0 、 a1 a 1 、 a2 a 2 、 a3 a 3 刚好把1,3,7,9各得到了一遍。到 a4 a 4 时刚好又回到了1,如果大于4之后,又会开始循环
在模n的情况下一定能找到一个数 g g ,使得 g0 g 0 、 g1 g 1 、 g2 g 2 、…… gφ(n)−1 g φ ( n ) − 1 刚好把所有与n互质并且小于n的数各得到一遍。我们把满足这种条件的数称为 生成元。
2. 当模数为质数 p p 的时候
当模 p p 为质数的时候,我们假设 p=7 p = 7 时。
同样求小于 p p 的数 a a 的负数 x x 使得 (a+x)≡0(mod10) ( a + x ) ≡ 0 ( mod 10 ) 有如下表
a a | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
x x | 6 | 5 | 4 | 3 | 2 | 1 |
而求 a a 的倒数时,因为p是质数,所有小于 p p 的数都和它互质。所以,所有小于 p p 的数 a a 都能找到它的倒数 −a − a 。它的欧拉函数 φ(n)=p−1 φ ( n ) = p − 1 。
如下表
a a | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
a−1 a − 1 | 1 | 4 | 5 | 2 | 3 | 6 |
它同样有模数为合数 n n 时的性质
- 这些数在同余运算规则下进行乘法运算,同样具有封闭性
- 任意的 a a 求幂依然满足 aφ(n)=1 a φ ( n ) = 1 的规则,且同样有生成元
3. 离散对数问题
前面我们得到了有这么一个结论:
在模n的情况下一定能找到一个数 g g ,使得 g0 g 0 , g1 g 1 , g2 g 2 、…… gφ(n)−1 g φ ( n ) − 1 刚好把所有与n互质并且小于n的数各得到一遍。我们把满足这种条件的数称为 生成元。
那么,在模 n n 的条件下,给定它的生成元 g g ,以及一个小于 n n 的正整数 a a 。通过一个叫做同余幂的算法能够快速的算出 ga g a 的值,我们把算得的结果记为 b b 。 即我们在模 n n 的条件下,能够快速的算出 b=ga b = g a 的值。
由于生成元的特性,我们知道,在模 n n 的条件下,给定生成元 g g ,以及 b b 的值,一定存在一个小于 n n 的正整数 a a ,使得 b=ga b = g a 。那么如何求a的值?
我们发现,这个问题没有任何规律。例如,当n=11,g=2时,有如下表
g g | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
---|---|---|---|---|---|---|---|---|---|---|---|
b=ga b = g a | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 |
a a | 0 | 1 | 8 | 2 | 4 | 9 | 7 | 3 | 6 | 5 | 10 |
在实数计算中,我们知道当 b=ga b = g a 时, a=logbg a = l o g b g 。然而这个计算在模 n n 的条件下非常困难。这样一个问题被称为离散对数问题。在目前的技术条件下,这是一个极为困难的计算。当这个 n n 值达到十进制两三百位时,即便是有大型计算机的情况下,所要花费的时间依然是个天文数字。
4.RSA原理
当 n=p×q n = p × q , p p 与 q q 是两个大质数。只知道 n n 的值,想要计算 p p 和 q q ,这是一个世界性的极为困难的数学难题。RSA的基础就是基于的n的两个质数分解难题。
具体过程如下:
Alice选择两个大质数 p p 和 q q ,求得 n=p×q n = p × q 。计算 φ(n)=(p−1)×(q−1) φ ( n ) = ( p − 1 ) × ( q − 1 ) ,接下来,Alice选择一个与 φ(n) φ ( n ) 互质的数e,并计算 e−1 e − 1 在模为 φ(n) φ ( n ) 下的值,将计算出的值记为 s s 。
我们知道, e e 与 φ(n) φ ( n ) 互质,所以一定存在 e−1 e − 1 , 这一步,service 就算出了公钥和私钥,其中,公钥为( e e , n n ),私钥为( s s , n n )
接下来,Bob可以在非安全信道请求Alice获得公钥。Evl通过中间攻击,只能获得 (e,n) ( e , n ) ,以及密文 D D 。假定Bob需要发送的内容为m,计算 D=me(modn) D = m e ( mod n ) ,然后把D发送给Alice
Alice收到D之后,计算 me(e−1)(modn)=me×e−1(modn)≡m(modn) m e ( e − 1 ) ( mod n ) = m e × e − 1 ( mod n ) ≡ m ( mod n ) .
其中,在不安全信道中传输的是 n n 和 e e 。然而, p p 和 q q 只有Alice才知道,即便Eval获得了n,基于质数分解难题,他无法算出 p p 和 q q ,也就无法算出私钥 s s 来揭秘被加密的消息。
且,m不能是大于n的数,当m大于n时可以拆分之后分段加密。
举个例子吧
- 假设取两个质数 p=11 p = 11 , q=13 q = 13 ,那么 n=143 n = 143 .
φ(n)=(p−1)×(q−1)=120 φ ( n ) = ( p − 1 ) × ( q − 1 ) = 120 。
随意选取一个和 φ(n) φ ( n ) 互质的数 e e ,假定这个数字为7,即 e=7 e = 7 ,
那么 e−1=63 e − 1 = 63 ,使得 e×e−1 e × e − 1 再模 φ(n) φ ( n ) 等于 1 1 ,即 e×e−1≡1(modφ(n)) e × e − 1 ≡ 1 ( mod φ ( n ) ) ,即 7×63=441≡1(mod120) 7 × 63 = 441 ≡ 1 ( mod 120 ) . - 公钥为 (e,n) ( e , n ) ,即 (7,143) ( 7 , 143 ) 。
私钥为 (s,n) ( s , n ) , 即 (63,143) ( 63 , 143 ) 。
要加密的原始数据为 m m ,假设 m=13 m = 13 。(计算机中任何数据,最后传输或者保存都会转换成二进制的数据) - 加密过程:Bob请求Alice,获得公钥,密文为 D D , D=137(mod143)=117 D = 13 7 ( mod 143 ) = 117 。 Bob将D传输出去。
- Evl通过中间攻击,只能获得 (e,n) ( e , n ) ,以及密文 D D
- 解密过程:Alice获得 D D ,通过只有Alice才有的私钥进行解密。 11763(mod143)=13 117 63 ( mod 143 ) = 13 ,获得了原始数据。
这里的11和13比较小,知道公钥为(7,143)之后,容易将143做因式分解求的11与13,从而可以算出 e−1 e − 1 。但是当 p p 和 q q 是两个非常大的的质数的时候,就很难将其分解出来。 这样,就无法算出 e−1 e − 1 。从而不能从密文中获得原始数据。