跳转至

深入浅出密码学#

约 4529 个字 预计阅读时间 91 分钟

前言#

当你拿起这本书时,可能会想,为什么还要再写一本关于密码学的书?甚至会问,为什么我要读这本书?要回答这个问题,你需要了解这一切是从什么时候开始的。

一本多年磨砺之作#

如今,如果你想了解几乎任何事情,你都会去Google、Bing或者百度一下——你懂的。然而,对于密码学来说,取决于你想要查找的内容,相关资源却相当匮乏。这是我很早以前就遇到的问题,并且从那时起一直让我感到困扰。

当年我还在上学的时候,曾经为了课程作业实现过一次差分功耗分析攻击。这种攻击在当时的密码分析领域堪称突破,因为它是首个被公开发表的旁路攻击。差分功耗分析攻击简直像魔法一样:只需在设备加密或解密时测量其功耗,就能提取出其中的秘密。我意识到,一篇优秀的论文可以传达出伟大的思想,但在表达清晰和易懂方面却可能投入甚少。我记得自己曾经绞尽脑汁,反复琢磨作者到底想表达什么。更糟糕的是,我在网上也找不到什么靠谱的资源来解释这篇论文。于是我又继续苦思冥想,终于弄明白了。那一刻我想,也许我可以帮助像我一样、不得不经历这番折磨的人。

受到激励后,我画了一些图表,做了动画,并录制了自己讲解的过程。这就是我发布的第一支关于密码学的 YouTube 视频:https://www.youtube.com/watch?v=gbqNCgVcXsM

多年以后,在我上传了那个视频之后,我依然会收到来自网络上陌生人的称赞。就在昨天,当我写这篇前言时,还有人留言说:“谢谢你,真的讲解得非常好,可能帮我省下了好几个小时去理解那篇论文。”

真是太有成就感了!这次在教育领域“另一面”迈出的第一步,让我充满了继续探索的动力。我开始录制更多类似的视频,还开设了一个博客,专门写关于密码学的内容。你可以在这里查看:https://cryptologie.net

在开始写这本书之前,我已经积累了近500篇文章,详细阐述了本书序言之外的诸多概念。这些都只是练习而已。其实,在Manning出版社联系我提出写书建议的几年之前,写一本书的念头就在我脑海里慢慢酝酿了。

现实世界密码学家课程#

我完成了理论数学的本科学业,却对未来的方向感到迷茫。其实我一直都在编程,也希望能把这两者结合起来。于是,我自然而然地对密码学产生了兴趣——它似乎完美融合了数学和编程的优势。我开始翻阅手头的各种相关书籍,很快就发现了自己真正热爱的事业。

不过,有些事情确实让人烦恼,尤其是那些冗长的开场白,总是从历史讲起;我只关心技术细节,从来如此。我曾暗暗发誓,如果有一天自己写一本关于密码学的书,绝不会浪费一行字在维吉尼亚密码、凯撒密码这些历史遗迹上。于是,在波尔多大学拿到密码学硕士学位后,我以为自己已经准备好迎接真实世界了。可事实远非我所想。

我曾以为我的学位已经足够了,但实际上我的教育在即将面对的真实世界协议方面还有很多不足。我花了大量时间学习椭圆曲线的数学原理,却对这些原理在密码算法中的实际应用一无所知。我学过LFSR、ElGamal、DES,以及一系列其他密码学基础知识,但这些内容后来几乎再也没有用到过。

当我刚进入这个行业,在 Matasano(后来并入了 NCC Group)工作时,我接到的第一个任务就是审计 OpenSSL——这是最流行的 SSL/TLS 实现,几乎为整个互联网提供加密。天哪,那段时间真是让我头疼不已。我记得每天回家时脑袋都像要炸了一样。这个库和协议简直是一团糟!那时候我完全没想到,几年后我竟然会成为 TLS 1.3(该协议的最新版本)的共同作者。

