Table of Contents:

第1章:环游密码世界

口令:password, passcode, pin(Personal Identification Number)
编码:encode
密码:cryptography

主要技术
对称密码是指在加密和解密时使用同一密钥的方式。
公钥密码是指在加密和解密时使用不同密钥的方式,又称为非对称加密。
将对称密码和公钥密码结合起来的密码方式称为混合密码系统
单项散列函数,用于保证完整性,数据没有被篡改过。
消息认证码,确认消息是否来自所期望的对象,但不能防止发送者的否认。
数字签名能够保证数据不会被篡改,也防止发送者的否认。
伪随机数生成器是一种能够模拟产生随机数列的算法,同时承担着密钥生成的重要职责。

密码与信息安全常识
* 不要使用自创的密码算法
* 使用低强度的密码比不进行任何加密更危险
* 任何密码总有一天都会被破解
* 密码只是信息安全的一部分

第2章:历史上的密码

密钥空间,所有可用密钥的总数就是密钥空间的大小,空间越大,暴力破解越困难。
频率分析破译:通过分析语言中高频使用字母及单词达到破译效果。

第3章:对称密码

将现实世界中的东西映射为比特序列的操作称为编码。
XOR,异或,相同为0 ,不同为1。
比特序列的异或,将明文 A 用密钥 B 进行加密,得到密文 A XOR B,将密文 A XOR B 用密钥 B 进行解密,得到明文 A。

DES(Data Encryption Standard),可被短时间破译,不推荐使用。

三重 DES,为了增加 DES 的强度,将DES 重复3次所得到的一种密码算法。
加密过程为:加密,解密,加密,这么做的目的是为了能够让三重DES 兼容普通的 DES。
AES(Advanced Encryption Standard)取代DES。通过评选,最终选择 Rijndael。

第4章:分组密码的模式

分组密码是每次只能处理特定长度的一块数据的一类密码算法,一个分组的比特书就称为分组长度
例如 DES 和三重 DES 的分组长度都是 64 比特,也就是说一次只能加密64 比特的明文,并生成64 比特的密文。

第5章:公钥密码

公钥密码解决的问题:密钥发送
私钥加密公钥解密,或公钥加密私钥解密,

第6章:混合密码系统

公钥密码劣势:
1. 公钥密钥处理速度远远低于对称密码
2. 公钥密码难以抵御中间人攻击

混合密码机制:
用非对称秘钥传送对称密码(回话秘钥),之后用回话秘钥传送密文

第7章:单向散列函数--获取消息的指纹

单向散列函数(one-way hash function),有一个输入和输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以用来检查消息的完整性。
特性:
* 根据任意长度的消息计算出固定长度的散列值
* 能够快速计算出散列值
* 消息不同散列值也不同
两个不同的消息产生一个散列值的情况称为碰撞(collision),难以发现碰撞的性质称为抗碰撞性
要找到和该条消息具有相同散列值的另一条消息是非常困难的,这一性质称为弱抗碰撞性
要找到散列值相同的两条不同的消息是非常困难的,这一性质称为强碰撞性
密码学中使用的单向散列函数,不仅要具备弱抗碰撞性,还要具备强抗碰撞性
* 具备单向性

实际应用:
* 检测软件是否被篡改
* 基于口令的加密
* 消息认证码
* 数字签名
* 伪随机数生成器
* 一次性口令

具体例子:
* MD4,MD5(不安全)
* SHA-1(碰撞攻击算法由山东大学王小云提出)
* SHA-2(一共六个版本 SHA-256,SHA-512等,主要区别是生成的位数不同,目前也安全)
* RIPEMD-160(RIPEMD的强碰撞性已经被攻破,RIPEMD-160还没有,比特币用的就是RIPEMD-160)
* SHA-3(安全)

Keccak

Keccak是一种被选定为SHA-3标准的单向散列函数
对单向散列函数的攻击:
* 暴力破解:对单向散列函数进行暴力破解时,每次改变一下消息值然后对这些消息求散列值,这相当于尝试破解单向散列函数的“弱抗碰撞性”的攻击。
* 生日攻击:生日攻击是找到散列值相同的两条消息,而散列值则可以是任意值,这相当于尝试破解单向散列函数的“强抗碰撞性”的攻击。
单向散列函数能够辨别出篡改,但是无法辨别出伪装。

第8章:消息认证码--消息被正确传送了吗

消息的完整性(integrity):消息没有被篡改,也叫一致性
消息的认证(authentication):消息来自正确的发送者
消息认证码(message authentication code)是一种确认完整性并进行认证的技术,简称为MAC
消息认证码的输入是任意长度的消息和一个发送者与接收者之间的共享的密码,它可以输出固定长度的数据,这个数据称为MAC值
消息认证码是一种与密钥相关联的单向散列函数

消息认证码的多种实现方式

无法解决的问题:
* 对第三方证明
* 防止否认

第9章:数字签名--消息到底是谁写的

私钥签名,公钥验证
消息认证码无法防止否认,发送者与接收者共享同一个密钥,对第三方来说,无法确认消息是谁发送的
数字签名是一种将相当于现实世界中的盖章,签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。

