3.1 密钥——秘密的精华
- 什么是密钥:
- 密钥是一个巨大的数字,密钥空间越大,进行暴力破解就越困难。密钥空间的大小由密钥长度决定。
- 明文等于密钥。
- 信息的机密性不应该依赖于密码算法本身,而应该依赖于妥善保管的密钥。
- 各种不同的密钥
- 对称密码的密钥(共享密钥)和公钥密码的密钥(公钥-私钥,密钥对)
- 消息认证码的密钥(计算MAC)和数字签名的密钥(生成签名-验证签名)
- 用于确保机密性的密钥和用于认证的密钥
- 会话密钥(每次通信都会被更换的密钥)和主密钥(一直被重复使用的密钥)
- 用于加密内容的密钥(CEK,会话密钥通常作为CEK使用)与用于加密密钥的密钥(KEK,主密钥通常作为KEK使用)
会话密钥的好处是每次通信都会更换,但是如果生成密钥的伪随机数生成器品质不好,还有有可能被破译。
- 密钥的管理
- 生成密钥:基于随机数、基于口令
- 配送密钥:事先共享密钥、密钥分配中心、Diffie-Hellman密钥交换、公钥密码
- 更新密钥:使用共享密钥进行通信的过程中,定期改变密钥。将当前密钥的散列值作为下一个密钥。(后向安全)
- 保存密钥:我们无法记住密钥,将密钥加密后保存(KEK)。减少需要保管的密钥数量。
- 作废密钥:必须妥善删除
在此基础上:
- Diffie-Hellman密钥交换
- 基于口令的密码(PBE)
- 加密过程:1生成KEK、2生成会话密钥并加密、3加密信息
- 解密过程:1重建KEK、2解密会话密钥、3解密信息
- 盐的作用:盐为由伪随机数生成器生成的随机数,在生成密钥KEK时与口令一起输入单向散列函数。用于防御字典攻击(事先生成大量候选KEK)。
- 在使用PBE时,需要将盐和加密后的CEK通过物理方式进行保护。
- 拉伸:生成KEK时,将单项散列函数进行多次迭代的方法。
- 如何生成安全的口令
本节总结了密码技术中所使用的密钥。密钥就是密码技术的钥匙。下一节将介绍在生成密钥时需要用到的伪随机数生成器。
3.2 随机数——不可预测性的源泉
- 使用随机数的密码技术:不可预测性
- 生成密钥:用于对称密码和消息认证码
- 生成密钥对:用于公钥密码和数字签名
- 生成初始化向量(IV):用于分组密码的CBC、CFB和OFB模式
- 生成nonce:用于防御重放攻击以及分组密码的CTR模式等
- 生成盐:用于给予口令的密码(PBE)
- 随机数的性质
- 随机性——不存在统计学偏差,是完全杂乱的数列
- 不可预测性——不能从过去的数列推测出下一个出现的数
- 不可重现性——除非将数列本身保存下来,否则不能重现相同的数列
- 伪随机数生成器
- 结构:种子——内部状态——伪随机数列
- 具体的伪随机数生成器
- 杂乱的方法
- 线性同余法
- 单向散列函数法
- 密码法
- ANSI X9.17
- 对伪随机数生成器的攻击
- 对种子进行攻击
- 对随机数池进行攻击
本节介绍了随机数相关的知识。到此为止,我们已经将主要的密码技术学习完了。