1. 两种加密方式

对称加密

如:DES,AES,3DES

对称加密指的就是加密和解密使用同一个秘钥。对称加密只有一个秘钥,作为私钥。



非对称加密

如:RSA,ECC

非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密,私钥解密、私钥加密,公钥解密。



与非对称加密算法相比,对称加解密的效率要高得多。但对称加密的秘钥不好管理,容易泄露,一般两者联合使用。

如 C/S 模型:

  1. server 计算出一对秘钥 pub/pri。将私钥保密,将公钥公开。
  2. client 请求 server 时,拿到服务端的公钥 pub。
  3. client 通过 AES 计算出一个对称加密的秘钥 key。 然后使用pub将 key 进行加密。
  4. client 将加密后的密文发送给 server 。server 通过pri解密获得 key
  5. 然后两边的通讯内容就通过对称密钥 key 以对称加密算法来加解密。


2. RSA 加密算法

由来

算术基本定理告诉数学家们合数可以写为两个或多个质数的乘积形式,但是没有具体告诉数学家们具体怎么进行合数的质数分解。对于比较小的合数,我们可以尝试用它除以各个正整数,通过看是否能够整除来找到质因子,但将一个大的数分解为两个质数很难。这也是非对称加密算法的灵感来源。

RSA 算法是由 Rivest、Shamir 与Adleman 三个人提出的(有兴趣的小伙伴可以查阅资料多了解一些):

AES对称秘钥生成 aes加密 对称 非对称_加密解密

RSA 为三个人的名字的首字母组合!



原理

首先要知道两条定理:

  1. 对于任意 AES对称秘钥生成 aes加密 对称 非对称_rsa_02,只有当 n 与 a 互质时,才能找到 e 使得 AES对称秘钥生成 aes加密 对称 非对称_加密解密_03
  2. 如果一个合数 n 能够分解为两个质数 p 和 q,那么满足上一个定理的 e 一共有 $\Phi = (p-1)\times(q-1) $ 个
生成公钥和私钥的步骤如下:
  1. 选择两个大质数 p 和 q,计算 AES对称秘钥生成 aes加密 对称 非对称_对称加密_04
  2. 选取一个与 AES对称秘钥生成 aes加密 对称 非对称_对称加密_05 互质的数 e,计算满足 AES对称秘钥生成 aes加密 对称 非对称_对称加密_06 的数 d,即 AES对称秘钥生成 aes加密 对称 非对称_加密解密_07
  3. 得到公钥:AES对称秘钥生成 aes加密 对称 非对称_密码学_08,私钥 AES对称秘钥生成 aes加密 对称 非对称_加密解密_09
  4. 对方发消息 m 时通过公钥 (n, e) 加密,密文为 AES对称秘钥生成 aes加密 对称 非对称_对称加密_10
  5. 我方接收消息后通过私钥 (n, d) 解密,明文 AES对称秘钥生成 aes加密 对称 非对称_加密解密_11

证明过程可以查阅资料哈~


AES对称秘钥生成 aes加密 对称 非对称_对称加密_12

RSA 安全吗?

若存在第三方 eve 截取了消息 C 和公钥 (n, e) 时,信道还安全吗?
eva 尝试通过公钥 (n, e) 计算私钥 (n, d) …

  1. 要计算 d,首先要知道 (p-1)(q-1)
  2. 要计算 (p-1)(q-1) ,需要利用 n 计算出 p 和 q
  3. Emmm… 要消息的话需要进行质数分解,短时间内几乎不可能完成,算了 QAQ

因此,非对称加密算法实现了在不安全的信道上实现安全的信息传输!

但也不是绝对安全的,当第三方拦截双方发送的消息后,可以收集两边的公钥,将自己的公钥替换一方的公钥,那信道将会不安全!



3. 计算 AES对称秘钥生成 aes加密 对称 非对称_rsa_13

看到这里,肯定有人会问,上面的加密解密要算高次幂,数据大了内存会溢出吗?
有以下两种方法计算:

method1

通过循环计算(为了避免溢出,每个循环都进行取模)

def mod(a, b, c):
    res = 1
    while b > 0:
        b -= 1
        res = (res * a) % c
    return res

这种方法好理解,但计算耗费较长的时间!



method2

将 b 分解为二进制,按位计算(证明过程看着复杂实际上很简单):

Suppose AES对称秘钥生成 aes加密 对称 非对称_加密解密_14

because AES对称秘钥生成 aes加密 对称 非对称_密码学_15

AES对称秘钥生成 aes加密 对称 非对称_密码学_16

where AES对称秘钥生成 aes加密 对称 非对称_对称加密_17, AES对称秘钥生成 aes加密 对称 非对称_对称加密_18 and AES对称秘钥生成 aes加密 对称 非对称_加密解密_19



通过这种方法计算,只需要维护变量 AES对称秘钥生成 aes加密 对称 非对称_rsa_20 的值,即可通过递推公式快速地算出结果,循环计算的次数为 AES对称秘钥生成 aes加密 对称 非对称_AES对称秘钥生成_21

AES对称秘钥生成 aes加密 对称 非对称_AES对称秘钥生成_22

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

  1. 知乎-质数了不起——知乎刘巍然作品
  2. 图解密码技术