首先,如果这是一个不适口的问题,请允许我道歉。我还要指出,我绝不会寻求全面的答案,只是您对如何使诸如NSA之类的公司有价值的资产的想法。我是美国的数学专业学生,并且我意识到解决这个问题的知识至少是必需的。

我认为其他一些有用的答复包括课程作业,相关的编程语言以及有用的书。我目前正在阅读Schneier的(应用程序密码学)。

评论

不确定我会否将NSA称为公司。

@mikeazo,他的意思是“公司”。

@Pacerier不,这将再次表示公司。根据其定义,“公司”是指授权作为单一实体并在法律上得到承认的大型公司或公司集团。对于诸如NSA之类的3个字母的机构,正确的用语是“政府机构”;例如,例如DARPA。如有疑问,可能会提醒您自己这个名称已经表明它是什么的事实:“国家安全局”。政府机构与公司/公司有很大的不同。 #JustSaying

#1 楼

看来我们有一致的兴趣。我也是一名大学生(尽管我是数学/自然科学双专业),希望从事密码学工作。为此,我已经研究了一段时间了。所以,用我所说的盐说些什么。作为警告,本文专门针对密码学家经常遇到的主题,而不是作为一个人的个人,这使您成为加密机构的雇员有用。

从我能最好地看出,计算机科学的必要知识完全取决于您想对密码学做些什么。如果您希望在某个应用领域工作,那么您最好对计算机科学的基础知识有很深的了解。如果要实现算法,则可能需要了解现代计算机体系结构的基础。

原因很多。首先,对计算机体系结构的了解将使您像其他人一样优化代码。例如,对诸如指令级并行性和流水线之类的知识非常重要,因为充分利用两者的优势可以大大加快代码的速度。其次,您可能需要了解有关体系结构的一些基础知识,以确保方案的安全性。例如,如果您使用智能卡,则需要能够设计或至少验证防篡改电路的安全性。

此外,您将需要对C有很深的了解,因为C与硬件非常接近,因此相距不远。据我所知,绝大多数“严肃的”加密代码都是用C编写的,即使它周围有语言包装(例如PyCrypto)。其他语言,尤其是解释性语言,根本不允许与C具有相同的性能,我们喜欢高性能的实现。 C的另一个卖点是,在加密中,您最经常使用原始字节和位,这正是C发挥作用的地方。这是低级工作的事实语言。

为此,如果您要使用应用密码学,我真的建议您选修计算机科学的辅修课程。相关课程包括入门编程,操作系统,汇编语言,体系结构和复杂性理论。但是,网络上有很多计算机科学资源,因此,即使根本不可能,也不要气disc!优秀的C资源是“艰难学习C”。如果您想了解有关操作系统的更多信息(如果您编写的代码将在真实的计算机上运行,​​尤其重要……),那么“操作系统设计和实施”是一个很好的资源。不幸的是,由于该领域的快速发展,我对计算机体系结构没有很好的参考。我建议尝试了解当前加密算法实现的一些优化。

当然,要想深入了解加密,您必须对数学有深刻的理解。 《应用密码学手册》是一般加密技术的极佳参考书(顺便说一句,在链接的网站上,整本书免费在线提供),整章专门讨论了必要的数学背景,然后又整整一章专门介绍了加密技术。数论问题。由于您是数学系学生,所以这可能是您的发亮之处。

HAC列出了概率论,信息论,复杂性论,数论和抽象代数作为入门背景材料,而兔子洞也越来越深。在该列表中,我认为没有任何特定区域可以忽略。它们都经常在加密的不同领域使用。如果您愿意,我可以举一些具体的例子。

您还将需要理论计算机科学的工具。 (有时,您甚至会把密码学视为理论计算机科学领域的一个领域,尽管我认为这个定义是相当严格的。)

