序
如果您对有关计算机安全的书有所涉猎,那么很可能见过密码学领域中常见的一个观点:“密码学是安全链中最牢固的一环。”如此说法诚然是一种赞美,但也有些盲目自大——如果密码技术已经牢不可破了,为什么还要花时间改进它,而不去投资那些安全系统中更值得改进的部分呢?
如果您只能从本书中学到一件事,那么我希望它是——以上这种对密码学的观点太过理想化,甚至很大程度上是一个神话。理论上,密码学很强大,但在实践中,在经验不足或者粗心大意的情况下进行的密码应用,和安全系统的其他方面一样很容易发生问题,而现有的许多密码系统就确实如此。而且情况正变得更糟:当密码应用失效时,它们往往也“失效得各有千秋”。
那么,您为什么应该关心这些,又为什么需要这本书呢?
当我在二十年前从事应用密码学领域的工作时,软件开发人员可用的信息往往是零碎而过时的。密码学专家开发了算法和协议,密码学工程师实现了这些算法和协议,并面向其他专家建立了不透明且文档记录很少的密码学库。这就造成了理解密码算法的人与使用密码算法(或无视密码算法)的人之间存在巨大的鸿沟。市面上确实有些不错的理论教材,但真正为开发实践者提供有用工具的书却很少。
现实中的情况并不理想,诸如人们对“CVE(通用漏洞披露)”和“威胁度:高”等报警的忽视和妥协,其中有些甚至是“TOP SECRET”级别的攻击。您可能会更熟悉一些较著名的攻击案例,因为它们影响了您所依赖的系统。之所以会出现许多此类问题,除了因为密码学本身是精妙且优雅的,还因为密码学专家未能与实际编写该软件的工程师分享他们的知识。
值得庆幸的是,这种情况已经开始改变,而本书就是这种改变的一部分。
Serious Cryptography(本书的英文书名)是由应用密码学领域最著名的一位专家撰写的,并且本书不是面向其他专家的。同样,本书也不打算作为该领域的概述,而是包含对密码工程深入且最新的讨论,旨在帮助想在这个领域做得更好的从业者。在本书中,您不仅能学习到密码算法的工作原理,而且还将学习如何在实际系统中使用它们。
本书首先探讨了许多关键的密码学原语,包括分组密码、公钥加密体制、哈希函数和随机数发生器等基本算法。每章都提供了有关算法如何工作,以及您应该或不应该做什么的工作示例。最后几章介绍了TLS等高级主题,以及密码学的未来——在量子计算机到来后我们该怎么做。
虽然一本书不能解决所有的问题,但是学一点知识也定将有所裨益。这本书包含很多这样的知识,也许足以将现实中已部署的一些密码系统改进到人们期望的程度。
祝您阅读愉快。
Matthew D. Green
约翰斯·霍普金斯大学信息安全研究所教授
前言
写一本“我初学密码学时想要读的那本书”是我创作本书的动机。2005年,我在巴黎附近攻读硕士学位,并在即将到来的学期中满怀热情地选了密码学课程。不幸的是,由于选课的学生太少,这门课竟被取消了。学生们总抱怨“密码学实在太难了”,然后就都去选了计算机图形学和数据库课程。
从那以后,我听到“密码学很难”有十多次。但是密码学真的那么难吗?演奏乐器,掌握编程语言,或将任何引人入胜的领域的应用付诸实践,确实需要学习一些概念和符号,但它们还不至于难到需要一个博士学位。我认为要想成为一名合格的密码学家,这个道理也同样适用。我还认为,密码学之所以被说很难,是因为密码学家没有很好地讲授密码学。
我觉得需要本书的另一个原因是,密码学不再只是单纯地研究密码,它已经扩展到了多学科领域。要进行与密码学相关的工作,还需要对密码学相关的概念有所了解,例如,网络和计算机如何工作,用户和系统需要什么,以及攻击者如何利用算法及其实现。换句话说,我们需要与现实联系,把理论落地。
本书的方法论
本书原本的标题是Crypto for Real,以强调我打算讲述的是面向实践的、真实世界的知识,而非那些没有实际意义的方法论。我不想通过简化来使加密变得容易实现,而是将其与实际应用结合在一起。我在本书中提供了源代码示例,并描述了实践中肯定会出现的问题及其灾难性的后果。
除了与现实的明确联系,本书的其他两个出发点是简捷性和现代性。我更着重于形式上的简捷性:不是通过枯燥的数学形式主义提出概念,而是着眼于加深对密码学核心思想的理解,这比记住一堆方程式更重要。为了确保本书的现代性,我介绍了加密技术的最新发展和应用,例如,TLS 1.3和后量子加密技术。我不会花费大量笔墨去讨论DES或MD5等过时或不安全的算法的细节,不过RC4是一个例外,但也仅包括说明它的弱点并显示此类序列密码的工作原理。
本书既不是加密软件的指南,也不是技术规范文档,毕竟您可以在网上轻松找到这些内容。本书的首要目标是让您对加密技术充满热情,并一路向您传达其引人入胜的概念。
本书面向的读者
在写作时,我常把读者想象成一个曾经接触过密码学,但在尝试阅读大量的教科书和研究论文后仍然感到无所适从的开发人员。开发人员经常需要并且想要更好地掌握密码学,以避免错误的设计选择,我希望这本书在这方面会对他们有所帮助。
但是,如果您不是开发人员也不要担心!本书不需要任何编程技能,任何了解计算机科学和具有大学数学(概率论、模算术等)基础的人都可以使用。
尽管它具有相对较低的入门门槛,但是本书还是有一些挑战性的,仍需要读者付出一些努力才能做到深入理解。我喜欢用登山作为类比:作者为您规划了道路,为您提供了绳索和冰镐,但还需要您自己进行攀登。学习本书中的概念可能会很费力,但最后一定会有所收获。
本书的结构
本书共有14章,大致分为4个部分。除第9章为后续的3章奠定基础之外,各章大多彼此独立。但我还是建议您先阅读前3章。
基础部分
第1章:介绍了安全加密的概念,从较弱的笔纸密码到强大的随机加密。
第2章:描述了伪随机数发生器的工作原理,如何保证其安全性以及如何安全地使用它。
第3章:讨论了安全性的理论和实践概念,并对可证明的安全性与概率安全性进行了比较。
对称密码部分
第4章:介绍了以分组为单位处理消息的密码,重点介绍了著名的AES,即高级加密标准。
第5章:介绍了一种看起来是随机比特流的密码——序列密码,要想解密需要将其与密文进行异或运算。
第6章:介绍了哈希函数,其是唯一不需要密钥的密码算法,而事实证明这也是最普遍使用的密码体制基本模块。
第7章:介绍了密钥哈希,其解释了将哈希函数与密钥结合使用会发生什么,以及它如何用于验证消息。
第8章:通过例子介绍了一些同时对消息进行加密和身份验证的算法(例如,标准AES-GCM)。
非对称加密部分
第9章:使用计算复杂度的概念介绍了公用密钥加密背后的基本概念。
第10章:介绍了RSA,其利用大整数分解难题,以简单的算术运算构建安全的加密和签名方案。
第11章:介绍了Diffie-Hellman协议将非对称密码扩展到密钥协商的概念,其中,通信双方通过非秘密值来建立共同的秘密值。
第12章:对椭圆曲线密码学进行了简要介绍,椭圆曲线密码学是速度最快的一种非对称密码学。
应用部分
第13章:介绍了传输层安全性,可以说它是网络安全中最重要的协议。
第14章:介绍了量子计算和新型密码学的概念,以这些科幻的未来密码作为结尾。
致谢
我要感谢Jan、Annie和其他No Starch的员工,他们为本书做出了巨大贡献。尤其是Bill,他从一开始就信任这个项目,感谢他耐心地解决棘手的问题,把粗糙的手稿变成正式的书稿。我还要感谢Laurel,她使得这本书的外观变得如此精美,并处理了我的许多修改请求。
在技术方面,如果没有以下人员的帮助,本书将包含更多错误和不准确之处:Jon Callas、Bill Cox、Niels Ferguson、Philipp Jovanovic、Samuel Neves、David Reid、Phillip Rogaway、Erik Tews,以及所有对早期版本提供错误报告的读者。最后,感谢Matthew Green为本书撰写了序言。
我还要感谢我的雇主Kudelski Security,其让我有时间写这本书。最后,我对Alexandra和Melina的支持和耐心表示最诚挚的感谢。