应用密码学:协议、算法与C源程序(原书第2版)

本文仅仅记录我读此书时的一些旁注笔记,阅读本文需要对照原著。

未覆盖所有知识,因为书中很容易懂的知识点我不会挑出来做笔记,做笔记的部分也未必是重点。

第一章 基础知识

古典密码学

  • 代替密码

    • 简单代替密码(明文的每一个字符被替换成密文中的另一个字符)
    • 多名码代替密码(与简单代替密码类似,唯一不同在于明文的一个字符可以映射成密文的多个字符之一)
    • 多字母代替密码(字符块成组代替,如ABA对应RTQ)
    • 多表代替密码(由多个简单的代替密码构成)
  • 换位密码(明文的字母不改变,但是顺序被打乱)
  • 简单异或
  • 一次一密乱码本
  • 隐写术

现代密码学

  • 对称算法

    • 序列密码(每次只对明文中的一个字节或一个bit运算)
    • 分组密码(每次对明文的一组bit进行运算)
  • 公开密钥算法

密码分析

  • 唯密文攻击(只有密文)
  • 已知明文攻击(已知一些密文及其对应的明文)
  • 选择明文攻击(在已知明文攻击的条件基础上,攻击者可以选择一部分明文,获取其对应的密文)
  • 自适应选择明文攻击(在选择明文攻击的条件基础上,攻击者可以基于以前的加密的结果修正这个选择)
  • 选择密文攻击(攻击者可以选择不同的密文,并可得到其对应的明文)
  • 选择密钥攻击(攻击者具有不同密钥之间关系的有关知识)
  • 软磨硬泡攻击(社工)

第二章 协议结构模块

Merkle的难题

P25,书中的翻译不太容易理解,所以自己重新描述了一下该流程。

  1. Bob产生约2^20(约一百万)个(明文x,密钥y)序列对,x各不相同,y各不相同。通过对称算法分别使用密钥y加密其对应的明文x,得到密文E(x),将这2^20个密文E(x)发给Alice
  2. Alice随机从2^20个E(x)中选一个,暴力破解出该密文采用的密钥y,顺便可以解得明文x.
  3. 采用刚刚暴力破解出的密钥y,使用对称算法,将Alice想要传达给Bob的消息x'加密成E(x')。Alice将之前爆破解得的明文x和这一步加密的密文E(x'),发给Bob.
  4. Bob收到x和E(x'),从数据库中找到明文x对应的密钥y,使用y解密E(x'),得到消息x'.
  5. x'就是本轮工作,Alice想要传递给Bob的信息。之后Alice再次发送消息,需要再次暴力破解出一个新的密钥。

本方法的安全性在于攻击者不知道Alice从2^20个密文中随机选取了哪个密文。Alice只需要爆破解得一个密文,而攻击者需要爆破全部密文。

第九章 算法类型和模式

电子密码本模式(ECB)

electronic code book

特征

一个明文分组加密成一个密文分组。

相同的明文分组永远被加密成相同的密文分组。

由于各分组之间没有联系,所以加密解密工作可以并发进行。

填充

最后一个分组多数情况下不会正好是完整的。

处理该问题的方法是填充。

方案一:填充

在最后一个分组,不足的地方填充0,最后一个字节存储填充字节数。解密后删掉尾部填充字节。

最后一个分组如果恰好是完整分组,则需要再新建一个分组作为最后一个分组。

方案二:分组挪用

对照P136的图片。

概述的话就是,最后一个完整分组(一般是倒数第二个分组)加密后的密文一分为二,一部分留作密文,另一部分与最后一个分组(不完整分组)合并,组成的新分组的长度刚好满足完整分组的长度,对此新分组加密。

问题:分组重放

ECB模式的问题在于:攻击者无需知道密钥(只需要知道明文和密文的对应关系,比如5e081bc5加密为7ea593a4),就可以重组消息(重组:类似于把一个一个汉字从书上剪下来,重新用胶水组合成一封全新的信)。

书上的一个例子是银行的消息格式,讲得很清楚,不多赘述。

密码分组链接模式(CBC)

cipher block chaining

特征

前面提到ECB面临分组重放的问题,其根本原因在于各分组之间相互独立,所以CBC模式提供了反馈的机制。前一个分组的加密结果反馈到后一个分组的加密中。

对某一个分组加密前,需要首先将明文与前一个分组的密文进行异或,然后加密。

初始化向量(IV)

虽然反馈可以解决分组重放的问题,但是新的问题来了(其实ECB也有这个问题):任意两则消息在他们出现第一处不同之前,将被加密成相同的结果。

书中这句话不太容易理解(完全是翻译的锅),其实很简单,两个类似的消息,比如同一场考试的准考证信息,不管你是谁,准考证开头的注意事项都是完全一致的,在分组加密这些信息时,得到的密文都是一样的,直到遇到姓名、准考证等这些不同的信息时,密文才开始不同。

攻击者可能会利用这些相同的密文来分析密码。

方法也是有的,那就是给出一个初始化向量IV,这个IV每次都是随机的(书中说应为唯一的,我感觉有点怪,如果IV是唯一的,那么还引入IV干嘛?相同的明文还是加密为相同的密文。查阅了一些资料,上面说IV是随机的)

IV与第一个明文分组异或,后面的流程和上面的一样。

IV与密文一同传递给第二方,IV可以不必保密。

为什么不需要?因为IV仅仅是为了保证对相同密钥相同明文的情况下,加密得到不同的密文(得益于IV的每次加密都随机),而没有其他作用,IV对密文的破译没有任何影响。

退一万步,IV用于与第一个明文异或,然而后面的n-1个分组密文都是暴漏的,这n-1个分组密文与其后的分组明文分别异或,IV的作用其实就相当于这n-1个分组密文,都是与分组明文异或。既然n-1个分组密文都是暴漏的(因为传输啊!密文肯定是允许泄漏的,不然你加密他干嘛?),那就没必要把IV保密。

Last modification:March 22nd, 2020 at 05:11 pm