数字签名的过程

对消息的散列值进行签名(A向B发送)
1. A生成密钥对
2. A对消息生成散列值
3. A用私钥对散列值签名(加密)
4. A向B发送消息和签名
5. B生成A消息的散列值
6. B用公钥解密签名并和散列值对比是否一样

通过RSA实现数字签名

第10章:证书--为公钥加上数字签名

公钥证书(PKC)里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(certifying authority,CA)施加数字签名。
只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人

典型使用流程:
1. 接收者生成密钥对
2. 接收者在认证结构 Trent 注册自己的公钥
3. 认证结构 Trent 用自己的私钥对 Bob 的公钥施加数字签名并生成证书
4. 发送者得到带有认证机构 Trent 的数字签名的接收者的公钥(证书)
5. 发送者使用认证机构 Trent 的公钥验证数字签名,确认接收者公钥的合法性
6. 发送者使用接收者的公钥加密消息并发送到接收者
7. 接收者使用自己的私钥解密密文得到发送者的消息

公钥基础设施(PKI)

公钥基础设施是为了能够更有效的运用公钥而指定的一系列规范和规格的总称,简称 PKI。
组成要素:
* 用户—使用 PKI 的人
* 认证机构(CA)—颁发证书的人
* 仓库—保存证书的数据库
认证机构的工作:
* 生成密钥对
* 注册证书
* 作废证书与CRL

第11章:密钥--加密的精华

密钥就是一个巨大的数字,数字本身不重要,重要的是密钥空间的大小,空间越大,暴力破解就越困难,空间的大小是由密钥长度决定的。
密钥与明文是等价的,明文的价值就是密钥的价值。
密钥分类:
* 会话密钥:密钥是仅限于本次通话的一次性密钥,下次通信就不能使用
* 主密钥:一直被重复使用的密钥
* 内容加密密钥(CEK):加密的对象是用户直接使用的消息
* 密钥加密密钥(KEK):加密的对象是密钥
密钥的用途:
* 在对称密码中,由于发送者和接收者之间需要共享密钥,因此对称密钥又称为共享密钥密码。
* 在公钥密码中,加密和解密使用的是不同的密钥,加密的是公钥,解密的是私钥,私钥也称为私密密钥,公钥与私钥也称为密钥对。
* 对称密码和公钥密钥的密钥都是用于确保机密性的密钥,相对的,消息认证码和数字签名所使用的密钥,则是用于认证的密钥。

第12章:随机数

为了不让攻击者看穿而使用随机数。
应用场景:
* 生成密钥
用于对称密码和消息认证码
* 生成密钥对
用于公钥密码和数字签名
* 生成初始化向量
用于分组密码的 CBC、CFB、OFB 模式
* 生成 nonce
用于防御重放攻击以及分组密码的 CTR 模式等
* 生成盐
用于基于口令的密码等
随机数的性质:
* 随机性—不存在统计学偏差,完全杂乱的数列
* 不可预测行—不能从过去的数列推测出下一个出现的数
* 不可重现性—除非将数列本身保存下来,否则不能重现相同的数列

第14章:SSL/TLS

SSL(Secure Socket Layer)
TLS(Transport Layer Security)
当 Web 浏览器发送请求时,请求的数据会作为客户端请求发送给服务器,如果通信内容被窃听者所窃取,那么窃听者就会得到请求数据。可以使用 SSL/TLS 作为对通信进行加密的协议,然后再次智商承载 HTTP。通过将两种协议进行叠加,我们就可以对HTTP 的通信进行加密,防止窃听。通过 SSL/TLS 进行通信时,URL 以 https 开头。
解决问题:
机密性问题
解决方式:对称密码、伪随机数生成器、公钥密码
完整性问题
解决方式:消息认证码
认证问题
解决方式:数字签名
SSL 与 TLS 区别:
SSL 是 1994年由网景公司设计的一种协议,于1995年发布了3.0 版本。
TLS 设市 IETF 基于 SSL 3.0 版本的基础上设计的协议,在 1999年发布了 TLS 1.0 版本,实际上相当于 SSL 3.1。2006 年发布 TLS 1.1 版本,在对称密码算法中加入了 AES 支持。
SSL/TLS 使用到的密码技术:
公钥密码
加密预备主密码
单向散列函数
构成伪随机数生成器
数字签名
验证服务器和客户端的证书
伪随机数生成器
生成预备主密码
根据主密码生成密钥
生成初始化向量
对称密码
确保片段的机密性
消息认证码
确保片段的完整性并进行认证

第15章:密码技术与现实社会

密码的作用是为了确保机密性,将明文转换为密文。转换之后,密文不需要保护了,需要保护的是加密时使用的密钥。通过保护较短的密钥来保护较长的明文,称为机密性的压缩。
单向散列函数时用于确认完整性的,不必检查较长的明文的完整性,只要检查散列值就能确认,这种做法称为完整性的压缩。
消息认证码和数字签名都是用于认证的技术,通过较短的认证富豪来对较长的消息进行认证,称为认证的压缩。
只有完美的密码,没有完美的人。