最近刚为站点后台部署了HTTPS,借此机会系统梳理一下加密与解密的相关知识。密码学的发展历程颇为有趣,其起源可追溯至古希腊罗马时期,当时主要采用简单的字母替换方法。
密码学早期发展

古希腊人使用名为Scytale的工具进行加密。另一种更高效的加密方式称为置换密码(transposition cipher),其原理是将羊皮纸缠绕在一根圆木上,书写信息后展开,文字便实现了加密。尽管这种方法容易被破解,但它确实是历史上首个实际应用的加密方案。
凯撒大帝(Julius Caesar)采用了另一种类似的加密方式:将字母向右或向左移动若干位,这就是著名的凯撒密码(Caesar’s cipher)。例如,"GEEK" 加密后变为 "JHHN"。
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher: DEFGHIJKLMNOPQRSTUVWXYZABC
由于只有信息接收者知晓解密方法,对其他人而言,这些字符只是一串无意义的乱码。此外,还有一种加密方式如图所示:将每个字母映射到坐标系中。

如此一来,字母"G"对应"23",而"GEEK"则对应"23 31 31 43"。
恩尼格玛密码机(Enigma Machine)——这是二战时期著名的加密设备,本文暂不深入探讨。
加密算法概述
加密算法种类繁多,区分和衡量它们主要依据两个维度:抗破解能力与加密速度。如下图所示,AES是目前最快的强加密算法之一。

当然,也存在速度更快或更慢的算法,各有其适用场景。如果仅需加密少量信息且频率不高,可以采用最强的算法,甚至加密两次。但若追求速度,AES无疑是最佳选择。
加密类型分类
之前提到的加密算法绝大部分都属于以下两种加密类型之一:
对称加密:加密与解密使用相同的“密钥”。
非对称加密:加密与解密使用不同的“密钥”。
对称加密详解
以邮局寄送为例来解释对称加密:Alice将信息放入一个带有挂锁的盒子中,她持有钥匙。通过邮局将盒子寄给Bob。Bob收到后,使用相同的钥匙打开盒子(该钥匙此前已通过面对面方式从Alice处获得)。随后Bob可以用同样的方法回复Alice。

对称加密又可细分为两种模式:流加密(逐字节处理)和块加密(将信息分块处理,通常每块64位)。常见算法包括Twofish、Serpent、AES (Rijndael)、Blowfish、CAST5、RC4、TDES和IDEA。
非对称加密原理
Bob和Alice各自拥有一个盒子。Alice若要安全通信,先请Bob将未上锁的盒子通过邮局寄给她。Alice收到后放入信息并锁上,再寄回给Bob。Bob用自己的钥匙打开盒子。回复时采用相同流程。

这种方法最大的优势在于:无需获取对方的“密钥”,避免了密钥在传输过程中被复制窃取的风险。此外,即使Bob的密钥被盗,Alice与其他人通信的安全性也不受影响,因为她使用的是不同人的密钥。
非对称算法在加密和解密时使用不同的密钥。信息接收者持有两把密钥:一把“公钥”,一把“私钥”。公钥提供给信息发送者用于加密,私钥由接收者自己保管用于解密。这样做最大的好处是:无需通过不安全的渠道传输私密信息。公钥本身就是公开的,无需隐藏;而私钥则保存在生成它的电脑上。
网站如何通过加密实现安全通信
SSL(安全套接层,Secure Sockets Layer)用于保障浏览器与网站服务器之间的安全通信,防止网络“中间人”窃取信息。SSL的工作原理实际上并不复杂。

当浏览器向服务器请求一个安全网页(通常以https://开头)时,服务器会将其证书和公钥发送回来。

浏览器会验证证书是否由可信的证书颁发机构签发,并确认证书有效且属于该网站。

浏览器使用公钥加密一个随机生成的对称密钥,并将加密后的URL一同发送至服务器。

服务器使用自己的私钥解密浏览器发送的对称密钥,然后利用该对称密钥解密浏览器请求的URL链接。

服务器使用浏览器发送的对称密钥对请求的网页进行加密。浏览器由于持有相同的对称密钥,就可以解密返回的网页内容。

整个SSL握手流程大致如上所述。
