CTF-Crypto 入门求生指南

别看了,我还没入门 /(ㄒoㄒ)/~~

又到一年一度的招新季了,这篇就简单谈下对“如何入门密码学”的理解。因为我比较菜,又是实验室第一个走密码方向的,所以除了我自己摸索出的经验教训,本篇还参考了一些大佬的入门指南,希望能为后来者提供一些帮助。

Crypto是什么#

密码学(Cryptography),密码学方向的考题在CTF中被归为Crypto类型,至于什么是密码学,这里限于篇幅就不作介绍了。想了解更多的戳 这里(或 这里 ),或者自行搜索。
相对于CTF解题赛的其他题目方向,Crypto类型的题目对选手的数学功底要求更高一些,可能一些学弟学妹看到这里就怯了,其实问题不大(主要是数论这一块要求多一些,可以先学学信息安全数学基础),也并不需要早早地去学习这些数学知识,可以在学习相应用到的部分再去学习。

当然除了数学,以下几个方面也是Crypto选手不可或缺的能力:

(1)知识积累:对密码学知识体系有清晰的认知;
(2)认知能力:能够识别出题目考察的密码算法或编码算法,能对未知算法进行分析;
(3)攻击能力:能对所给题目联想到对应的攻击方法,或根据算法漏洞构建攻击方法;
(4)编程能力:能编程实现破解题目涉及加密算法的程序,并对其算法复杂度和运行时间有明确的认知(Crypto方向用Python和Sage多一些)
(5)学习能力:能够快速检索,学习、实现题目涉及文献中的攻击方法(多为英文文献,对于英语不太行的学弟学妹,平时还是要多注重下英语的学习)

《CTF训练营》中有这样一段很有意思的话
1

为什么学密码#

众所周知,密码学是信息安全的基础、核心,不管你做哪个方向都总会遇到密码技术,所以不管你是学习还是从事信息安全相关工作,就不可能绕开密码学。而且就目前来说Crypto选手还是比较少的(相比Web和Bin),比赛中能解出一道不算简单的Crypto题还是蛮拉分的(水题大家都会,没有区分度)

如何学习密码学#

说实话,我也不知道怎么样学习密码学才更好,所以简单谈谈我的经历,我一开始接触密码学也是因为我的导师是做密码方向的,看了一些科普书以后发现这该死的密码学竟然如此有趣!大概是临近大二开始的时候,下定决心转去走Crypto方向,然后就有了现在的姚曜凌。

最初,还是和大一学Re的时候一样,疯狂找平台刷题,因为那个时候接触到的都是些编码题或者水题,现学现做,实在想不出来的就疯狂百度谷歌,所以基本上一天刷完一个平台(旧版Bugku,whalectf之类的,只做Crypto类型的题)。后来接触到比赛中真正的Crypto题目,直接就傻眼了,那个时候的我貌似连python都还不会写,顶多改改现成的脚本跑,面对题目脚本非常难受。审题都是一边查函数一边一点点往下读,什么AES,RSA虽然大概了解概念,但是实现细节什么都不清楚。之后意识到一直这样下去也不会有什么大进步,就开始边学python边系统的看密码学。当然,光看理论知识是完全不够的,所以又把之前的编码题,简单题都翻出来,从头开始不用在线工具自己写脚本,就当python练习了。这样学了一段时间以后,算是勉强能做题了,于是就开始边刷题(攻防世界之类的),边看书,看到相关的知识点就找相关的题目尝试着做,一点点往下学,打了几场比赛后算是有了一点经验。之后就是打比赛,和大师傅们交流,刷题(BUU yyds),看书,看大师傅们的博客,总结。期间跟着导师做了些项目,算是小有成果(paper和专利啥的),考虑到之后还打算读研读博,重心就主要放到科研上了,现在全靠叶神,米神,时钟神带(叶神,米神,时钟神,永远滴神,爱了爱了)。

好啦好啦,言归正传,下面是经验之谈。

1.“兴趣是最好的老师”,求知欲、目标和成就感是最直接的力量来源。不管是哪个方向,只有能保持着对未知,新鲜知识的渴望,才有可能坚持着学下去。大学基本靠自学,你能保持多大兴趣,能自学吸收多少知识基本就决定了你能达到哪种境界。

2.动手能力非常重要。因为我们不是数学院专门研究数理理论的,即便是做密码学科研我们也是偏应用。其次,动手实践能巩固知识,在学习过程中一定要自己尝试着去实现,实现过程中必定会遇到很多理论学习过程中没想到的问题,解决这些问题也就让你对密码算法有了更深刻的认知。学习完一个知识点可以去做做相应的题目,加深一下理解。

3.多打比赛,多总结。虽然一开始很菜,基本就是对着题目干瞪眼,但是百思不得其解的题目,在比赛结束看WP的时候会有更深刻的理解,切记看完要去试着复现。平时可以去OJ平台多刷些题,多见见自己没见过的知识点,做好学习总结(Write Up),建议自己按照网上的教程学着搭建一个博客。这些总结的知识点,写好的脚本在之后的比赛中能起到很大的作用。

4.尝试着出题。当你对某些知识点有了足够的理解,并且知道大多数相关的题目是如何考察这个知识点的之后,可以试着就这个知识点从新的角度去出题,站在出题人的角度看问题可以提供新的思路。出完的题可以给其他Crypto师傅做,然后相互交流;或者也可以卖给收题的企业(切记遵守保密协议),赚点零花钱啥的。

5.多读书,多看文献(尽量直接看英文原版)。针对文献的检索、阅读、学习、实现是Crypto选手的基本素养,比赛中的题目有很多都是根据书中提到的知识点或者某篇paper中提到的攻击方法来出的。有时英文原版的书籍可以更好的理解内容,最新的研究成果也多是是英文paper,如果你之后有做科研的打算那就更应该培养这种能力。(之前有幸和导师还有其他同学翻译了一本密码学的书,可能是我水平有限,有些句子英文能理解清楚,但翻译成中文的时候就感觉怎么也说不清要表达的含义)

CTF中Crypto的知识体系 CTF WikiCTF All In One 以及《CTF特训营》构建的都不错,照着学即可。

附录#

一些不错的密码学书籍(持续补充中,因为我也没看完几本,很多都是网上大佬推荐的):
科普:《图解密码技术 第三版》、《深入浅出密码学——常用加密技术原理与应用》
正式学习:《Introduction to Modern Cryptography, 2nd Edition》、《Foundations of Cryptography》、《A Graduate Course in Applied Cryptography》、《The Joy of Cryptography》…
中文的话要么看英文原版的翻译版,要么看密码学教材。

一些不错的视频课程:
Introduction to Cryptography by Christof Paar
Applied Cryptography
Cryptography I
实在看不了英文课程的可以看:
现代密码学

一些不错的刷题平台(还能正常访问的;入门和赛题复现都有):
Bugku
i春秋
Jarvis OJ
BUUCTF
攻防世界
cryptopals

另注:如果有对密码学有浓厚的兴趣,并且有读研或读博深造打算的同学,欢迎联系我。