但在那一刻,我已经在想:“这些才是我在学校应该学到的东西。现在掌握的知识,才是真正能让我为现实世界做好准备的!”毕竟,我现在是一名专注于密码学的安全从业者,正在审查实际的密码应用,做着那些人们在完成密码学学位后梦寐以求的工作。我实现、验证、使用,并为他人提供密码算法选型建议。这也是为什么我会成为自己所写书籍的第一个读者。如果能写信给过去的自己,这些内容就是我希望他能提前了解、为现实世界做好准备的知识。

大多数漏洞所在的位置#

我的咨询工作让我有机会审查了许多实际应用中的密码学项目,比如 OpenSSL、Google 的加密备份系统、Cloudflare 的 TLS 1.3 实现、Let’s Encrypt 的证书颁发机构协议、Zcash 加密货币的 sapling 协议、NuCypher 的门限代理重加密方案,以及其他数十个现实中的密码学应用项目——遗憾的是,其中很多我无法公开提及。

刚入职时,我被分配去审查一家知名公司的自定义加密通信协议。结果发现,他们几乎对所有内容都进行了签名,唯独漏掉了临时密钥,这直接导致整个协议失效——任何有安全传输协议经验的人都不会犯这种新手错误,但这些自认为足够专业、敢于自己设计加密方案的人却忽略了这一点。我还记得在项目结束时向他们解释这个漏洞,会议室里一群工程师沉默了整整三十秒。

在我的职业生涯中,这样的故事屡见不鲜。有一次,我在为另一位客户审计一种加密货币时,发现由于签名内容存在歧义,可以利用这一点伪造已有的交易。后来,在为另一位客户审查TLS实现时,我又发现了一些微妙的方法可以攻破某个RSA实现。这个发现最终促成了我与RSA发明人之一合作撰写了一篇白皮书,并导致十几个开源项目被报告了多项通用漏洞与披露(CVE)。最近,在为写书而研究新一代Matrix聊天协议时,我意识到他们的认证协议存在缺陷,进而导致端到端加密被攻破。加密领域中有太多细节,稍有不慎就可能出现严重问题。正因如此,我觉得有必要把这些经历记录下来,这也是为什么我的书中会包含许多类似的轶事。

作为工作的一部分,我会审查多种编程语言中的密码学库和相关应用。我曾发现过一些漏洞(比如 Golang 标准库中的 CVE-2016-3959),也研究过库可能诱导用户误用的方式(例如我的论文《如何在 Diffie-Hellman 中设置后门》),并为大家提供库选择建议。开发者们总是不知道该用哪个库,而我发现这个问题其实并不容易回答。

