├── .gitignore ├── src ├── crypto-stanford │ ├── what-is-cryptography.md │ ├── image.png │ ├── image-1.png │ ├── image-2.png │ ├── 16-Collision-Resistance-2-constructions.md │ └── 12-Message Integrity 1: definitions.md └── SUMMARY.md ├── book.toml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | book 2 | index.html -------------------------------------------------------------------------------- /src/crypto-stanford/what-is-cryptography.md: -------------------------------------------------------------------------------- 1 | # What is Cryptography? 2 | -------------------------------------------------------------------------------- /src/crypto-stanford/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoubetDao/all-about-cryptography/HEAD/src/crypto-stanford/image.png -------------------------------------------------------------------------------- /src/crypto-stanford/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoubetDao/all-about-cryptography/HEAD/src/crypto-stanford/image-1.png -------------------------------------------------------------------------------- /src/crypto-stanford/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YoubetDao/all-about-cryptography/HEAD/src/crypto-stanford/image-2.png -------------------------------------------------------------------------------- /book.toml: -------------------------------------------------------------------------------- 1 | [book] 2 | authors = ["Youbet Study Group"] 3 | language = "en" 4 | multilingual = false 5 | src = "src" 6 | title = "All About Cryptography" 7 | 8 | [output.html] 9 | default-theme = "light" 10 | preferred-dark-theme = "navy" 11 | -------------------------------------------------------------------------------- /src/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | [Introduction](../README.md) 4 | 5 | # Notes for Crypto - Stanford 6 | 7 | - [What is Cryptography?](./crypto-stanford/what-is-cryptography.md) 8 | - [16 Collision Resistance 2: constructions](./crypto-stanford/16-Collision-Resistance-2-constructions.md) 9 | -------------------------------------------------------------------------------- /src/crypto-stanford/16-Collision-Resistance-2-constructions.md: -------------------------------------------------------------------------------- 1 | # 16 Collision Resistance 2: constructions 2 | 3 | ## The Merkle-Damgård iterated construction 4 | 5 | ![alt text](image.png) 6 | 7 | 给定压缩函数 $h: T \times X \longrightarrow T$ 8 | 9 | Merkle-Damgård 构造定义如下: 10 | 11 | $H_0 = IV$ 12 | 13 | $H_i = h(H_{i-1}, M_i)$ 其中 $i = 1,\dots,\ell$ 14 | 15 | $H(M) = H_\ell$ 16 | 17 | 其中 $PB$ 是填充函数,一定要包含消息长度信息,形如 $1 || 0^k || Msg Length$,$M_i$ 是消息的第 $i$ 个块。 18 | 19 | ## MD collision resistance 20 | 21 | ### 定理 22 | 23 | 如果 $h$ 具有碰撞抗性,那么 $H$ 也具有碰撞抗性。 24 | 25 | ### 证明 26 | 27 | 通过归约:碰撞在 $H$ 上 $\Rightarrow$ 碰撞在 $h$ 上 28 | 29 | 假设 $H(M) = H(M')$,我们来构造 $h$ 的碰撞。 30 | 31 | - 设 $M$ 被填充并分块为 $M_1, M_2, ..., M_k$ 32 | - 设 $M'$ 被填充并分块为 $M'_1, M'_2, ..., M'_{k'}$ 33 | - 定义中间链式变量: 34 | - $H_i = h(H_{i-1}, M_i)$ 35 | - $H'_i = h(H'_{i-1}, M'_i)$ 36 | 37 | 如果在某个位置 $i$ 有: 38 | 39 | - $H_{i-1} = H'_{i-1}$ 但 $M_i \neq M'_i$ 或者 $H_{i-1} \neq H'_{i-1}$ 40 | - 则找到了 $h$ 的碰撞,因为: 41 | $h(H_{i-1}, M_i) = h(H'_{i-1}, M'_i)$ 但输入不同 42 | 43 | 而 $H(M) = H(M')$, 因此要么 $H_{i-1} = H'_{i-1}$ 且 $M_{i-1} = M'_{i-1}$,要么已经找到了 $h$ 的碰撞。 对于前者可以一直往前递归,直到找到碰撞。如果找不到则说明 $M = M'$,这与假设矛盾。 44 | 45 | 因此,如果能在 $H$ 上找到碰撞,必然能在 $h$ 上找到碰撞。 46 | 这与 $h$ 的碰撞抗性假设矛盾,所以 $H$ 必须也是碰撞抗性的。 47 | 48 | ## Davies-Meyer 压缩函数 49 | 50 | 假设 $E: K \times \{0,1\}^n \rightarrow \{0,1\}^n$ 是一个块加密函数,$K$ 是密钥。 51 | 52 | $h(H, m) = E(m, H) \oplus H$ 53 | ![alt text](image-1.png) 54 | 55 | 其中: 56 | 57 | - $H$ 是链式变量(上一个哈希值) 58 | - $m$ 是消息块 59 | - $\oplus$ 表示异或操作 60 | 61 | ## 简化版压缩函数安全性分析 62 | 63 | $h(H, m) = E(m, H)$ (注意:移除了 ⊕H) 64 | 65 | 1. 随机选择 $(H,m,m')$ 66 | 2. 设定 $H'=D(m', E(m,H))$ 67 | 3. 验证碰撞 $h(H',m') = E(m',H') = E(m',D(m',E(m,H))) = E(m,H)$ 68 | 69 | ## 其他的构造 70 | 71 | Miyaguchi-Preneel 安全变体 72 | 73 | - $h(H, m) = E(m, H) \oplus H \oplus m$ 74 | - $h(H, m) = E(H \oplus m, m) \oplus m$ 75 | 76 | 一共有12种类似的安全变体 77 | 78 | 下面是另一种不安全的变体 79 | - $h(H, m) = E(m, H) \oplus m$ 80 | 81 | ## SHA-256 的 Davies-Meyer 构造 82 | ![alt text](image-2.png) 83 | 84 | ## 可证明安全的压缩函数 85 | 86 | ### 参数设置 87 | - 选择随机 2000 位的素数 $p$ 88 | - 随机选择 $1 \leq u, v \leq p$ 89 | 90 | ### 函数定义 91 | 对于 $m,h \in \{0,...,p-1\}$,定义: 92 | $h(H,m) = u^H \cdot v^m \pmod{p}$ 93 | 94 | 找到碰撞的难度和解决离散对数问题是一样的。 95 | 96 | 缺点:运行效率低。 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # All About Cryptography 2 | 3 | Welcome to my repository, **All About Cryptography**. This repository contains a curated list of excellent learning resources on cryptography as well as my personal notes, organized systematically to help with understanding both foundational and advanced concepts in cryptography. 4 | 5 | ## 📚 Recommended Learning Resources 6 | 7 | Here are some of the best resources to get started and deepen your understanding of cryptography: 8 | 9 | ### Online Courses 10 | - **[Cryptography I - Coursera](https://www.coursera.org/learn/crypto)** by Stanford University 11 | - A beginner-friendly course covering the basics of cryptography, including block ciphers, public-key cryptography, and digital signatures. 12 | - **[MIT 6.875, Cryptography Sp 2018](https://www.bilibili.com/video/BV1qt411L74p/?vd_source=9eaeb1e7d1fb91ea1b4276a568880ca1)** 13 | - A comprehensive series of lectures on cryptography offered by MIT, available on Bilibili. 14 | - **[ZKP Mooc](https://www.youtube.com/playlist?list=PLS01nW3Rtgor_yJmQsGBZAg5XM4TSGpPs)** 15 | - A comprehensive series of lectures on Zero-Knowledge Proofs offered by Berkeley RDI Center, available on YouTube. 16 | 17 | ### Books 18 | - **[Cryptography and Network Security](https://www.amazon.com/Cryptography-Network-Security-Principles-Practice/dp/0134444280)** by William Stallings 19 | - A comprehensive textbook that covers both cryptographic techniques and their application to network security. 20 | - **[Applied Cryptography](https://www.amazon.com/Applied-Cryptography-Protocols-Algorithms-Source/dp/1119096723)** by Bruce Schneier 21 | - A classic book covering a wide range of cryptographic protocols and algorithms. 22 | 23 | ### Articles and Papers 24 | - **[A Graduate Course in Applied Cryptography](https://crypto.stanford.edu/~dabo/cryptobook/)** 25 | - A free online textbook that covers modern cryptographic techniques in a rigorous manner. 26 | 27 | ## 📝 My Notes 28 | 29 | Below is a collection of my personal notes, organized by topic. Each set of notes is maintained in its own directory: 30 | 31 | ### 1. **[Notes for MIT 6.875](./notes/mit-6.875/)** 32 | - Introduction to cryptography 33 | - Symmetric vs. Asymmetric encryption 34 | - Historical ciphers 35 | 36 | Happy learning! 🚀 37 | -------------------------------------------------------------------------------- /src/crypto-stanford/12-Message Integrity 1: definitions.md: -------------------------------------------------------------------------------- 1 | # 消息认证码(MAC)概述 2 | 3 | ## 引言 4 | 在本模块中,我们将不再讨论加密,而是转向消息完整性的讨论。我们的目标是在不考虑保密性的情况下提供完整性。 5 | 6 | ## 现实应用场景 7 | 8 | 在现实世界中,有许多只需要完整性而不需要保密性的应用场景: 9 | 10 | 1. **操作系统文件** 11 | - Windows系统文件本身并不保密 12 | - 但需要防止被病毒或恶意软件修改 13 | 14 | 2. **网页广告** 15 | - 广告商不在意广告内容被复制 16 | - 但需要防止广告内容被篡改 17 | 18 | 如何保证消息的完整性?使用MAC(message authentication code)。 19 | 20 | ## MAC的基本机制 21 | 22 | ### 工作原理 23 | 1. Alice和Bob共享一个密钥K(对攻击者保密) 24 | 2. Alice要发送公开消息M给Bob 25 | 3. Alice使用MAC签名算法S(K,M)生成短标签(约90-100位) 26 | 4. Alice将消息和标签一起发送给Bob 27 | 5. Bob使用MAC验证算法验证消息完整性 28 | 29 | ### MAC的定义 30 | MAC由两个算法组成: 31 | - **签名算法**:S(k,m) → t ∈ T,其中t是标签空间T中的标签 32 | - **验证算法**:V(k,m,t) → {yes,no},验证消息-标签对的有效性 33 | 34 | ### 一致性要求 35 | 对于密钥空间中的每个K和消息空间中的每个消息: 36 | - 用同一密钥进行签名和验证应得到"是"的回应 37 | 38 | ## 为什么需要共享密钥 39 | 40 | ### CRC的反面教材 41 | - CRC(循环冗余校验)是无密钥的校验和算法 42 | - 设计用于检测随机错误,而非恶意修改 43 | - 攻击者可以: 44 | 1. 拦截Alice的消息和标签 45 | 2. 生成新消息M' 46 | 3. 计算新的CRC 47 | 4. 发送给Bob 48 | - Bob收到后会验证tag == CRC(M'),由于CRC是公开的算法,攻击者生成的新CRC可以通过验证,会认为来自Alice 49 | 50 | ### 密钥的重要性 51 | - 没有密钥,Bob无法区分Alice和攻击者 52 | - 密钥使Alice可以执行攻击者无法完成的操作,计算出攻击者无法修改的标签 53 | - CRC只适用于随机错误检测,不适用于防御恶意攻击 54 | 55 | ## MAC的安全性定义 56 | 57 | ### 攻击者能力:选择消息攻击(chosen message attack) 58 | - 可以选择消息m1到mq给Alice 59 | - Alice计算这些消息的标签 60 | - 攻击者获得标签 61 | 62 | ### 现实世界的选择消息攻击示例 63 | - 攻击者发送电子邮件给Alice 64 | - Alice为邮件计算标签并存储 65 | - 攻击者获取存储介质,得到标签 66 | 67 | ### 攻击者目标:存在性伪造(existential forgery) 68 | - 产生新的有效消息-标签对 69 | - 必须与选择消息攻击期间获得的对不同 70 | - 即使是无意义消息的伪造也视为不安全 71 | 72 | ### 安全性的额外要求 73 | - 攻击者不能为已知消息生成新标签 74 | - 对于加密和完整性的组合很重要 75 | 76 | ## MAC的安全性游戏 77 | 78 | ### 游戏流程 79 | MAC I=(S,V)安全性游戏包含以下步骤: 80 | 1. 挑战者(Chal.)随机选择MAC密钥 k ← K 81 | 2. 攻击者(Adv.)进行选择消息攻击(Q次): 82 | - 攻击者选择消息 m1,...,mq ∈ M 83 | - 获得标签 ti ← S(k,mi) 84 | 3. 攻击者尝试存在性伪造,输出一个消息-标签对 (m,t) 85 | 86 | ### 胜利条件 87 | 攻击者输出的消息-标签对(m,t)必须满足: 88 | 1. V(k,m,t) = 'yes' 能通过验证 89 | 2. m ∉ {m1,...,mq} 与之前未见过 90 | 91 | ### 安全性定义 92 | - 攻击者优势: Adv[A,I] = Pr[b=1] 93 | 其中 b = 1 当且仅当: 94 | - V(k,m,t) = 'yes' 且 95 | - (m,t) ∉ {(m1,t1),...,(mq,tq)} 96 | 否则 b = 0 97 | - 安全MAC: 对于所有有效攻击者A,Adv[MAC][A] ≤ ε(可忽略值) 98 | 99 | ## 重要安全考虑 100 | 101 | ### 标签碰撞问题 102 | - 如果两个消息有相同标签的概率为1/2,则MAC不安全 103 | - 攻击者可通过选择消息攻击利用这一点 104 | 105 | ### 标签长度问题 106 | - 过短的标签(如5位)使MAC不安全 107 | - 攻击者可以通过随机猜测成功 108 | - 推荐标签长度:64位、96位或128位 109 | 110 | ## 实际应用:使用MAC保护系统文件 111 | 112 | ### 实现方式 113 | 1. 安装操作系统时: 114 | - 用户提供密码 115 | - 从密码中获取密钥K 116 | - 为每个系统文件计算标签 117 | - 存储文件和标签 118 | - 擦除密钥K 119 | 120 | 2. 验证时: 121 | - 从干净环境启动 122 | - 用户重新提供密码 123 | - 验证所有文件的MAC 124 | 125 | ### 注意事项 126 | - 病毒无法创建带有效标签的新文件 127 | - 需要将文件名包含在MAC计算中,防止文件交换攻击 128 | 129 | # 构建安全的MAC 130 | 131 | ## MAC的基本概念回顾 132 | - MAC是一对算法: 133 | - 签名算法:接收消息和密钥作为输入,生成标签 134 | - 验证算法:接收密钥、消息和标签作为输入,输出0或1 135 | - 安全性要求:在选择消息攻击下存在性不可伪造 136 | - 攻击者可以进行选择消息攻击 137 | - 无法创建有效的新消息-标签对 138 | 139 | ## 基于PRF构建MAC 140 | 141 | ### 基本构造方法 142 | 1. 使用PRF(伪随机函数)作为基础 143 | 2. 签名过程:对消息M计算PRF(M)作为标签 144 | 3. 验证过程:重新计算PRF(M)并与标签比对 145 | 146 | ### 不安全的例子 147 | - 使用10位输出的PRF,构造MAC 148 | - 问题:标签太短 149 | - 攻击者有1/2^10的概率猜对MAC 150 | - 1/1024的成功率是不可忽略的 151 | 152 | ### 安全性定理 153 | - 如果PRF输出足够长,可以构建安全的MAC 154 | - 安全要求: 155 | - PRF必须是安全的 156 | - 输出空间要足够大(如80位) 157 | - 攻击者优势最多为1/2^80 158 | 159 | ## 安全性证明分析 160 | 161 | ### 基于真随机函数的分析 162 | 1. 考虑使用真随机函数而非PRF 163 | 2. 攻击者获取多个消息的标签 164 | 3. 对新消息M预测标签的成功率仅为1/Y (Y是输出空间大小) 165 | 4. 因为函数在新点的值与已知点完全独立,攻击者只能猜测标签值 166 | 167 | ### PRF的等效性 168 | - 攻击者无法区分PRF的行为与真随机函数 169 | - 攻击者在PRF上的优势同样被限制在1/Y 170 | 171 | ## 实际应用扩展 172 | 173 | ### 从小MAC到大MAC 174 | - AES作为基础PRF(16字节,128位输入) 175 | - 两种构造方法: 176 | 1. CBC-MAC:银行业常用(如自动清算所ACH系统,确保支票在银行间传输完整性) 177 | 2. HMAC:互联网协议常用(SSL/IPsec/SSH) 178 | - 从接收小消息的PRF开始,产生可处理GB级长消息的PRF,都可以用AES作为底层密码来实现。 179 | 180 | ### MAC输出截断 181 | - N位PRF可安全截断至T位(T