当然,复杂性理论已经在清单中,而且确实是就密码学中的TCS主题而言,该节目的主要明星。但您可能还需要了解一些计算模型,例如布尔电路,图灵机,随机存取机等,因为有时它们对特定问题很重要。 (例如,克雷格·金特里(Craig Gentry)在其论文中提出的全同态加密方案中,将布尔电路用作计算模型。)不过,您可以将这些计算模型视为计算复杂性理论的一部分。

信息理论也在HAC的主题列表中,您有时可能会发现它包含在理论计算机科学列表中。坦率地说,理论计算机科学与数学之间的界线常常模糊不清。

为了获得理论计算机科学的良好参考,我首先会推荐一本有关复杂性理论的好文章;我研究的是Papadimitriou的计算复杂性。 cstheory.se上的优秀人们推荐了另外两本关于复杂性理论的著作,但我无法提供任何评价。他们还有一个帖子专门介绍一些关于加密的好书,我刚才发现了!我还没有看到清单上的一些东西。通常,完整的帖子值得一看,但是我想我会将您链接到特定于加密的区域。

当然,我们可以说,密码学领域在现实世界中的应用要比其他领域少。零知识证明的想法就是这样的一个例子,即证明您知道某事却不透露那是什么。这些东西有时会被应用,并且它们的应用非常棒,但是,据我所知,它们还没有被广泛地用作加密的通用“保证机密性和完整性”区域(例如, AES + HMAC)。至少不是在公众眼里。如果您不满意,请查看此StackExchange的首页。

要获得有关“理论”密码学主题的良好参考,我强烈建议Goldreich撰写《密码学基础》。这是一部两卷的著作,涵盖了潜伏在背景中的真实理论材料。第二本书比第一本书更实用。此外,尽管我还没有进行广泛的研究,但是Katz和Lindell的《现代密码学入门》也相当不错。

当然,也有通用的加密参考,这可能是您追求的最高水平这里。 Schneier(et al?)的Applied Cryptography和其他书籍很好。我在上面链接到的HAC是一个很好的书,它还以大量理论触及了应用密码学中的大量主题。我链接到上面的帖子(在cstheory.se上)也有一些建议。对于主题的良好历史记录,我强烈建议(如果您想简短起见)《密码书》,它是对加密货币历史的很好概述。当然,如果您对此感兴趣,那么总是可以找到有关该主题的书,即Kahn的The Codebreakers。您也可以看到Thomas Pornin在与security.se类似的问题上的出色回答。

简而言之,这篇文章是加密中一些可能的自学选择的高级概述。由于我只是一名大学生,所以我无法告诉您雇主做什么和不希望您知道(尤其是NSA),也不能告诉您哪些主题是当前研究中最重要的。我也不会声称这篇文章是完整的,也不会遗漏任何明显的内容。但是我认为它是相当准确的,至少在我的知识和经验允许的范围内。

评论


$ \ begingroup $
一个非常有用的答案,谢谢您抽出宝贵的时间来撰写本文。问候
$ \ endgroup $
– Moderat
13年5月24日在6:32

$ \ begingroup $
A +,很好的分析。
$ \ endgroup $
–adhg
13年5月25日在1:43

#2 楼

