第一部分 概述 2
第1章 密码学研究范围 2
1.1 密码学的作用 2
1.2 木桶原理 3
1.3 对手设定 4
1.4 专业偏执狂 5
1.4.1 更广泛的好处 5
1.4.2 攻击 5
1.5 威胁模型 6
1.6 密码学不是唯一解决方案 7
1.7 密码学是非常难的 8
1.8 密码学是简单的部分 8
1.9 通用攻击 9
1.10 安全性和其他设计准则 9
1.10.1 安全性和性能 9
1.10.2 安全性和特性 10
1.10.3 安全性和演变的系统 11
1.11 更多阅读材料 11
1.12 专业偏执狂练习 12
1.12.1 时事练习 12
1.12.2 安全审查练习 12
1.13 习题 13
第2章 密码学简介 14
2.1 加密 14
2.2 认证 15
2.3 公钥加密 16
2.4 数字签名 17
2.5 PKI 18
2.6 攻击 18
2.6.1 唯密文攻击模型 19
2.6.2 已知明文攻击模型 19
2.6.3 选择明文攻击模型 19
2.6.4 选择密文攻击模型 19
2.6.5 区分攻击的目的 20
2.6.6 其他类型的攻击 20
2.7 深人探讨 20
2.7.1 生日攻击 20
2.7.2 中间相遇攻击 21
2.8 安全等级 22
2.9 性能 22
2.10 复杂性 23
2.11 习题 24
第二部分 消息安全 26
第3章 分组密码 26
3.1 什么是分组密码 26
3.2 攻击类型 27
3.3 理想分组密码 27
3.4 分组密码安全的定义 28
3.5 实际分组密码 30
3.5.1 DES 30
3.5.2 AES 32
3.5.3 Serpent 34
3.5.4 Twofish 34
3.5.5 其他的AES候选算法 36
3.5.6 如何选择分组密码 36
3.5.7 如何选择密钥长度 36
3.6 习题 37
第4章 分组密码工作模式 39
4.1 填充 39
4.2 ECB 40
4.3 CBC 40
4.3.1 固定IV 40
4.3.2 计数器IV 41
4.3.3 随机IV 41
4.3.4 瞬时IV 41
4.4 OFB 42
4.5 CTR 43
4.6 加密与认证 44
4.7 如何选择工作模式 44
4.8 信息泄露 44
4.8.1 碰撞的可能性 45
4.8.2 如何处理信息泄露 46
4.8.3 关于数学证明 46
4.9 习题 47
第5章 散列函数 48
5.1 散列函数的安全性 48
5.2 实际的散列函数 49
5.2.1 一种简单但不安全的散列函数 50
5.2.2 MD5 50
5.2.3 SHA-1 51
5.2.4 SHA-224、SHA-256、SHA-384和SHA-512 51
5.3 散列函数的缺陷 52
5.3.1 长度扩充 52
5.3.2 部分消息碰撞 52
5.4 修复缺陷 53
5.4.1 一个临时的修复方法 53
5.4.2 一个更有效的修复方法 53
5.4.3 其他修复方法 54
5.5 散列算法的选择 55
5.6 习题 55
第6章 消息认证码 56
6.1 MAC的作用 56
6.2 理想MAC与MAC的安全性 56
6.3 CBC-MAC和CMAC 57
6.4 HMAC 58
6.5 GMAC 59
6.6 如何选择MAC 60
6.7 MAC的使用 60
6.8 习题 61
第7章 安全信道 63
7.1 安全信道的性质 63
7.1.1 角色 63
7.1.2 密钥 63
7.1.3 消息或字节流 64
7.1.4 安全性质 64
7.2 认证与加密的顺序 65
7.3 安全信道设计概述 66
7.3.1 消息编号 66
7.3.2 认证 67
7.3.3 加密 67
7.3.4 组织格式 68
7.4 详细设计 68
7.4.1 初始化 68
7.4.2 发送消息 69
7.4.3 接收消息 70
7.4.4 消息的顺序 71
7.5 备选方案 71
7.6 习题 72
第8章 实现上的问题Ⅰ 74
8.1 创建正确的程序 75
8.1.1 规范 75
8.1.2 测试和修复 75
8.1.3 不严谨的态度 76
8.1.4 如何着手 76
8.2 制作安全的软件 77
8.3 保守秘密 77
8.3.1 清除状态 77
8.3.2 交换文件 79
8.3.3 高速缓冲存储器 79
8.3.4 内存保留数据 80
8.3.5 其他程序的访问 82
8.3.6 数据完整性 82
8.3.7 需要做的工作 83
8.4 代码质量 83
8.4.1 简洁性 83
8.4.2 模块化 83
8.4.3 断言 84
8.4.4 缓冲区溢出 84
8.4.5 测试 85
8.5 侧信道攻击 85
8.6 一些其他的话 86
8.7 习题 86
第三部分 密钥协商 88
第9章 生成随机性 88
9.1 真实随机 88
9.1.1 使用真实随机数的问题 89
9.1.2 伪随机数 89
9.1.3 真实随机数和伪随机数生成器 90
9.2 伪随机数生成器的攻击模型 90
9.3 Fortuna 91
9.4 生成器 91
9.4.1 初始化 93
9.4.2 更新种子 93
9.4.3 生成块 94
9.4.4 生成随机数 94
9.4.5 生成器速度 95
9.5 累加器 95
9.5.1 熵源 95
9.5.2 熵池 96
9.5.3 实现注意事项 97
9.5.4 初始化 98
9.5.5 获取随机数据 99
9.5.6 添加事件 100
9.6 种子文件管理 101
9.6.1 写种子文件 101
9.6.2 更新种子文件 101
9.6.3 读写种子文件的时间 102
9.6.4 备份和虚拟机 102
9.6.5 文件系统更新的原子性 103
9.6.6 初次启动 103
9.7 选择随机元素 103
9.8 习题 104
第10章 素数 106
10.1 整除性与素数 106
10.2 产生小素数 107
10.3 素数的模运算 109
10.3.1 加法和减法 109
10.3.2 乘法 110
10.3.3 群和有限域 110
10.3.4 GCD算法 111
10.3.5 扩展欧几里得算法 111
10.3.6 模2运算 112
10.4 大素数 113
10.4.1 素性测试 115
10.4.2 计算模指数 117
10.5 习题 118
第11章 Diffie-Hellman协议 119
11.1 群 119
11.2 基本的DH 120
11.3 中间人攻击 121
11.4 一些可能的问题 122
11.5 安全的素数 122
11.6 使用较小的子群 123
11.7 p的长度 124
11.8 实践准则 125
11.9 可能出错的地方 126
11.10 习题 127
第12章 RSA 128
12.1 引言 128
12.2 中国剩余定理 128
12.2.1 Garner公式 129
12.2.2 推广 129
12.2.3 应用 130
12.2.4 结论 130
12.3 模n乘法 130
12.4 RSA 131
12.4.1 RSA数字签名 131
12.4.2 公开指数 132
12.4.3 私钥 132
12.4.4 n的长度 133
12.4.5 生成RSA密钥 133
12.5 使用RSA的缺陷 135
12.6 加密 136
12.7 签名 138
12.8 习题 139
第13章 密码协议导论 141
13.1 角色 141
13.2 信任 141
13.3 动机 143
13.4 密码协议中的信任 144
13.5 消息和步骤 144
13.5.1 传输层 145
13.5.2 协议标识符和消息标识符 145
13.5.3 消息编码和解析 146
13.5.4 协议执行状态 146
13.5.5 错误 147
13.5.6 重放和重试 147
13.6 习题 149
第14章 密钥协商 150
14.1 初始设置 150
14.2 初次尝试 150
14.3 协议会一直存在下去 151
14.4 一个认证的惯例 152
14.5 第二次尝试 152
14.6 第三次尝试 153
14.7 最终的协议 154
14.8 关于协议的一些不同观点 155
14.8.1 Alice的观点 155
14.8.2 Bob的观点 155
14.8.3 攻击者的观点 156
14.8.4 密钥泄露 157
14.9 协议的计算复杂性 157
14.10 协议复杂性 158
14.11 一个小警告 159
14.12 基于口令的密钥协商 159
14.13 习题 159
第15章 实现上的问题Ⅱ 160
15.1 大整数的运算 160
15.1.1 woop技术 161
15.1.2 检查DH计算 163
15.1.3 检查RSA加密 163
15.1.4 检查RSA签名 164
15.1.5 结论 164
15.2 更快的乘法 164
15.3 侧信道攻击 165
15.4 协议 166
15.4.1 安全信道上的协议 166
15.4.2 接收一条消息 167
15.4.3 超时设定 168
15.5 习题 168
第四部分 密钥管理 170
第16章 时钟 170
16.1 时钟的使用 170
16.1.1 有效期 170
16.1.2 唯一值 170
16.1.3 单调性 170
16.1.4 实时交易 171
16.2 使用实时时钟芯片 171
16.3 安全性威胁 171
16.3.1 时钟后置 171
16.3.2 时钟停止 172
16.3.3 时钟前置 172
16.4 建立可靠的时钟 173
16.5 相同状态问题 173
16.6 时间 174
16.7 结论 175
16.8 习题 175
第17章 密钥服务器 176
17.1 基本概念 176
17.2 Kerberos协议 176
17.3 更简单的方案 177
17.3.1 安全连接 177
17.3.2 建立密钥 178
17.3.3 重新生成密钥 178
17.3.4 其他性质 178
17.4 如何选择 178
17.5 习题 179
第18章 PKI之梦 180
18.1 PKI的简短回顾 180
18.2 PKI的例子 180
18.2.1 全局PKI 180
18.2.2 VPN访问 181
18.2.3 电子银行 181
18.2.4 炼油厂传感器 181
18.2.5 信用卡组织 181
18.3 其他细节 181
18.3.1 多级证书 181
18.3.2 有效期 182
18.3.3 独立的注册机构 182
18.4 结论 183
18.5 习题 183
第19章 PKI的现实 184
19.1 名字 184
19.2 授权机构 185
19.3 信任 186
19.4 间接授权 186
19.5 直接授权 187
19.6 凭证系统 187
19.7 修正的梦想 188
19.8 撤销 189
19.8.1 撤销列表 189
19.8.2 短有效期 190
19.8.3 在线证书验证 190
19.8.4 撤销是必需的 190
19.9 PKI有什么好处 191
19.10 如何选择 192
19.11 习题 192
第20章 PKI的实用性 193
20.1 证书格式 193
20.1.1 许可语言 193
20.1.2 根密钥 193
20.2 密钥的生命周期 194
20.3 密钥作废的原因 195
20.4 深入探讨 196
20.5 习题 196
第21章 存储秘密 197
21.1 磁盘 197
21.2 人脑记忆 197
21.3 便携式存储 200
21.4 安全令牌 200
21.5 安全UI 201
21.6 生物识别技术 201
21.7 单点登录 202
21.8 丢失的风险 202
21.9 秘密共享 203
21.10 清除秘密 203
21.10.1 纸 203
21.10.2 磁存储介质 204
21.10.3 固态存储 204
21.11 习题 205
第五部分 其他问题 208
第22章 标准和专利 208
22.1 标准 208
22.1.1 标准过程 208
22.1.2 SSL 210
22.1.3 AES:竞争带来的标准化 210
22.2 专利 211
第23章 关于专家 212
参考文献 215
索引 225