人们经常问我如何开始密码学。有趣的是,大多数时候他们也想知道我是如何开始学习的。这对我来说很有趣,因为这表明人们寻找的不仅仅是一份要阅读的书籍或论文清单或一组要解决的练习;他们还在寻找如何学习这门学科的更广泛的策略。在这篇文章中,我将讨论一些可能的策略。
首先,我要强调的是,我只是在考虑学习密码设计和理论的策略。此外,当我说学习密码时,我心里想的不是理解一篇普通的论文,而是自己生成这样的论文(或者至少是其中的想法)。如果你的最终目标是密码工程,那么这些策略可能会有帮助,也可能没有帮助-我不是专家,所以我真的不能这么说(尽管我认为提高你对原语和协议是如何设计的理解可能会有所帮助)。
我应该从一开始就说,我个人开始从事密码学的方式可能是最糟糕的方式之一。它效率很高,效率很低,而且成功的几率很低。这主要是因为我刚开始的时候没有合适的背景,也没有合适的资源可供我支配。这两件事非常重要,如果你没有这两件事,两件事中的一件很可能会发生:(1)你需要很长时间才会厌倦并放弃;或者(2)你会成为一个怪胎(相信我,外面有很多卖密码产品的怪胎)。(2)这两件事非常重要,如果你没有这两件事,你很可能会发生两件事中的一件:(1)你会厌倦并放弃;或者(2)你会成为一个怪胎(相信我,外面有很多卖密码产品的怪胎)。
在设计和实施你的战略时,你应该牢记这些结果,因为不惜一切代价避免它们是非常重要的。
学习密码设计和理论的最佳策略是在密码学小组的大学获得博士学位。获得机械工程或生物学等随机领域的博士学位并不算数!如果你对对称密码学(即分组密码和散列函数设计和密码分析)感兴趣,那么一个很好的起点是欧洲大学,因为那里有很大一部分专家。如果你对密码理论感兴趣,那么美国或以色列。当然,在每个地区,任何地方都有强大的团体。
如果你已经找到了一所大学,并且正在试图评估这个群体,那么一个非常粗略的理智检查就是看看他们的出版记录。如果这是一个理论小组,那么你应该寻找Crypto,Eurocrypt,ASIACRYPT,TCC,FOCS,STOC出版物。如果这是一个更实用的小组,那么你应该在CCS、CHS、IEEE Security and Privacy(也称为Oakland)和Usenix Security上寻找出版物。CRYPTO、EUROCRYPT和ASIACRYPT对于应用密码来说不是特别好的质量指标。如果这是非对称加密和密码分析组,那么您应该在快速软件加密(FSE)和密码学中的选定区域(SAC)上查找论文。与应用加密类似,CRYTO、EUROCRYPT和ASIACRYPT在这一领域不一定是质量的好指标。
但是,你不应该过于沉迷于这件事。密码学中的发布系统出现故障,因此您不一定要解雇$A$组,因为它的STOC论文少于$B$;或CCS论文少于$C$。这只是一个非常粗略的度量-没有任何其他信号-可以用来区分非常好的组和非常差的组。另一件值得检查的事情是,从这个群体毕业的学生最终会去哪里。他们最终会得到你想要的工作吗?
那么,为什么从一个优秀的团队获得博士学位是最好的策略呢?很简单,因为这是最有效的学习材料的方式。密码所需的背景不是传统教育的一部分,既不是数学,也不是计算机科学,所以你不太可能在大学里学到你需要的东西。所以你有两个选择:(1)自学;(2)在研究生院学习。
在研究生院,你会有一套精心挑选和准备的课程。你会有一位指导你完成整个过程的顾问,告诉你你需要学习什么,你不需要学习什么,你的弱点是什么,你需要改进的是什么,要解决的问题是什么,以及解决这些问题的最佳策略。你也会有同学帮助和激励你自始至终。
请注意,对于大多数计算机科学博士项目来说,你不需要支付任何费用。你的学费由系里或你的导师提供助学金支付。此外,你还会得到一笔津贴,用来支付住房费用,FOODEC。因此,如果你有能力将你生命中的5美元投入到密码学的学习中,那么我认为密码组中的研究生院是到目前为止最好的策略。
所以你不能去研究生院,或者你可以去没有密码组的地方,你仍然很想学习密码设计和理论。这里有一个可行的策略-我使用的策略。
我假设你有一个标准的以系统为中心的计算机科学本科学位。例如,在我的案例中,我本科时有很强的系统背景(例如编译器、操作系统、网络、体系结构),而理论背景非常薄弱(只有微积分、算法入门和一门没人上过的线性代数课)。坦率地说,这种背景对密码学是毫无用处的,如果你在这一点上,那么你必须明白,你将从头开始。
你应该努力做三件事:(1)发展数学成熟度;$(2)$学习如何调试;(3)获得基础知识。
我所说的数学成熟度,是指理解和使用基本的数学语言、符号和概念的能力。它基本上具备了做数学的合适环境。知道如何解析数学语句和校样,一般说来,知道如何读懂字里行间的意思,知道如何填补遗漏的部分。
所谓调试,我的意思是,你必须达到一个点,在那里你可以可靠地判断你是否完全理解了某个想法。当你开始独自工作时,这是非常困难的,特别是对于像密码学这样非常微妙的领域。然而,如果你不掌握这项技能,你最终会变成一个怪人:也就是,一个读得很多,理解很少,完全不知道自己有多么困惑和错误的人。很多自学成才的人最后都是这样,所以你得小心。
对于学习一门难的学科,大多数人给出的建议都存在问题,那就是他们把重点放在第三阶段;通常是指着论文或书籍。但是,如果你不具备前两项技能,纸张和书籍就毫无用处。
当然,获得数学成熟度的最简单方法是接受数学本科教育。1个。
成熟可能是需要最长时间才能掌握的技能。计算机科学的数学和理论领域是通过定义、定理和证明来表达的。定义是对某个对象或过程的精确描述。定理是关于某个对象或过程的精确陈述,而证明是关于该陈述为何为真的论点。您应该对此范例感到满意,因为您将看到的所有内容都将以这种方式表达。但是理解这个范例意味着你必须熟悉一些基本的概念,比如量词(即,存在的和普遍的),基本的证明结构(例如,直接的和矛盾的),基本的逻辑,基本的概率,等等。
我所说的舒适,并不是指对这些东西的随意、肤浅的理解,我的意思是,你应该能够自己正确地表述定义、定理、陈述和证明,并能够理解为什么某些表述比另一些表述更好。
你不应该认为数学形式主义是迂腐、枯燥和学究式的。是的,在某些情况下,它们可能有些过头了,因为你可能对一个想法有很好的直觉理解,但有时你的直觉会失效,而当你很好地掌握了形式方法会对你有帮助的时候。尤其是密码学非常不直观,所以形式主义就更重要了-尤其是当你刚开始的时候。
大多数关于密码学的书籍不会帮助你获得数学上的成熟度,因为它假定读者已经具备了数学知识。但是,如果您来自纯粹的系统背景,您可能没有机会开发它(例如,就像我的情况一样)。阅读数学书通常更糟糕,因为数学家很早就学会了这些东西。
那么你能做什么呢?我采取的方法是只阅读我在数学、理论计算机科学和密码学中能找到的所有东西。偶尔,我会幸运地找到一篇论文,对一些基本概念(例如,一些基本的概率论点或稍微详细的证明结构)有一个像样的解释,但大多数时候我不得不自己重建丢失的片段和上下文。
显然,当你有基础知识的时候,这是很容易做到的,但是当你没有的时候,这是非常困难和令人沮丧的。正如你可以想象的那样,填补我知识的空白花了很长时间。因此,理想的方法是找一本书或讲稿来关注这方面的内容。而且-幸运的是你-蒂莫西·高尔斯写了一系列关于每件事的精彩的博客文章,所以你应该读一读:
在任何一门学科中,能够发现自己是否犯了错都是一项既重要又困难的技能。这在安全性和密码学上更是雪上加霜,因为我们不能通过实验来确定某些东西的安全性。幸运的是,在密码学中,我们确实有一种调试方法:即可证明的安全性。可证明安全范例(或者更确切地说,还原主义者范例)由以下步骤组成。一种是首先公式化安全定义,该安全定义捕获从系统期望的安全属性/保证。然后,描述了针对手头问题的密码方案/协议。最后,证明了该方案/协议满足安全定义(通常在一定的假设下)。
可证明安全范式起源于80年代,从那以后一直被密码界用来分析许多原语的安全性,这个范例有很多好处,但最主要的好处之一是它是一个很好的调试工具。在尝试证明原语的安全性时,您有时会发现,由于某种原因,证明无法通过,而且通常是因为协议中的一个细微缺陷,您在第一次设计它时没有发现它。
我想强调的是,可证明的安全范例不是万无一失的,它有其局限性。例如,在密码学的所有领域,如分组密码和散列函数设计,其有用性在历史上一直非常有限。此外,如果正在使用的定义对于正在考虑的应用程序来说是错误的或太弱,则可能会出现问题。当然,安全性的证明中也可能有错误。因此,在使用该框架时应该牢记这些限制,因为盲目地遵守它可能会将您引向歧途。
在我看来,学习可证明安全范例(以及一般的密码)的最佳起点是乔纳森·卡茨(Jonathan Katz)和耶胡达·林德尔(Yehuda Lindell)合著的教科书“现代密码学导论”。我真希望这本书是在我学习密码的时候出版的,因为它会为我节省大量的时间。这本书教你密码学的所有基础知识,同时解释安全定义是如何工作的,以及如何证明各种构造是安全的。与偏重数学的书不同,这本书重温了校样的细节,不会把所有东西都当作练习(对于那些试图独自学习材料、没有任何背景的人来说,这可能会令人难以置信地沮丧)。读完卡茨-林德尔之后,我推荐奥德·戈德雷奇(Oded Goldreich)的“密码学基础”(Foundations Of Cryptoology)第1卷和第2卷。然而,这些文本要先进得多,除非你在做研究,否则你很可能不需要这些材料。
当然,另一个关键的步骤是学习基础知识。这里要做的最简单的事情就是阅读Katz-Lindell。此外,你还可以观看乔纳森·卡茨(Jonathan Katz)的在线公开课(MOOC),它们分别在这里和这里。
所以你已经阅读了Timothy Gowers的博客文章并掌握了基本的数学概念,你已经阅读了Katz-Lindell并理解了可证明安全的基础知识,你已经看过MOOC,所以你知道所有的基本密码学原语及其用途。在这一点上,您应该能够重新加密文件并进行操作。但是,您可能无法设计和分析您自己的密码协议。
要从理解别人的工作跳到创造自己的工作,我认为你唯一能做的就是阐述自己的问题,并尝试去解决它。你是否成功并不重要,重要的是你将立即应用你学到的所有东西,这将迫使你理解这些想法是如何相互联系和互动的。
虽然我认为在这个阶段着手解决自己的问题来积累应用所学知识的经验是个好主意,但重要的是要记住,你还不知道自己在做什么。尤其是,你可能在读完书和看了MOOC之后产生了一种错误的自信心,所以如果你一不小心,你就会走上疯狂的道路。为了避免这一点,从比你更有经验的人那里得到关于你的反馈是至关重要的。这不是一个选项,它是至关重要的!
但是,如果你什么都不知道,你怎么让专家给你反馈呢?这也是我一度面临的一个难题。这是我用过的诀窍。我基本上达到了可以与专业密码学家进行半智能对话的地步。这并不意味着我可以给他们留下深刻印象,只是我知道了足够的基本概念和技术,我可以花10美元的时间就我读过的一些密文进行合理的交谈。一旦我能做到这一点,我就试试运气。例如,我参加了附近大学的密码研讨会。这导致我与那里的教授谈论研究,并最终开始合作项目。
这里要认识到的重要一点是,人们-尤其是成功人士-非常忙碌,他们就是没有时间教你密码学。如果他们是教授,那么他们已经有了和他们一起工作的学生,如果他们在工业领域工作,那么他们就有实习生和他们承诺的雇主。因此,如果你想向他们学习,你应该提供一些东西。
但是,如果你刚刚起步,你能提供什么呢?嗯,如果你仔细想想,你有一样东西是他们没有的:那就是时间。请记住,这些专家非常忙碌,所以他们可能有一大堆他们想要做的项目想法,但这些想法永远不会出现。你能提供给他们的是你的时间。你可以从实施他们的想法开始,并通过实验对其进行评估(这是假设你有很强的工程背景)。通过这样做,你为他们提供了价值,最重要的是,你有机会证明你有良好的职业道德,你尽职尽责,你很容易合作。在你这边,你会更好地学习和内化他们的想法,并把你自己放在一个可以明显改进他们的位置上。一旦你有了良好的工作关系,并对如何改进他们的工作有了一些初步的想法,你就可以顺利地上路了。
这些是我学习密码学的高级策略。如果可以的话,只要在有好的密码组的地方拿到博士学位就行了(记住,计算机科学的博士学位实际上是免费的)。如果你真的不能在Smereason中做到这一点,那么你可以试试我概述的第二个策略。但你应该意识到这将是痛苦的。
数学教育将教您构建大多数密码协议的基础(例如,数论、代数等)。但它不会专门教你如何设计密码原语和协议,或者如何理解和分析它们的安全性。[返回]。
在我刚开始学习密码的时候,有一次我写下了我的一些想法。我认识的一个人同意向一位著名的密码学家做介绍,这样我就可以把我的想法寄给他。在看完我的想法后,他(非常礼貌地)告诉我,我所做的一切毫无意义,解释了原因,然后(再次非常礼貌地)解释了为什么考虑到我所处的阶段,合作会太困难。这是(到目前为止)我发展过程中最重要的阶段之一。他提供的这个小小的反馈让我意识到我获得了一种错误的自信,我还有大量的工作要做!回首往事,这是无价之宝,我至今仍感谢他。[返回]