您的问题只是定义不清。问题是“密码术”一词可怕地重载了。我认为至少有三种不同的加密方式:学术界的密码学。正如里德所说,学术密码学主要源于复杂性理论。除少数例外,您不需要太多数学知识就能在这里取得成功。您的高中/入门级概率论和数论课程可能就足够了,尽管有关概率论方法的课程不会受到损害。如果您有兴趣长期进行此操作(听起来不像是您的问题),那么您可能想读一本类似Sipser的计算理论的书。 Papadimitriou,Arora-Barak和Goldreich推荐的Reid的书也不错,但难度更高,所以我建议先阅读Sipser的书。现在的工作问题已经无关紧要了,因为如果要在这个领域工作,就得先去读研究生。
用于软件开发或工程/芯片设计的密码学。老实说,密码学的这个领域状况不佳,因此您在这里的帮助会倍受赞赏,但结果是进入的门槛很低。我会争辩说,从事软件或硬件加密工作的人中有90%实际上并不对该领域有任何正式的了解。因此,阅读像《应用密码学》这样的书并细读这里的论坛已经使您处于领先地位。当然,您将需要学习很多有关软件开发或芯片设计(或两者)的知识。对于前者而言,以任何编程语言成为可服务的开发人员都是一件好事;我同意Reid关于C的观点,但我还要指出Python和Java对数学(一般而言)和加密(特别是)具有良好的库支持,因此,如果您实际上正在开发更高级别的加密协议,它们可能会更有用。例如,C适用于实现新的加密方案,但是Python或Java可能更适合使用现有的低级加密方案作为构建块来构建类似于TLS的新协议。另外,我建议您查看Matasano加密挑战之类的东西,以了解常见的加密实现陷阱。如果您对硬件设计感兴趣,我总是喜欢Patterson和Hennessy的书。
数学密码学和密码分析。这听起来很可能是您真正感兴趣的领域。为此,除了可以推荐的数学课程之外,我没有什么可推荐的。最重要的课程是概率论,数论和抽象代数,但其他主题也可能是相关的。老实说,没有什么学术课程可以使您成为一名出色的密码分析员;这仅仅是您“边做边学”的事情。参加这些课程,再加上阅读Schneier的书籍,应该足以让您获得实习机会,并且可以从那里开始。由于您提到了数学背景并且对NSA感兴趣,因此您可以在秋天尝试申请。

我希望这会有所帮助。祝你好运!

评论


$ \ begingroup $
非常感谢您的回答。我是在一个夏季研究项目的基础上学习Python的,在这个项目中,我必须使用Sage来计算代数的特征,并且我正在研究计算机科学硕士课程以改善我的compsci背景。实际上,我对您答案的第二部分以及如何克服进入门槛更加感兴趣。是否有可以将我当作数学本科生的工作?还是我应该首先尝试申请计算机科学硕士课程?再次感谢您抽出宝贵的时间。问候。
$ \ endgroup $
– Moderat
13年5月25日在16:04



$ \ begingroup $
@Zvpunry对我来说,回答这个问题可能为时已晚,但我刚刚看到了您的评论。学习Python和Sage非常酷,但是正如您所说的那样,它对于加密工程问题并没有多大用处。尽管有很多可用的编程工作,但是需要具备良好的Python编程技能的数学本科生。因此,您可能只想从那里开始。但是,如果您对事物的硬件方面真的很感兴趣,那么这是一个完全不同的主题,您可能想在离开大学之前参加一些EE课,以便做好更好的准备。
$ \ endgroup $
– Mayank Varia
13年8月4日在15:29

$ \ begingroup $
一点也不,我感谢您的建议,感谢您抽出宝贵的时间来答复。看来我应该是:1)能够理解理论,并且2)善于实践它
$ \ endgroup $
– Moderat
13年8月5日在16:59

#3 楼

我是密码学的硕士课程,在应用密码学方面,我有几个夏天的经验。密码学是一个广阔的领域,它涉及很多方面。如果您正在学术界研究密码学,那么我绝对建议您具有数学和计算机科学方面的深厚背景,并且在满足之前的要求的前提下,还要具有强大的编程/实现能力。如果您想阅读一些“加密经典著作”以对几种不同的加密领域进行示例,那么我建议您使用此列表(这不是我的网页,只是我偶然发现的内容):

http:// www。 cs.utoronto.ca/~sgorbunov/personal.html

评论


$ \ begingroup $
我对应用密码学而不是学术界感兴趣,是否有任何方法可以张贴您有经验的地方的一些名称?问候。
$ \ endgroup $
– Moderat
2013年5月27日15:13

#4 楼

我是JHU的研究密码学的研究生。如果您想在学术界研究密码学,最好具有强大的数学能力。在我看来,编程是一种基本能力,软件只是一种实现您的想法的工具。首先取得突破的密码学家具有强大的数学和理论计算机科学背景。