目录
计算机科学基础
密码学需要利用计算机来提高加密、解密的效率,通过高效的算法与实用的 Python 库优化解决方案,节约大量的时间和精力,因此适当计算机科学的学习是绝对必要的。
计算机科学概念的引入、兴趣的引导
Computers are not magic! 计算机科学并非是玄幻的学问,它的每一个概念都是基于严谨而有趣的逻辑推理的,科普向系列视频 Crash Course: Computer Science 在短短 8 个小时里非常生动且全面地科普了关于计算机科学的方方面面——计算机的历史、计算机是如何运作的、组成计算机的各个重要模块、计算机科学中的重要思想……这一系列视频将会让初学者对计算机科学形成全貌性的感知,激发内在的兴趣,促使初学者继续探究计算机科学浩如烟海的理论与实践。
开发环境的配置与常用工具的安装
Watt Toolkit(Steam++)、机场代理
计算机科学的学习会频繁使用到大名鼎鼎的代码托管开源网站 GitHub,而由于国内特殊的敏感原因,有些时候 GitHub 无法正常访问,我们需要 Watt Toolkit 获取高速访问 GitHub 的线路。
同时,为了访问国外优质的教育论坛及资源网站,我们需要 Clash
等来进行代理连接,即所谓翻墙 (逃) 。
Scoop(Windows 用户可选)
相较于 Linux、Mac,Windows 由于没有统一的标准而使得开发环境的搭建一直是复杂而困难的问题。 Scoop 可以帮助我们统一安装并管理常见的开发软件,省去了手动下载安装,配置环境变量等繁琐步骤。
常用 Python 库
Crypto
、libnum
、gmpy2
、random
、hashlib
、pwn
。
SageMath
一个功能超完善的计算平台对一个密码手来说无疑是很有吸引力的,这意味着很多算法和相关代数结构不需要自己费心去写了。
SageMath 是一个基于 GPL 协议的开源数学软件,使用 Python 作为通用接口,将现有的许多开源软件包整合在一起,构建一个统一的计算平台。它是 Magma,Maple,Mathematica 和 MATLAB 的免费下位替代品。
可以通过编写后缀名为 .sage
的文件(同时支持 Python 和 SageMath 语法)来运行相关解题脚本。
Linux
建议安装一个 Linux 虚拟机来提高密码学解题的效率。对于 Linux 命令的学习,可以按照国外 star 数超 150k 的 GitHub 项目「命令行的艺术」提供的顺序自学,也可以在实际生产环境中利用搜索引擎逐步学习。
小工具 yafu
用于分解质因数,也有类似功能的网站。
OpenSSL
OpenSSL 是一个加密库,支持传输层安全防护(TLS)和安全套接字层(SSL)协议的开源实现。它提供了生成私钥、管理证书以及为客户端应用加密和解密的功能。
解题时遇到奇怪的文件后缀名,或许这个库可以解决。
Markdown
学习一下 Markdown 语法,平时可以写 CSDN 等博客记录自己的学习笔记。
编程基础
详见 CS-DIY 自学指南。
Python
Python 是 CTF 中 crypto(密码学) 题最常用的编程语言。
❗️建议:由于个别编码兼容性问题,Python 2 和 Python 3 最好都安装,更常用的可能是 Python 3。
对于密码学方向,初学者并不要求过硬的 Python 基础,正确地表达密码学相关算法即可。我们可以通过菜鸟教程网站来快速入门 Python 语法,在实际的解题过程中再通过搜索引擎解决算法表达的问题。
长远地来说,我们可以通过 Python 程序设计来系统地构建编程思维与算法理念来进一步提升编程水平,提高算法表达能力。推荐 UCB CS61A: Structure and Interpretation of Computer Programs ,伯克利 CS 系列第一堂 Python 入门课,强调抽象,让学生掌握用程序来解决实际问题,而不关注底层的硬件细节,使得代码更加模块化、更易读;同时还会涉及 Scheme 和 SQL 两大编程语言,在它们的学习和比较中拥有快速掌握一门新的编程语言的能力,对于信息安全专业后续的学习大有裨益。
CS61A 这套课程建议配套大佬分享的学习笔记(GitHub)食用,里面包含了课程的作业、实验、项目的代码以及部分难点的总结,推荐通过课程大纲对该学习笔记进行系统地翻阅与学习。建议先自主尝试完成作业、实验、项目,再翻阅笔记。
此外,时不时地查看课程教材 Composing Programs 的一些插图和更详细的阐述可能会有帮助。
其他编程语言、算法与数据结构(可选)
不仅仅是单纯的 CTF 竞赛,对于应用密码学,可以再选修 C 语言与汇编语言,内联汇编能在实现代码算法优化的时候提升效率。对此,数据结构(例如二叉树,Merkle Tree——包括成员证明、基于哈希的数字签名——另外像端到端加密的群组密钥更新 TreeKEM 也有用二叉树结构,主要作用就是从线性复杂度优化成对数复杂度)也是较为重要的。
对于算法与数据结构,推荐阅读《算法 4》,既讲解了Java 编程语言的基础知识,又讲解了数据结构,同时深入浅出地讲解了计算机科学中的50个经典算法,包含了 Java 语言的完整实现;也可以阅读大佬 labuladong 的书籍《labuladong 的算法笔记》,更偏向于大厂算法面试,对于算法思维的提升更有效率。
对于底层的密码学应用,还应该掌握一些操作系统原理(堆栈、内存管理,说到底还是为了提升效率);不过这些内容更偏向于实际生产中的密码学技术,对于国际 CTF 竞赛级别以下的赛事可能帮助并不显著。
以上内容也是信息安全专业必修的内容之一,一般为计算机组成原理、操作系统、算法与数据结构等。在拥有一定的 C 语言编程基础后,推荐先学习计算机体系结构课程 CS61C: Great Ideas in Computer Architecture,深入计算机的硬件细节,带领学生逐步理解 C 语言是如何一步步转化为 RISC-V 汇编并在 CPU 上执行的。可先利用菜鸟教程网站自学 C 语言语法基础,在课程的学习中逐步规范细节。课程使用的作业、实验与项目代码在对应的 GitHub 仓库中。
接下来,可以学习计算机组成原理的重头戏 CMU CS15213: CSAPP 深入理解计算机系统课程。操作系统课程可以学习国内的 NJU OS: Operating System Design and Implementation。
要是做区块链的话,计算机网络需要好好学(涉及到网络层和传输层协议)。
具体学习的路径详情参考这里。
数学基础
密码学的本质是数学。数学基础学习可与密码学学习同时进行,相辅相成。
离散数学的学习不可或缺。加密与解密离不开计算机,而计算机本质上是一个离散结构,只能处理离散的数量关系,因而离散数学在 CTF 密码学方向占比很大,crypto 题中常涉及的是数论和抽象代数,例如威尔逊定理、欧拉定理、费马小定理、中国剩余定理(CRT)、拓展中国剩余定理(extend CRT)等,还有群、环、域、格等代数结构及其相关内容。
优先推荐王立斌的《具体数论与代数》(A Concrete Introduction to Number Theory and Algebra, CINTA),涉及的数学知识和代码都非常友好,适合初学者自学。另外,作为头脑风暴之后的休息调整、梳理归纳,我们可以在高强度的数学理论学习之余穿插观看较为简单通俗、提纲挈领式的哈工大信息安全数学基础课程视频,进一步总结所学数学知识框架。
离散数学与抽象代数
离散数学是抽象代数的基础。
可以阅读 Kenneth H. Rosen 编写的《离散数学及其应用》,这是一本高中生都可以看懂的离散数学教材,里面包含了详尽的讲解、丰富的实例、大量的习题。
可以选择性地学习 UCB CS70 : discrete Math and probability theory 中离散数学部分的课程笔记,做一些习题,不推荐看相应的视频。虽然阅读全英文的笔记具有一定的挑战性,但是较强的英文阅读能力可以有效地提升学术研究的质量;可以利用划词翻译等实用工具来辅助阅读英文文献。
一般数学和计算机学院都会开设离散数学这门课程,但电子信息学院可能不会开设。进一步,可能只有数学学院会开设抽象代数课程,计算机学院和电子信息学院一般会开设编码理论。
完成离散数学的学习后,可以观看哈佛大学 Benedict Gross 教授的课程 MATH E-222 Abstract Algebra(前 5 讲可以看这个精翻,剩下的看这一系列的机翻;当然 B 站 up 主“GPT 中英字幕课程资源”的翻译作品也可观看,只是少部分内容需要充电)以学习抽象代数,其讲解激情四射,引人入胜,唯一的遗憾就是他的课堂笔记实在有一些凌乱。可以在网络上找到这门课程的笔记(需翻墙),这可能会对学习有所帮助。
对于数论入门,推荐阅读 Joseph Silverman 撰写的《数论概论》,这本书涵盖了初等数论直接用于密码学的所有部分,包含素数理论、费马小定理、二次剩余、椭圆曲线,可读性非常好。
同时,也可阅读 MIT 初等数论课程 Theory Of Numbers 的课程笔记,进行一些练习;B 站 IMO 金牌教练韩老师的数论系列讲座也可观看。若是学习初等数论过程中存在理不清头绪、摸不清原理的情形,还可以观看初等数论课程(不挂科)期末速通,快速且简单扼要地梳理数论知识。
复杂性分析
无论是方案的计算复杂性分析,还是密码学的安全理论,都需要用到计算复杂性的知识。理解计算复杂性的相关概念将对密码学的理解带来很大的帮助。
推荐卡耐基梅隆大学 Ryan O’Donnel 教授的计算复杂性课程,分别为本科生开设了课程Undergraduate Complexity Theory,为研究生开设了课程 Graduate Computational Complexity Theory。本科生课程不讲解概率多项式时间算法,由于密码学领域经常涉及这一概念,因此推荐直接学习研究生课程。当然,如果感觉难度比较大,也可以先学习本科生课程。
Ryan O’Donnel 教授同样讲解了《量子计算与信息》Quantum Computation and Information 课程(量子计算对密码学产生了深远影响。为了应对量子计算的威胁,密码学家开始研究“量子抗性”算法,以确保信息在量子计算机存在的情况下仍能安全传输和存储。量子计算机的独特能力可能对现有的某些密码算法进行暴力破解,尤其是基于大数分解和离散对数等复杂数学问题的非对称密码学算法,属于密码学研究前沿领域)以及 Analysis of Boolean Function 课程(布尔函数是一类把有限域上的二进制向量映射到一个二进制值的函数。 在密码学中,布尔函数广泛应用于密码算法和协议的设计中,被用于数据加密、数字签名、密钥生成等方面,其密码学性质包括均匀性、平衡性、非线性性和秘密性等),如果需要也可以听一听。
密码学的正式学习
- 没事多搜索(既然学会了访问外网的方法,就要灵活使用谷歌、维基百科等优质的国外资源!)
- 克服畏难心理,很多题不需要完全懂里面的数学原理也能做
- 平时多收集各类脚本、网页,解题事半功倍
- 兴趣是最好的老师,心情次之。没有兴趣或许可以换个方向,没心情做题可以休息一会儿
- 某些杂项题和密码题只涉及词频分析、编码、古典密码、流密码,少有对数理知识和读写代码能力的要求,但却很考验大家的脑洞,而个人的脑洞是有限的,所以建议团队协作
可以看看密码学竞赛选手从入门到前沿的大纲,自己去搜索引擎查漏补缺,以下也会部分摘录。推荐有时间看看密码学笼统的入门指南 CTF Wiki - 密码学。
兴趣的培养
可以先跟着这篇博文动手实践一下各种常见编码,随后可以通过 Hello CTF 的密码学部分大致了解密码学基本内容,以及一些工具的拾遗。
推荐密码学科普类书籍《图解密码学技术》,培养对密码学的兴趣,了解各种密码体系。也可以看看《深入浅出密码学》浅显地了解现代密码学。
随后,我们可以到攻防世界的 Crypto 区,使用新手模式的难度分级功能,从等级 1 开始逐步挑战解决较为容易的密码学问题,尝试自主思考,实在不会再看 Write Up(题解),同时看 Write Up 的时候应当注意总结思考,挑战的难度等级可逐步提升。
做题小技巧
- 首先从标题、描述、附件等判断是哪一类的密码,然后再对症下药。可以从常见的编码和古典密码开始,之后就可以涉猎对称和非对称密码了;对称密码的话,AES 及其五种工作模式( ECB,CBC,CFB,OFB,CTR)是绕不开的;非对称的话肯定是从 RSA 开始了。
- 题目附件里的代码常有如下字样:
from secret import flag
可以理解成出题人把 flag 藏在 secret 这个私有库里了,这样的代码不能直接运行,而需要做题人通过分析代码里面的加密方式还原出 flag。
- 在某些题目中,虽然代码本身运行不了,但是某些函数却可以利用(oracle),解密时可以直接挪用到自己的解题脚本上运行。
系统学习
「古典密码学 Classic cryptography 」 和 「现代密码学 Modern cryptography 」 均属于密码学分支,只是重心发生了侧移,大家更加关心现代密码学相关使用和研究。
由于密码学的发展以及 CTF 比赛的不断革新,编码和古典密码已经很少出现在密码学方向的题目中了,即使出现也会跟随现代密码学一同使用,更常见的反而是在「 杂项 MISC 」中作为签到题或者一般简单题目考察,因此 CTF Crypto 的考察核心在于现代密码学。不过,作为计算机领域信息传递最基本的一环,不论选择了密码学还是杂项,编码技术都值得详细阅读和了解。
需要了解并运用的密码学算法
首先是一些入门的编码:ASCII
,base64
等(值得一提的是,Crypto
库里的 bytes_to_long()
和 long_to_bytes()
很常用,务必搞清楚它在做什么);
然后是古典密码,比如摩尔斯电码,栅栏密码、凯撒密码、猪圈秘密、棋盘密码、培根密码、维吉尼亚密码等,还有一些 XXencode
、UUencode
、brainfuck
等依靠经验的密码或编码,均能在网上自主学习;
再之后是 RC4、DES、AES、哈希、DH密钥交换、RSA、ECC、格密码……
crypto 常用算法有:
- 线性同余方法(lcg)
- 欧几里得算法(gcd)
- 拓展欧几里得算法(extend gcd)
- 小步大步算法(bsgs)
- 拓展小步大步算法(extend bsgs)
- 费马因式分解
- CopperSmith 方法
- ……
密码学导论
推荐观看 Dan Boneh 的密码学系列课程,可以在评论区找到相关课程资源。
PDF 推荐《深入浅出密码学:常用加密技术原理与应用》以及 Introduction to Modern Cryptography, 2nd Edition,或者其第一版中文译本《现代密码学——原理和协议》;同时,Dan Boneh 教授联合著名密码学家 Victor Shoup 教授撰写面向研究生的密码学教材 A Graduate Course in Applied Cryptography 值得一读,这本教材与前面提到的 Introduction to Modern Cryptography, 2nd Edition 教材风格类似,但由于是面向研究生的教材,其难度相对会更大,安全性证明的描述更加全面。
安全性证明(非必要)
研究公钥密码学相关领域,安全性证明是不可避免的门槛。实际上,通过密码学导论相关读物,我们已经或多或少地知晓了安全性证明的基本思路,也阅读到了一些密码学方案的安全性证明。但是,学习已有的证明是一方面,是否可以独立自主地撰写安全性证明又是另一个难题。如果不知道如何为哪怕一个简单的方案撰写安全性证明,可以阅读 Victor Shoup 教授的论文 Sequences of Games: A Tool for Taming Complexity in Security Proofs。这篇论文不会让安全性证明变得简单,但是会讲解怎么更系统地整理证明思路,把细节一步步地、有调理地放在一串攻击者与仿真者的游戏里。
如果仍然对安全性证明一筹莫展,可以考虑观看郭福春老师的有关安全归约的视频(所谓安全归约,一种密码学中的分析方法,将一个密码方案的安全性建立在一个已知的困难问题上。通过归约,可以证明密码方案的安全性,使其不可被攻破),对几乎所有安全性证明写得非常好的方案进行了完整的讲解,也可以阅读对应的教材 Introduction to Security Reduction,建议精读。
除了这些基础的话题,剩下的具体问题,比如IBE、ABE或者密钥生成协议的安全性证明等,很多得找具体的 paper 和论文集,而不是教科书能解决的了,因此应当逐步强化查阅论文的能力。
特别要注意的是,很多论文都有会议版本和期刊版本。如果论文只有会议版本,作者一般也会将论文的扩展版本(或称完整版本)上传至国际密码学研究协会(International Association for Cryptologic Research, IACR)的网站上。如果想精读一篇论文,建议寻找发表在 IACR 上的版本,此版本的内容可能会更加全面。
更多详情请参见这里。
实践
刷 crypto 题是伴随着密码学系统的学习逐步深入的,可以在各大靶场例如 NSSCTF、攻防世界、BUUCTF、CTFHub 等进行相应题的练习,学会使用编程语言表达密码学思想,逐步提升做题能力与技巧。
很多 CTF 赛会发布官方的题解,例如 LiteCTF 2023 的官方 Write Up,完成题目后请及时查看相应的题解(非官方也可),看懂题解的思路与具体实现,对自己未考虑到的方法进行总结。
这往往是最为关键的环节,从理论发展为实践、应用对于 CTF 竞赛是极为重要的,建议在做题过程中反复回顾基础理论,理解并归纳题目的用意与涉及思想、理论,从而融会贯通,形成高效的 CTF 解题闭环。