《图解密码技术》总结
一. 历史上的密码
1.1. 凯撒密码:
- 将明文按照字母表进行一定的“平移”来进行加密的加密算法。
1.2. 简单替换密码:
- 两套字母表进行乱序一一对应,那么无论哪种对应关系都可以作为密码来使用。这种将明文中用到的字母表替换成另一套字母表的密码就是简单替换密码(simple substitution cipher)。如下图。
1.3. Enigma:
- 相信很多人看过由卷福饰演图灵的电影《模仿游戏》,那么对于二战时期大名鼎鼎的德国密码机Enigma一定不陌生了。
- Enigma在德语中的意思就是“谜”。
- 发明之初是作为商用的,到了纳粹时期,经过改良后用于军事用途。
- Enigma是一种由键盘、齿轮、电池和灯泡组成的机器。通过一台机器可以完成加密解密两种操作。
- 其实Enigma相当于一个密码算法, 它并不依赖于隐蔽式安全性(security by obscurity)—隐蔽式安全性:顾名思义就是依靠算法的隐蔽性来获得安全保障,一旦算法被曝光就会被破解。而Enigma密码机就算被密码破译者得到,只要不知道Enigma的设置(相当于密钥),就无法破译密码。
1.3.1 下图为Enigma进行加密通信的过程图。
1.3.2 Enigma加密
下图为Enigma进行加密nacht的过程图。
在进行通信之前,发送者和接受者都需要持有国防军密码本,这里面记载了发送者和接受者需要使用的每日密码。如果有一本国防军密码本被缴获,那就需要全部替换新的密码本。这里就涉及到密钥的配送问题。
设置Enigma
发送者查阅国防军密码本,找到当天的每日密码,并按照该密码设置Enigma。
加密通信密码
接下来,发送者需要想出3个字母(这里假设为psv),并将其加密。这3个字母称为通信密码。
由于Enigma的时代,无线电的质量很差,可能发生通信错误。所以通信密码需要连续输入两次(psvpsv),以便接受者可以进行校验。在Enigma中输入psvpsv这6个字母,则会得到对应的密文并记录,假设密文为ATCDVT(密文用大写字母表示)。
这里可以看出,每日密码其实是用来加密通信密钥的密钥。这样的密钥,一般称为密钥加密密钥(Key Encryptiong Key,KEK)。
重新设置Enigma
此时,根据通信密码(psv)重新设置Enigma。
加密信息
接下来,发送者就可以对消息进行加密了。假设消息(明文)为nacht,进过加密得到KXNWP。
拼接
最后,将2中得到的通信密码“ATCDVT”与加密后的消息“KXNWP”进行拼接,将“ATCDVTKXNWP”作为电文通过无线电发送出去。
1.3.3 Enigma解密
理解了加密步骤,解密就简单了。
- 首先将密文分成两部分,即开头6个字母ATCDVT和剩下的字母KXNWP。
- 根据和发送者相同的每日密码设置Enigma。将ATCDVT破译得到psvpsv。
- 根据psv设置Enigma。
- 然后破译剩下的字母KXNWP,得到明文nacht。
1.3.4 Enigma的弱点
- 通信密码连续输入两次。
- 通信密码人为选定。理论上通信密码应该具有不可预测性。
- 必须派发国防军密码本。前面也说了,如果泄露一本,就需要全部替换新的。
===
二. 对称密码
- 所谓对称密码,就是说加密和解密使用的是相同的密钥。
- 算法的核心是利用位运算中“异或”的方式来实现的。简单的讲:“01”组成的比特序列经过与密钥的一次“异或”
即可得到密文,再和相同的密钥进行一次“异或”就能还原明文。 - 对称密码的算法:DES、三重DES、AES(AES的标准所选定的密码算法叫作Rijndael)。
2.1 一次性密码本 — 绝对不会被破译的密码
- 原理是: 将明文和一串随机的比特序列进行XOR运算。
- 那么为什么它是无法破译的呢:无法破译并不是说不能解出明文,而是说无法判断它是否是正确的明文,因为在解密的过程(暴力破解)中所有的排列组合都会出现,因此就无法判断哪一个才是正确的明文。
===
三. 公钥密码—用公钥加密,用私钥解密
- 书里关于投币寄存柜的比喻很好:钱是关闭寄存柜的密钥,钥匙是打开寄存柜的密钥。类比公钥密码,钱就是公钥,谁都可以用来加密寄存柜,但是要打开寄存柜只能用私钥“钥匙”。
3.1 密钥配送问题
如果密钥如同密文一样通过网络直接发送,那么也很容易被窃听。那么如何解决这个问题呢。
- 通过事先共享的密钥来解决。
- 通过密钥分配中心来解决。
- 通过Diffie-Hellman密钥交换来解决。
- 通过公钥密码来解决。
3.2 那么如何通过公钥密钥来解决密钥配送问题呢
3.2.1 首先来介绍下公钥的通信流程
- Bob生成一个包含公钥和私钥的密钥对。私钥有Bob自己保管。
- Bob将公钥发送给Alice。Bob的公钥被窃听者Eve获取也没关系。将公钥发送给Alice表示让他用这个公钥加密消息并发送给Bob。
- Alice用Bob的公钥加密消息,加密后的消息只能用Bob的私钥才能解密。Alice的公钥是无法解密的。
- Alice将密文发送给Bob。这样密文就算被窃听也没有关系。
- Bob用私钥进行解密。
3.2.2 解决密钥配送问题
因此,我们可以用公钥来加密对称密码的密钥,从而解决密钥配送的问题。
3.2.3 公钥密码无法解决的问题
- 公钥密码的速度只有对称密码的几百分之一。速度问题如何解决。
- 如何判断公钥的正确合法性,这个问题是公钥认证的问题。举例:中间人攻击,如图
3.2.4 公钥密码的算法
- 算法的核心是利用mod运算(取余运算)
- 简单介绍下现在使用最广泛的公钥密码算法 — RSA
- 密文 = 明文 E MOD N (RSA加密:明文的E次方除以N的余数)
- 明文 = 密文 D MOD N (RSA解密:密文的D次方除以N的余数)
- E和N的组合就是公钥
- D和N的组合就是私钥
===
四. 混合密码系统 — 用对称密码提高速度,用公钥密码保护会话密钥
在3.2.3中提到公钥密码还有两个很大的问题。一是速度问题,二是认证问题。这一节介绍的混合密码系统可以解决第一个速度问题。第二个问题在后面的小节中介绍。
4.1 混合密码系统组成
- 用对称密码加密消息
- 通过伪随机数生成器生成对称密码加密中使用的会话秘钥
- 用公钥密码加密会话密钥(这就是解决速度问题的方法,因为对称密码的密钥一般比消息本身要短)
- 从混合密码系统外部赋予公钥密码加密时使用的密钥
4.2 混合密码系统的加密过程
4.3 混合密码系统的解密过程
===
认证部分
===
五. 单向散列函数 — 获取消息的“指纹”
5.1 什么是单向散列值(one-way hash function)
- 单向散列函数可以根据消息的内容计算出固定长度的散列值,用于验证消息的完整性。
5.2 单向散列函数的性质
- 根据任意长度的消息计算出固定长度的散列值。
- 能够快速计算出散列值。
- 消息不同散列值不同。
- 弱抗碰撞性:要找到和该条消息具有相同散列值的另一条消息是非常困难的。
- 强抗碰撞性:要找到散列值相同的两条不同的消息是非常困难的。
- 具备单向性
5.3 单向散列函数的实际应用
- 检测软件是否被篡改
- 基于口令的加密(Password Based Encryption,PBE):将口令和盐(salt,通过伪随机数生成器产生的随机值)混合后计算其散列值,然后将这个散列值用作加密的密钥。这样做可以防御针对口令的字典攻击。
- 消息认证码:消息认证码是将“发送者和接受者之间的共享密钥”和“消息”进行混合计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。
- 数字签名:数字签名一般是通过单向散列函数计算出消息的散列值,然后在这个散列值上施加数字签名。
- 伪随机数生成器
- 一次性口令:常被用于服务器对客户端的合法性认证。
5.4 单向散列函数的具体例子
- MD4、MD5
- SHA-1、SHA-256、SHA-384、SHA-512
- RIPEMD-160
===
六. 消息认证码 — 消息被正确传送了吗
6.1 什么是消息认证码
- 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称MAC。
- 消息认证码是输入包括任意长度的消息和一个发送者和接收者之间共享的密钥,它可以输出固定长度的数据,这个数据成为MAC值。
- 消息认证码是一种与密钥相关的单向散列函数。如下图
6.2 消息认证码的使用步骤图
6.3 消息认证码的密钥的配送问题
看上图就知道,共享密钥的配送问题依旧存在。解决方法也和对称密码差不多,例如公钥密码,Diffie-Hellman密钥交换等,具体项目具体安排。
6.4 消息认证码的应用实例
- SWIFT
- IPsec
- SSL/TLS
6.5 对消息认证码的攻击
- 重放攻击
- 密钥推测攻击
6.6 消息认证码无法解决的问题
- 对第三方证明。第三方无法知道消息来自A,B哪一方。(数字签名可以证明)
- 防止否认。(数字签名可以防止否认)
===
七. 数字签名 — 消息到底是谁写的
- 数字签名可以识别篡改和伪装,还可以防止否认。
- 数字签名可以看成是公钥密码的反用,如图
公钥密码与数字签名的密钥使用方式
公钥密码
数字签名
7.1 数字签名的方法
- 直接对消息签名的方法
- 对消息的散列值签名的方法(常用)
7.2 实际应用
- 安全信息公告:一些信息安全方面的组织会在其网站上发布一些安全漏洞的警告,那么如何验证这些警告信息真的是这个组织发布的呢?此时就可以用数字签名。
- 软件下载
- 公钥证书:用于验证公钥的合法性。
- SSL/TLS
7.3 通过RSA实现数字签名
- 签名 = 消息 D MOD N (消息的D次方除以N取余数)
- 由签名求得的消息 = 签名 E MOD N (签名的E次方除以N取余数)
- D和N就是签名者的私钥
- E和N就是签名者的公钥
7.4 对数字签名的攻击
- 中间人攻击。(可以通过公钥证书来防止)
- 对单向散列函数的攻击
- 利用数字签名攻击公钥密码
7.5 各类密码技术的对比
===
八 证书 — 为公钥加上数字签名
8.1 什么是证书
公钥证书(Public-Key Certificae,PKC):里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(Certification Authority、Certifying Authority, CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书简称为证书(certificate)
8.2 证书的应用场景
8.3 公钥基础设施(PKI)
就是为了能够更有效的运用公钥而制定的一系列规范和规格的总称。
组成要素:
- 用户 — 使用PKI的人
- 认证机构 — 颁发证书的人
- 仓库 — 保存证书的数据库
===
九 随机数 — 不可预测性的源泉
9.1 随机数的性质
- 随机性 — 不存在统计学偏差,是完全杂乱的数列。(弱伪随机数)
- 不可预测性 — 不能从过去的数列推测出下一个出现的数。(强伪随机数)
不可重现性 — 除非将数列本身保存下来,否则不能重现相同的数列。(真随机数)
上面三种性质中,越往下越严格。
- 对于软件所生成的数列,周期必定是有限的。凡是有限周期的数列,都不具备不可重现性。
- 要生成不可重现的随机书里额,需要从不可重现的物理现象中获取信息。
===
十 SSL/TLS — 为了更安全的通信
10.1 什么是SSL/TLS
- 是目前世界上最广泛的密码通信方法。
- 综合运用了前面提到的技术:对称密码、消息认证码、公钥密码、数字签名、伪随机数生成器等密码技术。
===
十一 密码技术与现实社会
11.1 密码学家的工具箱
11.2 密码技术与压缩技术
- 密钥是机密性的精华
- 散列值是完整性的精华
- 认证符号(MAC值和签名)是认证的精华
- 种子是不可预测性的精华