我为什么要写一本关于密码学的书

2020-07-06 08:10:09

我现在写一本关于应用密码学的书已经有一年半的时间了,我的旅程即将结束,因为我还有最后一个雄心勃勃的章节要写:下一代密码学(我将用这一章来谈论将变得越来越实用的密码学:后量子密码学、同态加密、多方计算和ZK-snarks)。

我被问过很多次,为什么要写一本关于密码学的新书?我为什么要读你的书?要回答这个问题,你必须明白这一切是从什么时候开始的…。

今天,如果你想了解几乎任何东西,你只需在谷歌上搜索即可。然而,对于密码学来说,资源可能相当匮乏,这取决于你正在寻找的是什么。

有一天,为了上课,我不得不实施一项差分功率分析攻击。我当时正用头撞墙,试图弄清楚保罗·科彻的白皮书想要说什么,但找不到一个很好的资源来很好地解释它。所以我又撞了一下头,最终得到了它。然后我想我可以帮助别人。所以我画了一些图表,把它们制作成动画,然后记录下自己正在看的内容。这是我的第一个录像带。

教育的第一步足以让我想要做更多,我开始制作更多这样的视频,并开始在这个博客上写更多关于密码学的文章(现在总共有500多篇文章)。

我很早就意识到图表对理解复杂的概念非常有帮助,奇怪的是,该领域的大多数资源都回避它们。例如,密码学中任何想到AES-CBC的人都会直接想到维基百科图表:

所以我在这里,试图解释我所学到的一切,努力思考什么样的简单图表可以轻松地传达这些复杂的概念。这就是我开始考虑写一本书的时候,在曼宁出版社与我签约出版之前,已经有很多年了。

由于长期的爱好,我没有开始密码学。我读完了理论数学学士学位,不知道下一步要做什么。我一生都在编程,我想把两者调和起来。自然而然,我对密码学产生了好奇,因为它似乎两全其美,于是开始阅读我可以支配的不同书籍。我很快发现了我生活的使命。

不过,有些事情让我很恼火。特别是从历史开始的冗长的介绍。我只对技术细节感兴趣,而且一直都是这样。我对自己发誓,如果我写一本关于密码学的书,我就不会写一行关于维格涅尔密码、凯撒密码和其他密码的文章。

因此,在申请了波尔多大学的密码学硕士学位并获得了该学科的学位后,我认为我已经为这个世界做好了准备。我所知道的很少。我认为非常实用的学位实际上缺乏关于我即将攻击的现实世界协议的很多东西。我花了一个学期的时间学习椭圆曲线的数学,但对它们如何用于密码算法一无所知。我已经了解了LFSR,ElGamal,Des和一系列其他密码原语。

因此,当我刚进入这个行业时(在Matasano/NCC Group),我的第一份工作是审核OpenSS。这是怎么回事?我记得每天回家时都头疼得厉害。真他妈的是个图书馆。当时我根本不知道多年后我会成为TLS 1.3的合著者。

但在这一点上,我已经在想:这是我在学校应该学到的知识,我现在学到的知识对我进入现实世界是有帮助的,毕竟我现在是一名专门从事密码技术的安全从业者,我正在审查现实世界中的密码应用程序,我正在做人们在完成密码学位后希望他们拥有的工作,我实现、验证、使用和建议使用什么密码算法。

这就是为什么我是我正在写的这本书的第一个读者,这是我会写给我过去的自己的,为了让我为现实世界做好准备。

我的咨询工作让我审核了许多现实世界的密码应用程序,比如OpenSSL,谷歌的加密备份系统,Cloudflare的TLS 1.3实现,We‘s Encrypt的证书授权协议,ZCash的Saving协议,NuCypher的门限代理重新加密方案,以及几十个和几十个其他现实世界的密码应用程序,不幸的是,我不能公开提及这些应用程序。

在我工作的早期,我的任务是审计一家我无法命名的大公司的自定义安全传输协议。结果发现,他们忘了签署临时密钥,这完全破坏了整个协议。任何有安全传输协议经验的人都会犯一个新手错误,但那些认为他们已经试验过足够多的人来使用他们自己的密码的人忽略了一些东西。我记得在合约结束时解释了这个漏洞,整个房间的工程师都沉默了整整30秒。