我后来发明了Disco协议(https://discocrypto.comhttps://embeddeddisco.com),并用不到1000行代码实现了它的全功能加密库,而且还用多种语言编写。Disco只依赖两种加密原语:SHA-3的置换和Curve25519。没错,仅凭这两项技术和1000行代码,开发者就能实现各种类型的认证密钥交换、签名、加密、消息认证码(MAC)、哈希、密钥派生等功能。这让我对优秀的加密库应该具备哪些特性有了独特的见解。

我希望我的书能够包含这类实用的见解。因此,各章节自然会提供如何在不同编程语言中应用“加密技术”的示例,并采用备受认可的加密库。

需要一本新书吗?#

在我为 Black Hat(一个知名的安全大会)做年度密码学培训时,有一位学员过来问我,能否推荐一本好的密码学书籍或在线课程。我记得当时建议他去读 Boneh 和 Shoup 合著的书,并参加 Boneh 在 Coursera 上的《Cryptography I》课程。(这两项资源我也会在本书结尾处推荐。)

学生对我说:“啊,我试过了,太偏理论了!”这句话让我印象深刻。起初我并不认同,但渐渐地我意识到他们说得没错。大多数相关资料确实数学性很强,而大多数开发者在接触密码学时并不想深究数学。那么,他们还能选择什么呢?

当时还有另外两本多少算是受人尊敬的参考书,都是布鲁斯·施奈尔(Bruce Schneier)写的。但这些书已经有些过时了。《应用密码学》花了四章讲分组密码,还专门有一章讲加密模式,但却完全没有提到认证加密。而较新的《密码工程》对椭圆曲线密码学的介绍只在脚注里提了一句。相比之下,我的许多视频或博客文章反而成了一些密码学概念的重要参考资料。我知道自己可以做出一些特别的东西。

渐渐地,越来越多的学生开始对加密货币产生兴趣,关于这方面的问题也问得越来越多。与此同时,我也开始审计越来越多的加密货币应用。后来,我加入了 Facebook,负责领导 Libra 加密货币(现称为 Diem)的安全工作。那时,加密货币无疑是最热门的领域之一,融合了许多极具吸引力但在现实世界中鲜有应用的密码学原语(如零知识证明、聚合签名、门限密码学、多方计算、共识协议、密码学累加器、可验证随机函数、可验证延迟函数等等)。然而,没有一本密码学教材专门讲述加密货币。我意识到,自己正处于一个独特的位置。

我知道我可以写一本书,向学生、开发者、顾问、安全工程师以及其他人介绍现代应用密码学的核心内容。这本书不会有太多公式,但会有大量图示;不会讲太多历史,而是充满了我亲眼见证过的现代密码学失败案例;不会涉及太多传统算法,而是聚焦于我实际见过的大规模应用的密码技术,比如 TLS、Noise 协议框架、Signal 协议、加密货币、HSM、门限密码学等等。这本书不会深入理论密码学,而是专注于那些可能变得重要的内容,比如密码认证密钥交换、零知识证明、后量子密码学等等。

2018年,Manning出版社联系到我,问我是否有兴趣写一本关于密码学的书。其实那时我早已有了答案,也早已知道自己想写些什么。我一直在等待一个机会和一个理由,让我能够投入时间去写下心中构思已久的那本书。巧合的是,Manning有一套“实战”系列丛书,于是我自然而然地建议将我的书作为这个系列的延伸。你现在看到的,就是我两年多辛勤付出和满腔热情的结晶。希望你会喜欢。

致谢#

感谢Marina Michaels一直以来的帮助和宝贵见解,没有她,这本书很可能无法顺利完成。

感谢 Frances Buran、Sam Zaydel、Michael Rosenberg、Pascal Knecht、Seth David Schoen、Eyal Ronen、Saralynn Chick、Robert Seacord、Eloi Manuel、Rob Wood、Hunter Monk、Jean-Christophe Forest、Liviu Bartha、Mattia Reggiani、Olivier Guerra、Andrey Labunov、Carl Littke、Yan Ivnitskiy、Keller Fuchs、Roman Zabicki、M K Saravanan、Sarah Zennou、Daniel Bourdrez、Jason Noll、Ilias Cherkaoui、Felipe De Lima、Raul Siles、Matteo Bocchi、John Woods、Kostas Chalkias、Yolan Romailler、Gerardo Di Giacomo、Gregory Nazario、Rob Stubbs、Ján Jančár、Gabe Pike、Kiran Tummala、Stephen Singam、Jeremy O’Donoghue、Jeremy Boone、Thomas Duboucher、Charles Guillemet、Ryan Sleevi、Lionel Rivière、Benjamin Larsen、Gabriel Giono、Daan Sprenkels、Andreas Krogen、Vadim Lyubashevsky、Samuel Neves、Steven (Dongze) Yue、Tony Patti、Graham Steel、Jean-Philippe Aumasson、Fabian Becker、Daniel Li、Jeff Lau、Filipe Casal、Curtis Light、Vincent Herbert、Donald Piret、Dan Cashman、Ricky Han、Tshaka Lekholoane,以及所有 livebook 评论者,感谢大家在技术、编辑、讨论和修正等方面给予的宝贵意见和反馈。

致所有审稿人:Adhir Ramjiawan、Al Pezewski、Al Rahimi、Alessandro Campeis、Bobby Lin、Chad Davis、David T Kerns、Domingo Salazar、Eddy Vluggen、Gábor László Hajba、Geert Van Laethem、Grzegorz Bernas´、Harald Kuhn、Hugo Durana、Jan Pieter Herweijer、Jeff Smith、Jim Karabatsos、Joel Kotarski、John Paraskevopoulos、Matt Van Winkle、Michal Rutka、Paul Grebenc、Richard Lebel、Ruslan Shevchenko、Sanjeev Jaiswal、Shawn P Bolan、Thomas Doylend、William Rudenmalm,感谢你们的宝贵建议,让本书更加完善。

关于本书#

到现在为止,我已经写《Real-World Cryptography》超过两年了。最初,我的目标是为读者全面介绍现实世界中实际应用的密码学知识。但显然,这样的目标几乎不可能实现。没有哪个领域能被一本书完全涵盖。因此,我不得不在内容的深度和广度之间做出权衡。我希望你能理解我最终所处的这个“盒子”。如果你正在寻找一本实用的书籍,想了解企业和产品实际采用和实现的密码学技术,并且对现实世界中密码学的底层原理感到好奇,但又不需要一本涵盖所有实现细节的参考书,那么这本书正适合你。

谁适合阅读本书#

以下是我认为会从本书中受益的人群类型(当然,请不要让任何人为你贴标签,仅供参考)。

学生#

如果你正在学习计算机科学、安全或密码学,并且希望了解现实世界中密码学的实际应用(无论是为了进入相关行业工作,还是想在学术界从事应用方向的研究),我相信这本教材正是你需要的。为什么这么说?正如我在前言中提到的,我曾经也是这样的学生,所以我写下了这本我当时渴望拥有的书。

安全从业者#

渗透测试员、安全顾问、安全工程师、安全架构师以及其他安全相关岗位,几乎构成了我教授应用密码学课程时的大多数学生。因此,这些内容在我向非密码学专业人士讲解复杂密码学概念、解答他们各种问题的过程中得到了不断完善。作为一名安全从业者,本书同样融合了我为大型企业进行密码学审计的经验,以及在此过程中了解到或亲自发现的各种漏洞。

直接或间接使用加密技术的开发者#

这本书的内容同样得益于我与众多客户和同事的交流,他们大多并非安全专家或密码学家。如今,编写代码时很难完全避开密码学相关内容,因此你需要对所用技术有一定的了解。本书通过不同编程语言的代码示例,帮助你掌握这些知识,如果你感兴趣,还会有更多内容供你探索。

对其他领域感兴趣的密码学家#

这本书是一本面向实用密码学的入门读物,适合像我这样的人使用。记住,最初我是写给自己看的。如果我做得还不错,那么理论密码学家可以快速了解实用密码学领域的全貌;专注于对称加密的研究者也能通过相关章节迅速掌握密码认证密钥交换的知识;而从事协议研究的人则能很快对量子密码学有一个清晰的认识;以此类推。

希望深入了解的工程和产品经理#

本书还试图解答一些更偏向产品层面的问题:这些方法各自有哪些权衡与局限?我将面临哪些风险?这种做法能否帮助我满足合规要求?如果要与政府合作,我是否需要采取某些特定措施?

对现实世界加密技术感兴趣、渴望了解其本质的人#

你不需要具备我之前提到的任何背景,只要对现实世界中的密码学感到好奇就可以阅读这本书。需要注意的是,我不会讲述密码学的历史,也不会教授计算机科学的基础知识,所以至少在阅读这本书之前,你应该对密码学有所了解。

假定的知识背景(详细版)#

要充分利用本书,你需要具备哪些条件?本书假设你对笔记本电脑或互联网的基本工作原理有所了解,至少听说过加密。因为本书讨论的是现实世界中的密码学,如果你对计算机不熟悉,或者从未听说过“加密”这个词,那么理解书中的内容可能会有些困难。

评论