今天的我们只要接触密码学相关的信息,那一定是经常会听说各种密钥啊,之类的,但这个东西到底是怎么发展来的呢?这里我们从密码学的发展、古典密码学和现代密码学等角度搞清楚密码学到底是怎么发展的,以及为什么后面出现了密钥这种东东。
1 密码学的历史
密码学的历史主要分为两大部分:古典密码学和现代密码学。其中 古典密码学依赖于算法,现代密码学依赖于密钥。在现代密码学中密码的理论算法需要公开,以便与更好的维护和找到漏洞。
1.1 古典密码学简介
密码算法本身要保密,要很安全,最开始的加密算法主要是:字母替换和顺序置换。
1.1.1 第1个古典加密算法:凯撒密码
凯撒密码,容易被穷举攻击,属于单表替换。凯撒密码是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左/右移动一个偏移量的位置。例如,当密文的偏移量是左移3时(解密时的密钥就是3):
- 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密文字母表反过来操作,得到原来的明文。例如:
- 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG ;
- 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ。
1.1.2 第2个古典加密算法:单字母替换
单字母替换,无法被穷举法攻击,但是可以通过英文日常出现概率,即统计学和概率论的方式去大幅度降低算力,属于单表替换。单字母替换密码加密时,将每个明文字母替换为与之唯一对应且不同的字母。它与凯撒密码之间的区别是其密码字母表的字母不是简单的移位,而是完全是混乱的,这也使得其破解难度要高于凯撒密码。 比如,它的映射关系可以为:
- 明文字母表:abcdefghijklmnopqrstuvwxyz
- 密文字母表:phqgiumeaylnofdxjkrcvstzwb
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密文字母表反过来操作,得到原来的明文。例如:
- 明文:the quick brown fox jumps over the lazy dog
- 密文:cei jvaql hkdtf udz yvoxr dsik cei npbw gdm
1.1.3 第3个古典加密算法:维吉尼亚算法
维吉尼亚算法,引入了密钥的概念。属于多表代换密码体制。它解决了从概率分布上被破解的可能性,而破解方式是使用kasiski测试法+重合指数法,相较于前两者难度大了很多。该加密方法不需要明文和密文字母表。在使用时 加密者直接用密钥进行加密,而解密者必须要有密钥,加上一张映射表才可以,这里的映射关系比较简单,比如密钥中A表示偏移是0,B表示偏移为1,以此类推。如下所示:
- 密钥:ABCDAB CD ABCDA BCD ABCDABCDABCD
- 明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY
- 密文:CSASTP KV SIQUT GQU CSASTPIUAQJB
这里使用ABCD为密钥,不断重复。可以看出从前往后,虽然明文都是R,但是密文可能是S、U、并不是一一映射的关系了。
1.2 现代密码学
1.2.1 现代密码学基础知识
@1 现代密码学设计的核心法则
Kerckhoff原则:密码系统的安全性不依赖于加密体制和算法的保密,而是依赖于密钥的安全性。那现代密码学为什么这么设计呢?因为保护一个密钥比保护一个算法更容易,安全性如果依赖于算法,那么算法一旦被攻破,就彻底不安全了;反之,安全性依赖于密钥,被攻破了我换个密钥就可以了。即更换密钥比更换密码更加容易。
@2 现代密码学的设计要求
现代密码学更倾向于密码算法设计方案是公开的,而密钥匙需要保密的。现代密码学的设计要求不同于古典密码学,会严格很多,有:
- 要有严格而明确的安全定义
- 算法安全性依靠尽可能少的数学假设
- 附有严格的安全性证明
@3 无条件安全 和 安全目标
无条件安全:即使攻击者具有无限的计算资源,也无法攻破的密码体制,我们称这种密码体制是无条安全的。攻击者能拿到所有可能的明文和密文对,在这种情况下,给定攻击者一个密文,依旧无法破解对应的明文是什么,称为无条件安全。理论上讲,一次一密的密码体制是不可破译的。但在实际应用中考虑到加密算法的密钥传输代价,又是不实用的。所以实际上不存在不可破译的密码。
安全目标:无条件安全
@4 敌手模型的四种基本攻击:
- 唯密文攻击:拿到若干个密文,可以恢复出明文和密钥,属于最弱攻击。
- 已知明文攻击:拿到随机的一些明文和密文对,恢复出其他的明文和密文,属于较弱攻击。
- 选择明文攻击:拿到可选择的一些明文和密文对,恢复出其他的明文和密文,当前现代密码学 安全定位,抵御攻击。属于较强攻击。
- 选择密文攻击:拿到密文可以获得对应的明文,拿到明文可以获得对应的密文,恢复出其他密文的明文和密钥,属于最强攻击。
1.2.2 加密算法
@1 加密算法定义:
- 密钥生成子算法:安全参数N,Out:满足特定分布的密钥K,Gen
- 加密子算法:密钥K 明文M,Out:密文C,类似编码。C = enc(K,M);
- 解密子算法:密钥K 密文C,Out:明文M,类似解码。M = dec(K,C);
@2 加密算法的安全目标:
- 不能获得密钥,因为拿到密钥就可以拿到所有的明文,最易
- 不能获得明文,较易
- 不能获得明文的任何部分信息,较难
- 不能获得明文的任何函数,最难
@3 加密算法的安全性 2个维度:
- 能抵抗的攻击
- 达到的安全目标
2 对称加密 & 非对称加密 & 混合加密
2.1 对称加密
对称加密:发送端和接受端使用相同的密钥K,发送和接受消息时使用密钥加密后发送和接收。
对称加密的优点是:加密解密速度快;缺点是:会出现密钥分配问题(发送端密钥怎么才能安全的传输到接收端手里不被其他人获取到?直接发送密钥会被其他人窃取,只有用密钥加密后的信息才能安全传输,但是只有保证安全传输的前提下才能发送这个密钥)。密钥不容易被保管,也不便于安全管理。
常见的对称加密算法有DES、3DES、Blowfish、IDEA、AES等。。。
2.2 非对称加密
非对称加密:双方使用不同的密钥来加解密,并且不能通过一个密钥推算出另一个密钥。发送端和接受端使用不同的密钥K(Pubilc Key 公钥是所有人都可以访问的,Private Key 私钥是只有自己持有的)。当自己是发送端时,私钥加密,接收方公钥解密;当自己是接收端时,私钥解密,发送端公钥加密。
非对称加密优点是:不会出现密钥分配问题;缺点:加解密速度慢,且有被中间人窃听和攻击。
常见的非对称加密算法有:RSA、Diffie-Hellman、DSA等。。。
2.3 混合加密
混合加密:两种方式的整合,因为 传递大量数据时 对称加密的解析速度会更快,因此对于数据的解析使用 对称加密,但对称加密的密钥使用非对称加密传递以确保其安全性。本质上就是使用 非对称加密传递密钥,使用对称加密传递数据。
混合加密优点:加解密速度快,不会出现密钥分配问题;缺点:仍有被中间人窃听和攻击。
2.4 中间人攻击解读
到现在为止 中间人攻击 无论是对称加密/非对称加密/混合加密 都可以窃听和攻击,那这是为什么呢?接下来我们用一张图详细解读下中间人攻击的原理。
该图以对称加密为例来进行说明:
- 1-1 A给B发送密钥1,此时被C截获。
- 1-2 C拿到密钥后将密钥1替换成密钥2并发送给B。
- 1-3 B收到C发送的密钥并保存到本地。
- 2-1 A发送数据给B,被C截获并用密钥1解密出来,用密钥2加密并发给B。
- 2-2 此时B接收到C发送来的数据并解密拿到数据,以为万无一失,但通信已被监听。
如果是非对称加密,因为本质上是密钥可被截获,所以依然不能幸免,流程如下所示:
该图以非对称加密为例来进行说明:
- 1-1 A向B请求B的公钥,被C截获。
- 1-2 C向B请求B的公钥。
- 1-3 B收到C发送的请求并将B的公钥给到C。
- 1-4 C将本该发给A的B的公钥替换为C的公钥。
- 1-5 C将C的公钥发送给A,A以为是B的公钥。
- 2-1 A发送数据给B,被C截获并用C的私钥解密出来,用B的公钥加密并发给B。
- 2-2 B收到C的数据并用B的私钥解密拿到数据,以为万无一失,但通信已被监听。
至于混合加密,因为就是使用非对称加密 传递 对称加密的密钥K,所以只要能拿到密钥K那么就能进行中间人窃听和攻击,即只要能够截获非对称加密即可,因此也不安全。
3 信息摘要 和 数字签名
消息摘要算法主要用于生成数据的"指纹",具有不可逆性。也被称为哈希/散列算法。消息摘要算法的主要特征是加密过程不需要密钥,且加密过程不可逆。常见摘要算法有MD5和SHA-1等。
信息摘要算法主要用于 一致性验证、安全访问验证、数字签名:
- 一致性验证:从网络上下载文件时,有的文件为防止篡改,会通过MD5生成一串字符串。下载后 可以在本地执行MD5再生成一个字符串来对比,确认文件的一致性。
- 安全访问验证:在网站中,注册时提交的口令经过Hash计算后存入网站的数据库。验证时提交的口令同样要进行Hash计算进而和网站数据库中存储的Hash进行对比,这样的设计就可以避免用户的密码被具有系统管理员权限的用户知道以此保护敏感信息。而且即使网站的数据库被窃取,也只能拿到Hash签名,拿不到用户的真正口令。
- 数字签名:只有信息发送者产生但其他人无法伪造的一段数字串,这段数字串类似于写在纸上的物理签名,用于鉴别数字信息的真伪,同时也是对信息的发送者身份真实性的一个有效证明。数字签名是公钥加密技术与消息摘要技术的结合应用。
关于数字签名的生成流程和验证流程,这里对其流程进行更加详细的说明: