《图解密码算法》 阅读笔记

2019-11-20 · 25 min read

第一章 环游密码世界

1.1 概要 了解密码的世界概况

1.2 密码

  • 发送者、接收者和窃听者
  • 加密、解密与破译
  • 密码算法和密钥

1.3 对称密码和非对称(公钥)密码: 对称密码指的是在加密和解密中使用同一种密钥的方式 非对称密码在加密和解密种使用不同密钥(公钥和私钥) 混合密码系统:结合对称加密和非对称加密

1.4 其他密码技术:

  • 单向散列函数-保证文件、数据的完整性

有安全意识的软件发布者会在发布软件时候同时发布该软件的散列值,该散列值由单向散列函数计算得出.下载的人可以自行计算下载文件的散列值,若与发布者的散列值一致,则说明下载的软件是完整的,没有丢失或者被篡改过.

  • 消息认证码(message authentication code)

不但可以确认消息是否被篡改,而且可以确认消息是否来自所期待的通信对象

  • 数字签名

解决消息伪装,篡改否认的技术

  • 伪随机数生成器

模拟产生随机数列的算法.随机数承担着密钥生成的重要责任.例如在SSL\TLS通信时,会产生一个仅用于当前通信的临时密钥,这个密钥就是随机数生成器生成的.如果生成随机数的算法不好,窃听者就能够推测出密钥,从而带来痛惜机密性下降的风险

1.5 密码学家的工具箱:

对称密码        // 机密性(窃听)
公钥密码        // 机密性(窃听)

单向散列函数    //              完整性(篡改)
消息认证码      //              完整性(篡改)  认证(伪装)
数字签名        //              完整性(篡改)  认证(伪装) 不可否认性(否认)

伪随机数生成器

1.6 隐写术与数字水印 密码隐藏的是内容,隐写术隐藏的是消息本身.数字水印技术运用了隐写术的方法,将著作权拥有者及购买者的信息嵌入文件中.

1.7 密码与信息安全常识

不要使用保密的密码算法
(密码算法的秘密早晚会公诸于世,而现在世界上公认得强度较高的密码算法几乎都是经过密码破译者长期尝试破解未果而存货下来的)

使用低强度的密码比不进行任何加密更危险
(低强度的密码并不安全,而且更危险在于让用户麻痹大意觉得自己的信息是受密码保护的)

任何密码总有一天会被破解

密码只是信息安全的一部分(攻击链)

第二章 历史上的密码-写一篇别人看不懂的文章

2.1 概要

  • 凯撒密码

  • 简单替换密码

  • Enigma

  • 暴力攻击

  • 频率分析

2.2 凯撒密码 Caeser cipher

2.3 简单替换密码 暴力破解: 26! 频率分析

2.4 Enigma 二战中德国使用的Enigma密码机

2.5 思考 为什么要将密码算法和密钥分开?

第三章 对称密码(共享密钥密码)- 用相同的密钥进行加密解密

3.1 理解对称密码-炒鸡蛋和对称密码

3.2 本章概要

  • XOR
  • 一次性密码本(绝对无法破译的密码,也无法在实际情况下应用)
  • DES, 三重DES, AES

3.3 从文字密码到比特序列码 编码 ASCII XOR 异或运算(相同为1,不同为0)

3.4 一次性密码本 是什么 怎么加密,解密 为什么无法破译

为什么无法实际应用? 密钥的配送,保存,重用,同步,生成

总结: 能使用一次性密码本地的,只有那些机密性胜过一切,且可以花费大量财力和人力来生成并配送密钥的场景.例如,据说大国之间的热线就使用了一次性密码本,这种情况下估计会有专门的特工来承担配送密钥的任务. 一次性密码本几乎没有实用性,但是根据此思路孕育出了流密码stream cipher

3.5 DES

什么是DES? Data Encryption Standard DES是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(DES之前一直被美国等的政府和银行等广泛使用) 现在DES已经能够被暴力破解了. 1999年的算力就已经能在22小时左右破解DES 现在除了用它来解密以前的文件(还可以暴力破解),不应该再使用DES

DES的加密和解密 DES以64比特的明文作为一个单位进行加密 Feistel网络 轮函数 XOR 差分分析和线性分析

3.6 三重DES

3.7 AES Advance Encryption Standard Rijndael AES的选拔 AES 120 192 256密钥长度规格

第四章 分组密码的模式

4.1 概要 什么是分组密码?

