对称加密和非对称加密,是加密通信中常见的两个概念。wiki 的定义是:

对称密钥加密 密码学 中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。

非对称加密 也称 非对称加密 ,是 密码学 的一种 算法,它需要两个 密钥,一个是公开密钥,另一个是私有密钥;一个用作加密的时候,另一个则用作解密。使用其中一个密钥把 明文 加密后所得的 密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。

为了便于理解。我们来举例说明。

对称加密

回想起初中时代的小纸条了没,假设同学 A 想给同学 B 传一个小纸条,但是 A 离 B 隔着几个座位,需要由中间的 C 来帮忙传纸条,因为 C 是个爱打小报告的家伙,所以 A 和 B 都不想让 C 知道纸条中的具体内容是什么。于是 A 和 B 私下约定,纸条中的内容以摩尔斯编码来代替,例如要发送 “hello”,那么纸条中就写 “hello” 的摩尔斯编码 “…. . .-.. .-.. —- ”,由于 C 不知道 A 与 B 的约定转换规则,所以他即使看到了纸条的内容,也不知道 A 与 B 的交谈内容。但 B 得到了这个密文,通过对照摩尔斯编码转换表,就可以得到原始信息 “hello”。

此时,A 与 B 就是通信的双方,摩尔斯编码就是密钥,也就是明文 “hello”——> 密文 “…. . .-.. .-.. —“ 的映射关系。

A 与 B 用的是同一个密钥来加密解密信息,也就是摩尔斯编码。所以称为对称加密。

抽象一点来说,实际上密钥就是一种函数 / 映射关系,我们以 encry () 来表示。整个传递过程如下:

1
A 明文 ---->encry---->A 密文 ---->C 信道 ---->B 密文 ----encry---->B 明文 

一句话总结就是,对称加密就是通信双方用的是相同密钥来进行加密和解密。

常见的对称加密算法有

DES、3DES、AES、Blowfish、IDEA、RC5、RC6。

缺陷

对称加密相当简单,但有一个致命的缺陷就是,一旦密钥被第三方获取,那么加密的信息就全部泄漏了。依旧以上面的例子为例,C 知道了 A 与 B 是用摩尔斯编码来通信,那么他获取了摩尔斯编码表,就相当于完全掌握了 A 与 B 的通信内容。为了解决这个问题,人们又引入了非对称加密算法。

非对称加密

对称加密算法在于共同的密钥,非对称加密算法的做法是,每个人生成一个私钥 - 公钥对,私钥由个人保护不公开,而公钥可以随便分享,最关键的是, 使用公钥加密的信息,只有对应的私钥才能解密,使用私钥加密的信息,只有对应的公钥能解密

假设,A 生成了自己的一个私钥 - 公钥对 “A 私钥 - A 公钥”,B 也生成了自己的私钥 - 公钥对 “B 私钥 - B 公钥”,依照非对称加密的原则,A 的私钥由 A 保存只有 A 知道,B 同理。

此刻,A 想给 B 发送密文。

通信过程如下:

1
2
3
A: “hi,老哥,我想给你发个密文,把你的公钥发给我一下”
B: “好啊好啊,这是我的公钥‘HE8eU#hb*!’,请查收”
A: ” 这是密文 'jk2$$#4dfjkl``$@#cds'“

这时 C 听到了 A 和 B 的通话,而且知道了 B 的公钥‘HE8eU#hb!’和密文 ‘jk2$$#4dfjkl``$@#cds’。他兴奋地回去,想要解密密文,听听 A 和 B 到底在说什么。但是他发现没有办法解密这个密文。为什么?因为 密文是用 B 的公钥来加密的 * 只有 B 的私钥才能解密 !所以 C 除了 B 的公钥和密文之外什么也得不到。这就是非对称加密的强大之处。

总结一下通信过程,假设某人发送信息,那么他先要获取对方的公钥,再用这个公钥来加密明文为密文发送给对方,对方再用自己私钥来解密信息。而第三方没有私钥,所以没法解密。

一句话总结,非对称加密的非对称表现在, 加密的密钥公开,而解密的密钥不公开

实例

我们常用的密钥方式 ssh 登陆服务器的流程就是以非对称加密方式实现的:

  1. 远程服务器持有用户公钥,当有用户进行登录,服务器就会随机生成一串字符串,然后发送给正在进行登录的用户。
  2. 用户收到远程服务器发来的字符串,使用与 远程服务器公钥配对的私钥 对字符串进行加密,再发送给远程服务器。
  3. 服务器使用公钥对用户发来的加密字符串进行解密,得到的解密字符串如果与第一步中发送给客户端的随机字符串一样,那么判断为登录成功。

缺陷

非对称加密可以确保,发送方知道接收方的公钥的前提下,该密文在有效时间内无法被破解。但请注意这个前提,发送方知道接收方公钥,也就是说,第三方可以伪造自己的公钥为接收方公钥,在第一次通信建立的时候,发送方无法分辨他得到的公钥是不是接收方公钥。如何解决这个问题呢?答案就是数字签名和数字证书。详情请见