在我的职业生涯中,这个故事重复了很多次。有一次,在为另一个客户审核加密货币时,我发现了一种方法,可以从现有的交易中伪造交易。查看另一个客户的TLS实现时,我发现了一些微妙的方法来破坏RSA实现,然后它变成了一本白皮书(RSA的发明者之一),导致了数十个CVE。最近,作为我写书的一部分,我在阅读有关Matrix的文章时,意识到他们的身份验证协议完全被破坏,导致他们的终端完全崩溃-

在使用密码学的过程中可能会失败的事情太多了,在这一点上,我知道我必须为此写点什么,这就是为什么我的书里有很多这样的轶事。

作为工作的一部分,我会用多种编程语言检查密码库和应用程序。我发现了错误(例如,Golang的标准库中的CVE-2016-3959),我研究了库可以欺骗您滥用它们的方法(例如,请参阅我的论文How to Backdoor Diffie-Hellman),我还建议使用哪些库。开发人员永远不知道要使用哪个库,而我总是发现答案很棘手。

我接着发明了DISCO协议,并用不到1,000行代码用几种语言编写了一个功能齐全的密码库。DISCO只依赖于两个密码原语:SHA-3和curve25519的排列。是的,开发人员在1000行代码中只需要这两个元素就可以进行任何类型的认证密钥交换、签名、加密、MAC、散列、密钥派生等。这让我对一个好的密码库应该是什么样子有了一个独特的视角。

我希望我的书包含这些实用的见解,因此,自然地,不同的章节包含如何使用备受尊敬的密码库在不同的编程语言中进行加密的示例。

当我在黑帽学院(Black Hat)进行年度密码学培训时,一个学生来找我,问我是否可以推荐一本关于密码学的好书或在线课程。我记得我曾建议那名学生阅读Coursera上的Boneh&;Shoup和Boneh的密码学I的那本书。

这名学生告诉我:“啊,我试过了,太理论化了!”这个答案让我印象深刻。起初我不同意,但慢慢地意识到他们是对的。这些资源中的大部分都是相当重的数学知识,而且大多数与密码学交互的开发人员都不想处理数学。
他们还有什么?当时另外两个颇受尊敬的资源是“应用密码学”和“密码工程”(都来自施奈尔)。但这两本书开始变得相当过时。“应用密码学”花了4章时间。有整整一章是关于密码操作模式的,但没有一章是关于认证加密的。密码工程只提到了椭圆曲线密码(在脚注中)。

另一方面,我的许多视频或博客帖子正在成为一些密码学概念的很好的主要参考资料。

渐渐地,我的许多学生开始对加密货币感兴趣,就这个主题提出了越来越多的问题。与此同时,我开始审核越来越多的加密货币应用程序。我终于转到Facebook的一份工作来研究Libra.CryptoCurrency现在是最热门的工作领域之一,它混合了许多非常有趣的密码原语,这些原语到目前为止还没有见过现实世界的用例(零知识证明、聚合签名、门限密码学、多方计算、共识协议、密码累加器。清单不胜枚举)

我知道我可以写一些东西告诉学生、开发人员、顾问和其他人……。现代应用密码学的全部内容。

这将是一本公式很少,但充满了很多图表的书。

这将是一本几乎没有历史的书,但充满了关于密码失败的现代故事,我亲眼目睹了这些故事。

这将是一本几乎没有关于遗留算法的书,但充满了我个人看到的规模化使用的密码学:TLS、噪声协议框架、Wireguard、信号协议、加密货币、HSM、门限密码术等等。

这将是一本几乎没有理论密码学的书,但充满了可能变得相关的东西:密码认证密钥交换、零知识证明、后量子密码学等等。

2018年,当曼宁出版公司(Manning Publications)联系我,问我是否想为他们写一本关于密码学的书时,我已经知道了答案。我已经知道我想写什么了。

巧合的是,他们有一系列真实世界的书,所以我很自然地建议我的书延长一下。

我希望这本书是关于应用密码学的最好的书。因此,如果你有什么反馈意见,请寄给我:)