1. 两种加密方式
对称加密
如:DES,AES,3DES
对称加密指的就是加密和解密使用同一个秘钥。对称加密只有一个秘钥,作为私钥。
非对称加密
如:RSA,ECC
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密,私钥解密、私钥加密,公钥解密。
与非对称加密算法相比,对称加解密的效率要高得多。但对称加密的秘钥不好管理,容易泄露,一般两者联合使用。
如 C/S 模型:
- server 计算出一对秘钥 pub/pri。将私钥保密,将公钥公开。
- client 请求 server 时,拿到服务端的公钥 pub。
- client 通过 AES 计算出一个对称加密的秘钥
key
。 然后使用pub将key
进行加密。 - client 将加密后的密文发送给 server 。server 通过pri解密获得
key
。 - 然后两边的通讯内容就通过对称密钥
key
以对称加密算法来加解密。
2. RSA 加密算法
由来
算术基本定理告诉数学家们合数可以写为两个或多个质数的乘积形式,但是没有具体告诉数学家们具体怎么进行合数的质数分解。对于比较小的合数,我们可以尝试用它除以各个正整数,通过看是否能够整除来找到质因子,但将一个大的数分解为两个质数很难。这也是非对称加密算法的灵感来源。
RSA 算法是由 Rivest、Shamir 与Adleman 三个人提出的(有兴趣的小伙伴可以查阅资料多了解一些):
RSA 为三个人的名字的首字母组合!
原理
首先要知道两条定理:
- 对于任意 ,只有当 n 与 a 互质时,才能找到 e 使得
- 如果一个合数 n 能够分解为两个质数 p 和 q,那么满足上一个定理的 e 一共有 $\Phi = (p-1)\times(q-1) $ 个
生成公钥和私钥的步骤如下:
- 选择两个大质数 p 和 q,计算
- 选取一个与 互质的数 e,计算满足 的数 d,即
- 得到公钥:,私钥
- 对方发消息 m 时通过公钥 (n, e) 加密,密文为
- 我方接收消息后通过私钥 (n, d) 解密,明文
证明过程可以查阅资料哈~
RSA 安全吗?
若存在第三方 eve 截取了消息 C 和公钥 (n, e) 时,信道还安全吗?
eva 尝试通过公钥 (n, e) 计算私钥 (n, d) …
- 要计算 d,首先要知道 (p-1)(q-1)
- 要计算 (p-1)(q-1) ,需要利用 n 计算出 p 和 q
- Emmm… 要消息的话需要进行质数分解,短时间内几乎不可能完成,算了 QAQ
因此,非对称加密算法实现了在不安全的信道上实现安全的信息传输!
但也不是绝对安全的,当第三方拦截双方发送的消息后,可以收集两边的公钥,将自己的公钥替换一方的公钥,那信道将会不安全!
3. 计算
看到这里,肯定有人会问,上面的加密解密要算高次幂,数据大了内存会溢出吗?
有以下两种方法计算:
method1
通过循环计算(为了避免溢出,每个循环都进行取模)
def mod(a, b, c):
res = 1
while b > 0:
b -= 1
res = (res * a) % c
return res
这种方法好理解,但计算耗费较长的时间!
method2
将 b 分解为二进制,按位计算(证明过程看着复杂实际上很简单):
Suppose
because
where , and
通过这种方法计算,只需要维护变量 的值,即可通过递推公式快速地算出结果,循环计算的次数为
Python 实现的代码如下:
def mod(a, b, c):
# initialize
bn = b & 1
b = b >> 1
Tn = a % c
An = a ** bn
# iteration
while b != 0:
bn = b & 1
b = b >> 1
Tn = (Tn * Tn) % c
An = (Tn ** bn) * An % c
return An
print(mod(216723243213, 2132141232331, 347)) # 34
Amazing !
REERENCES
- 知乎-质数了不起——知乎刘巍然作品
- 图解密码技术