ECB Electtronic CodeBook mode(电子密码本模式)
CBC Cipher Block Chaining mode(密码分组链接模式)
CFB Cipher FeedBack mode(密文反馈模式)
OFB Output FeedBack mdoe(输出反馈模式)
CTR CounTeR mode(计数器模式)

4.2 分组密码的模式

4.3 ECB模式 明文分组和密文分组一一对应 攻击者无需破译密码就可以操纵明文(只要交换分组的顺序就可以使得接收者解码时获得被篡改后的信息)

4.4 CBC模式

第五章 公钥密码

公钥加密的消息,只能用私钥解密 中间人攻击

第六章 混合密码系统

使用公钥加密对称秘钥,对称秘钥加密消息, 传送公钥加密后的秘钥和对称秘钥加密后的消息

A向B发送消息:
B事向A发送自己的公钥并确认对称加密方式,A使用公钥加密对称秘钥,用对称秘钥加密消息

B收到加密后的对称秘钥,和对称秘钥加密后的消息
B使用私钥解密对称秘钥,用对称秘钥解密消息

第七章 单向散列函数

  • 验证文件、数据是否篡改 (完整性、一致性)

单向散列函数有一个输入和一个输出,输出称为消息,输出称为散列值

2021 03 05 14 03 39

散列的长度和消息的长度无关。无论消息的大小是1比特、100GB,单向散列函数都会计算出固定长度的散列值。 2021 03 05 14 05 12

  • 根据任意长度的消息计算出固定长度的散列值
  • 能够快速计算出散列值
  • 消息不同散列值也不同(两个不同的消息产生同一个散列值的情况被称为碰撞
  • 单向性,单向散列函数必须具备单向性,无法通过散列值反算出消息的性质。

难以发现碰撞的性质被称为抗碰撞性,密码技术中所使用的单向散列函数,都需要具备抗碰撞性

2021 03 05 14 09 00

实际应用:

  • 检测软件是否被篡改

2021 03 05 14 10 36

  • 基于口令的加密 PBE(Password Based Encryption)

将口令和盐(salt,通过伪随机数生成器产生的随机值)混合后计算其散列值。 然后将这个散列值用作加密的秘钥。通过这样的方法可以防御针对口令的字典攻击,详细内容在11章介绍。

  • 消息认证码

使用单向散列函数可以构造消息认证码 消息认证码是将”发送者和接受者之间的共享秘钥”和“消息”进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。 消息认证码在SSL/TLS中也得到了运用,关于SSL/TLS我们将在第14章中介绍

  • 数字签名

在进行数字签名时,会用到单向散列函数 数字签名是现实社会中签名和盖章这样的行为在数字世界中的实现。数字签名的处理过程十分耗时,因此不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对整个散列值进行数字签名,详细内容在第九章中介绍

  • 伪随机数生成器

单向散列函数可以构造伪随机数生成器 密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。详细内容在12章进行介绍。

  • 一次性口令

使用单向散列函数可以构造一次性口令(one-time password)一次性口令经常被用于服务器对客户端的合法性认证。 在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次,因此即使窃听者窃取了口令也无法使用。

单向散列函数的具体例子:

  • MD4、MD5

MD是消息摘要(Message Digest)的缩写 MD4 1990由Rivest设计的单向散列函数,能够产生128比特的散列值。已经不安全了,被Dobbertin提出了碰撞方法 MD5 1991年Rivest设计的单向散列函数,能够产生128比特的散列值。也已经不安全了

  • SHA-1、SHA-256、SHA-384、SHA-512

都是由NIST(National Institude of Standard and Technology 美国国家标准技术研究所)设计的单向散列函数。 SHA-1已与2005年被碰撞,SHA-2尚未被攻破。 2021 03 05 14 30 32

  • RIPEMD-160

产生160比特的单向散列函数,RIPEMD2004年被攻破,但RIPEMD-160尚未被攻破。 比特币中使用的就是RIPEMD-160

  • SHA-3

2012年 经过NIST选拔产生的SHA-3

应该使用哪种单向散列函数: 2021 03 05 14 34 20

7.8 对单向散列函数的攻击

7.8.1 暴力破解

暴力破解需要尝试的次数可以根据散列值的长度计算出来,以SHA3-512为例,由于它的散列值长度为512比特,因此最多需要尝试2^512次就能够找到目标消息了,如此多的尝试在现实中是不可能完成的。

原像攻击:给定一个散列值,找出具有该散列值的任意消息 第二原像攻击:给定一条消息1,找出另外一条消息2,消息2的散列值和消息1相同

7.8.2 生日攻击(攻击故事2)

生日悖论:任意散列值一致的概率比想象中要高 2021 03 05 14 43 20

7.9 单向散列函数无法解决的问题

消息认证码解决问题:消息的篡改

单向散列函数可以辨别出篡改,但是无法辨别出伪装 当我们不仅需要确认文件的完整性,同时还需要确认这个文件来源是否是真的发送者时候,我们还需要进行认证

用于认证的技术包括消息验证码数字签名

  • 消息认证码能够向通信对象保证消息没有被篡改(和伪装),
  • 数字签名不仅能够向通信对象保证消息没有被篡改(和伪装),还能够向所有第三方做出这样的保证

认证需要使用密钥,通过对消息附加发送者的密钥(只有发送者才知道的秘密信息),来确保消息真的属于发送者

2021 03 05 14 52 18

2021 03 05 14 52 56

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

消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,简称MAC

消息认证码是一种与密钥相关联的单向散列函数 2021 03 05 14 58 01

消息认证码的使用步骤: 2021 03 05 14 58 37 在消息认证码中,需要发送者和接收者之间共享密钥(来自发送者的密钥,以确认确实是发送者发的),而这个密钥不能被主动攻击者获取。如果密钥被攻击者获取,则攻击者也可以计算出消息认证码从而自由的篡改和伪装进行攻击,这样以来消息认证码就没用了。 密钥配送问题:密钥共享使用非对称加密方式进行密钥配送,如公钥密码、Diffie-Hellman密钥交换、密钥分配中心等根据具体的场景进行选择。

8.3 消息认证码的应用实例

  • SWIFT

全称是(Society for Worldwide Interbank Financial Telecommunication环球金融电信协会) 银行与银行之间是通过SWIFT来传递交易信息的。而为了确认消息的完整性,以及对消息来源进行验证,SWIFT中使用了消息验证码 在使用公钥密钥进行密码交换之前,SWIFT消息认证码所使用的共享密钥都是由人来进行配送的。

  • IPsec

IPsec是对互联网基本通信协议-IP协议(Internet Protocol)增加安全的一种方式。在IPsec中,对通信内容的认证和完整性校验都是采用消息认证码来完成的。

  • SSL/TLS

SSL/TLS中对通信内容的认证和完整性校验也使用了消息认证码。在14章中进行详细介绍

8.4 消息认证码的实现

  • 使用单向散列函数实现,如SHA+密钥实现
  • 使用分组密码算法实现,如对称密码AES之类的分组密码:AES-CMAC
  • 其他实现方法,使用流密码和公钥密码等也可以实现消息认证码

8.5 认证加密

认证加密是将对称密码和消息认证码相结合,同时满足机密性、完整性和认证三大功能。

GCM 和 GMAC

8.6 HMAC

8.7 对消息认证码的攻击

  • 重放攻击

2021 03 05 15 18 23 2021 03 05 15 22 20

  • 防御重放攻击:

    • 消息序号:约定对每次消息都赋予一个递增的序号,并且在计算mac值时把序号也包含进去,这样,攻击者无法计算序号递增后的mac值。这种方法虽然有效,但是对每个通信对象都需要记录最后一个消息的序号
    • 时间戳

    2021 03 05 15 21 59

    • nonce:

    2021 03 05 15 22 36

  • 密钥推测攻击

和单向散列函数一样,对消息认证码也可以进行暴力破解(7.8.1)和生日攻击(7.8.2) 对于消息认证码来说,应保证不能根据MAC值推测出通信双方所使用的密钥

此外,在生成消息认证码所使用的密钥时,必须使用密码学安全的、高强度的随机数生成器。如果密钥是人为选定的,则会增加密钥被推测的风险。

8.8 消息认证码无法解决的问题

消息认证码解决问题:消息的篡改和伪装(认证来源)

  • 无法对第三方的证明

2021 03 05 15 28 05

  • 需要共享密钥
  • 无法证明这个mac值就是当时发送者计算出来的(也可能是自己伪造消息计算出的mac值,因为自己也有密钥)
  • 无法防止否认

2021 03 05 15 30 29

2021 03 05 15 34 17

第九章 数字签名

2021 03 05 15 36 30

  • 发送者和接受者不共享密钥
    • 使用不同的密码
    • 发送者的密钥可以进行签名
    • 接受者的密钥不可以生成签名,但可以验证签名(即可以验证篡改、伪装和防止否认)

其实,数字签名就是将公钥密码“反过来用”而实现的

2021 03 05 15 39 09

公钥密码: 发送者使用接收者的公钥进行加密,接受者用自己的私钥进行解密 2021 03 05 15 39 30

数字签名: 发送者使用自己的私钥进行加密(签名),接受者使用发送者的公钥进行解密(签名验证) 2021 03 05 15 42 10

为何加密相当于生成签名,而解密相当于验证签名呢? 2021 03 05 15 45 08 2021 03 05 15 44 15

9.4 数字签名的方法

  • 直接对消息签名的方法

2021 03 05 15 46 10 2021 03 05 15 46 24

  • 对消息散列值进行签名的方法

由于公钥密码比较慢,于是我们不必再对整个消息进行加密(签名),而是先用单向散列函数求出消息的散列值,然后再对散列值进行加密(对散列值签名) 无论消息有多长,散列值永远都是这么段,因此对其进行加密(签名)是非常轻松的。

2021 03 05 15 49 47 2021 03 05 15 51 25

2021 03 05 15 52 57

如果发送消息不想被窃取,还的使用对称加密的流程对发送的消息进行加密(密码和数字签名组合使用,13章介绍)

2021 03 05 15 54 03 2021 03 05 15 55 22 2021 03 05 15 55 42 2021 03 05 15 56 10 2021 03 05 15 57 05 2021 03 05 15 57 30

9.6 数字签名的应用实例

  • 安全信息公告 明文签名
  • 软件下载

2021 03 05 16 02 22

  • 公钥证书

对公钥加上数字签名即公约证书 2021 03 05 16 01 52

  • SSL/TLS

SSL/TLS在认证服务器身份是否合法时会使用服务器证书,它就是加上了数字签名的服务器公钥。相对的,服务器为了对客户端进行认证也会使用客户端证书。关于SSL/TLS我们会在14章进行介绍

9.7 通过RSA实现数字签名

9.8 其他的签名方法

  • ELGAMAL方式
  • DSA
  • ECDSA
  • Rabin方式

9.9 对数字签名的攻击

  • 中间人攻击
  • 对单向散列函数的攻击
  • 利用数字签名攻击公钥密码
  • 潜在伪造
  • 其他攻击

9.10 各种密码技术的对比

  • 消息认证码与数字签名

2021 03 09 15 17 35

  • 混合密码系统与对散列值签名

9.11 数字签名无法解决的问题

数字签名可以:识别篡改和伪造,可以防止否认 但是大前提是,用于签名的公钥必须属于真正的发送者

为了确认自己得到的公钥是否合法,我们需要使用证书,即将公钥作为一条消息,由一个可信的第三方对其签名后所得到的公钥。(使用公钥之前,先对对公钥进行认证,即使用第三方的公钥对公钥进行数字签名的验证) 2021 03 09 15 20 36

2021 03 09 15 22 14

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

公钥证书记录:姓名、组织、邮箱等信息,以及属于此人(组织)的公钥 并由认证机构施加数字签名。只要看到公钥证书,我们就可以知道这个公钥确实属于此人。

公钥证书也简称为证书

2021 03 24 18 18 27 2021 03 24 18 18 39 2021 03 24 18 18 49

对证书的攻击(多数为社会工程学层面上的攻击)

  • 在公钥注册之前进行攻击
  • 注册相似人名进行攻击
  • 窃取认证机构的私钥进行攻击
  • 攻击者伪装成认证机构进行攻击
  • 钻CRL(证书作废清单)的时间差空子
  • 钻CRL(证书作废清单)的空子,用于(反向)否认
  • PC厂商软件攻击

第十四章 SSL/TLS 为了更安全的通信

SSL/TLS提供了一种密码通信的框架,这意味着SSL/TLS中使用的对称密码、公钥密码、数字签名、单向散列函数等技术,都可以像零件一样进行替换的。

SSL/TLS就像提前搭配好的盒饭一样,规定了一些密码技术的“推荐套餐”,这种套餐称为密码套件

TLS记录协议 TLS握手协议:握手协议、密码变更协议、警告协议、应用数据协议


Profile picture

Blogs by Leo Yang who lives and works in Chengdu writing interesting things. You should follow me on Github 😁