Revision history and IPFS entry, back to latest
Horo
IPFS What is this

Content Hash

译文:一点点深入端到端加密 -- 公钥密码系统如何保护我们的信息?

Horo
·
·
哇站内隐藏无法取消的嘛……(手滑无药可医)
来自 https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work

如果使用得当,端到端加密可以保护汝的消息、文字甚至文件除了为汝期望的接收者以外 其他的家伙都看不到。它也能保证汝收到的消息确实来自汝所认识的那一位发件人(而不是 别的冒充他/她/它的谁),是呗~

过去的几年中,端到端加密工具如雨后春笋般在各个领域出现(而且达到了可用标准)。例如 像 Signal 这样支持文字消息、语音/视频通话和文件传送的 IM 就是其中的一种咯。这些工具让 监听者无法读取消息的内容(包括服务提供商自己)。

是不是觉得有些端到端加密的实现难以理解?在汝开始使用这些端到端加密工具以前,咱们推荐汝先花一点时间了解一下公钥密码学的基础。

这篇文章所讨论的公钥密码学正是端到端加密所依赖的基础。啥,汝想了解其它的加密类型?去翻翻咱们以前写(翻译)的 《当汝看到加密(encryption)时应该想到什么》 咯~

理解公钥密码学的基本原则(大概)能让汝更正确的使用那些工具,例如公钥加密可以做什么,不能做什么,和何时以及如何使用它。

太长不看版小结

  • 对称密码系统中,加密和解密使用相同的密钥。
  • 公钥密码系统中,参加信息交换的双方各自有自己的两对密钥,称作私钥和公钥。
  • 公钥可以公开,私钥需要安全保护。
  • 发件人用收件人的公钥加密消息,收件人用自己的私钥解密消息。
  • 发件人用自己的私钥签名消息,收件人用发件人的公钥验证消息。
  • 同样地,公钥密码系统保护的是消息的内容而不是元数据。

加密做什么?

当汝以加密的方式传输一些数据的时候:

  • 可以清楚的直接读取的消息(称作“明文”,例如“hello mum”)被加密的话会被混乱成轻易无法理解的形式(例如“OhsieW5ge+osh1aehah6”,称作“密文”)。
  • 这段看起来很像乱码的消息在网上传递。
  • 消息唯一的接收者可以通过某些方法把它还原成原来的形式(“hello mum”),这个过程称作“解密”。

对称加密:以一把密钥传递私密信息的故事

名字什么的最难起啦……以及平常的 Bob 和 Alice 呢?
汝不知道 Alice 和 Bob 是谁?

Julia 想写张小纸条告诉她的朋友 César“Meet me in the garden,”(在花园和我见面),不过她当然不想让她的同学也知道。


(汝有没有在上课的时候给谁传过小纸条咧?)

Julia 的字条会在同学间传递好几次之后才能到 César 的手上。不排除中间有谁会在传递之前悄悄看上一眼, 或者自己抄一份然后记下 Julia 写字条的时间什么的。(汝在期望给汝传字条的同学不会多管闲事嘛?)


Julia 决定用密钥 “3” 来加密她们的消息,每个字母向后移动三位,例如 A->D, B->E 等等。 其实这简单的密钥加密以后的消息看起来像胡言乱语,别有用心的某人还是能够通过尝试所有的组合 的方式来“暴力破解”。换句话说,他们能为了得到解密的答案一直猜下去。

这种移位三个字母的方法其实是一种古老的加密方法,相传是罗马帝国的凯撒大帝发明的,所以也称作凯撒密码。 在这个例子中,字母移位的数量(3)被同时用于加密和解密,这被称作对称加密。

凯撒加密其实挺弱的(按现代的话来说,可以通过频率分析一类的手段破译出密钥(字母移位的数量))。 不过这么长时间过去了,在神奇的算法和电脑的帮助下,加密的密钥可以生成的越来越长,越来越难猜。 对称加密也用在越来越多的场景中。

(汝来想一想

对称加密

有没有问题?)


不过咧,对称加密还剩下一个问题。如果有人在 Julia 和 César 交换密钥的时候窃听,然后窃取密钥怎么办? (毕竟密钥没法再加密的传递出去……) 或者如果她们俩没法在现实见面呢?(例如离得相当远?)

于是让咱们跳过纷繁冗杂的学习过程,就当她们已经熟练掌握公钥加密了吧(大嘘)。 窃听者不太可能得到她俩解密消息的密钥——因为她们根本就不用分享呀。 在公钥加密的过程中,加密和解密的密钥是不同的。

公钥密码:密钥之双城记

拿上汝手边的放大镜(啥?),让咱们离问题更近一些:在有人窃听对话的前提下, 如何只把对称解密的密钥发送给接收者咧,特别是在双方的物理距离非常远的话?

公钥密码学(有时候汝也会看到非对称加密之类的说法,这俩是一样的)解决了这个问题。 它允许每个人在对话中创建两个密钥——通常称作公钥和私钥。两把密钥相互关联,通常是 具有某些特别的数学性质的特别大的数字。如果汝用谁的公钥编码了一段消息,那么他们就 可以用他们的私钥解码。

Julia 和 César 现在要用公钥密码发送加密的消息,于是之前传小纸条的同学们就理所当然的被 一台台电脑取代了呗。它们可能是她们俩之间的电脑,例如 Wi-Fi 接入点,ISP,她们所使用的邮箱的 服务器等等。自然它们也能复制双方传递的消息的内容和记录消息传递的时间。


虽然她们不介意中间有人会看到她们的消息,不过自然的还是不想让别人看到消息的内容。

首先,Julia 需要 César 的公钥,于是 César 把她的公钥寄给了 Julia (例如通过邮件)。她并不 介意通过不安全的通道传递公钥,因为公钥本来就是她可以自由分享的东西。

需要注意的是,公钥和现实生活中的钥匙还有一些区别的。因为 César 可以把公钥拆分成几部分,然后通过不同的通道 发送出去。


有了公钥以后,Julia 就能给她发送加密的信息了:

“Meet me in the garden.”

Julia 发出了只给 César 加密的消息。


虽然她们都可以理解这条消息,剩下的人都认为消息的内容是乱码, 不过中间的人(或者电脑)还是能看到元数据,例如主题、时间、发件人和收件人。


因为消息是用 César 的公钥加密的,因此只有 César 和 Julia(因为是发件人)能阅读这条消息。

César 用她的私钥解密消息:


简单的概括:

  • 公钥密码可以让汝(和其他人)在开放和不安全的通道中传递公钥。
  • 有了朋友的公钥以后,汝就可以给他们发送加密的信息。
  • 汝的私钥用来解密发送给汝的加密的信息。
  • 中间人——像是服务和网络提供商,在消息传递的过程中可以看到一些元数据,例如谁写了 这些消息,发送给谁,接收或者发送的时间和消息的主题等等。

(汝觉得现在可以高枕无忧了?)

还有一件事……如何识别假冒?

在上面的例子中,中间人能够看到整个过程中的元数据。

所以让咱们来耍点坏心眼,某个中间人想知道她们在谈论什么,因此在监听她们。

坏人能够用一些手段让 Julia 得到假的公钥。Julia 没注意到这不是 César 的公钥,还是用它加密了要发给 César 的消息。

随后坏人就得到了本该加密给 César 的消息,它可以看到消息的原始内容,然后再发送给 César 。


甚至可以篡改消息的内容:


于是 Julia 和 César 如约在花园见面,没想到这里已经有人守候多时了……

这就是所谓的“中间人攻击”啦,其实攻击的家伙也不一定是人……幸运的是,公钥密码学有防御这种攻击的手段。

公钥密码学可以让汝通过一种称作“指纹验证”的方式来确认某把密钥确实属于汝认识的某人,(“指纹” 指的是公钥通过某种摘要算法计算出的一串字母,通常比公钥短的多) 这种过程最好在现实生活中完成。如果汝可以和谁面对面的话,汝可以检查双方拥有的公钥的指纹的每一个字母 是否一致。虽然一个一个的看很枯燥,但为了保证汝手上的某把私钥确实属于汝认识的某人的话,就稍微忍受一下吧……

其它的端到端加密应用也拥有类似的指纹验证机制,虽然可能方法各不相同。有些方式比较传统,汝要小心比较双方屏幕上显示的内容是否一致。 有的方法比较“新鲜”,例如用汝手上的设备扫描对方显示的二维码来“验证”某个设备。


如果汝没法和对方见面的话( 担心有去无回么…… ),汝可以在其它已知安全的地方交换指纹,例如端到端加密的聊天软件,或者一个 HTTPS 网站。

总结一下:

  • 中间人攻击是指有人在某个双方之间拦截传递的消息,攻击者可以修改消息、或是只是简单地监听。
  • 公钥密码让汝通过验证发送者和接收者的身份来防御中间人攻击,这种方法被称作“指纹验证”。
  • 汝(或者汝的朋友)的公钥也包含一些被称作“指纹”的信息,汝可以通过指纹验证公钥持有人的身份。
  • 私钥用于解密发给汝的消息,也用来以汝的名义签名消息。

签名时代

公钥密码让汝不用冒险把解密密钥发送给汝私密消息的接收者,因为他们已经拥有了,就是他们的私钥。 因为公钥只用来加密而不能解密,因此汝(和汝消息的接收者)可以把公钥分享出去,汝发送私密信息所需要 的也只有接收者的公钥而已。

不过只有这样么……咱们已经知道了用特定公钥加密的消息只有用公钥对应的私钥解密。其实反过来也是, 用特定私钥加密的消息只能用私钥对应的公钥来解密。

啥,这有啥用?汝用汝自己的私钥加密一段消息然后让随便什么人用汝的公钥解密来看嘛…… 别那么着急嘛,再想想,例如汝写了一句话,然后用汝的私钥加密。大家都能解密汝的消息, 但只有持有汝私钥的人能写出这条消息。如果汝能小心翼翼的保护汝的私钥的话,多半只有汝 自己有汝自己的私钥,也就只有汝能发出这条消息了是呗~

通过用汝的私钥加密消息,汝确保了这条消息只会是汝所写的,是不是感觉哪里眼熟?没错,就和 实际生活中汝在某些地方签下汝自己的名字一样,汝对汝的数字消息完成了同样的操作。

签名同时也能防止篡改。毕竟大多数情况下,其他人不能用汝的私钥重新签名是吧…… 因此,已签名的消息可确保它来自某个特定来源,并且不会在传输过程中被搞得一团糟。

复习:关于公钥加密

公钥密码让汝可以把消息安全的发给知道对方公钥的人咯。

如果有人知道了汝的公钥:

  • 他们可以发送只有用汝的私钥解密的私密信息。
  • 汝可以用汝的私钥签名消息,而他们可以用公钥验证签名有效。

如果汝知道其他人的公钥:

  • 汝可以解密来自他/她/它的消息,而且可以验证消息确实来自那一位。

所以很明显啦,汝(或其他人)的公钥传播的越广,这个加密方式就越有用处是呗。既然 公钥可以分享,汝也可以以现实中的什么东西类比一下啦,例如通讯录或者电话黄页什么的: 它是公开的,人们知道哪里可以找到,汝也能广泛的分享它。

至于私钥呢,汝还是拿现实中的什么东西类比一下好了,例如开门或者各种锁的钥匙。汝的 私钥用来加密和解密消息,所以务必要像对待手上真正的钥匙一样对待它。

为啥汝的私钥明显的(如此)重要?如果汝丢了钥匙,汝就有可能打不开某处。公钥加密中私钥 也是如此,如果汝弄丢了私钥,汝就没法解密发送给汝的信息了。如果谁拿到了汝的钥匙,他就能 以汝的名义打开某些地方。如果其他人拿到了汝的私钥(例如物理接触到汝的电脑,通过恶意软件, 或者只是因为汝像个大笨驴一样把汝的私钥发了出来等等),他就能读取汝加密的信息,或者冒充汝 做些什么。
也曾经有听说过某些政府试图窃取某些人的私钥的经历(像是强行收缴电脑啊,钓鱼攻击或者想方设法的 安装恶意软件等等)。这当然是对公钥加密安全性的损害。 既然汝大多数时候遇不到那么交迫的情况,那咱们来换个栗子:有扒手在汝停下来休息的时候偷走了汝的钥匙,然后去配了一把新的,把原来的钥匙悄悄地放回汝的口袋里。汝可能觉得什么都没发生,然后发现有人光顾了汝的家门……

所以又到了老生常谈的威胁模型时间了:估算汝可能遇到的风险,并设计相应的应对措施。 例如既然汝担心谁觊觎汝的私钥的话,汝大概就不会使用某些浏览器中的端到端加密方案了吧,汝也会想方设法 确保汝的私钥只留在汝自己的电脑上而不是别处(例如其他人的服务器或所谓的云端)。

公钥密码学总结和典型实例: PGP

虽然咱们是分开演示的对称加密和公钥机密,不过公钥加密的过程中也有机会用到对称加密啦。 例如是记得操作中,公钥加密加密的是解密对称加密的消息的密钥。PGP 就是把对称加密和公钥加密 结合起来的典型例子。

(汝有时会看到像是 openPGP 或者 GnuPG 一类的家伙,是因为 PGP 本身是私有的啦,于是不少人开发了 类似的软件,它们都支持 openPGP 规范。而其中最常用的就是 GNU 开发的 GnuPG 咯……)

所以那些密钥到底是什么,它们是怎么结合在一起的?

公钥密码学基于有两把密钥这一前提,一个负责加密,一个负责解密。 基本上,汝可以把其中一把密钥在互联网这样的不安全通道上传递,这把称作公钥。 汝可以把公钥公开到随便哪里去而不会影响到加密信息的安全性。

公钥和私钥构成一对密钥,有时也把它俩一起称作一个密钥对

既然公钥可以分享,汝也可以以现实中的什么东西类比一下啦,例如通讯录或者电话黄页什么的: 它是公开的,人们知道哪里可以找到,汝也能广泛的分享它。

至于私钥呢,汝还是拿现实中的什么东西类比一下好了,例如开门或者各种锁的钥匙。汝的私钥用来加密和解密消息,所以务必要像对待手上真正的钥匙一样对待它。

让咱们来看一看一种经常在公钥密码中用于生成密钥的算法,叫做 RSA (以发明这种算法的三位科学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman) 的姓氏命名)。

私钥由两组特别大的质数组成
公钥是私钥的两组数的乘积,因为私钥是两组特别大的质数,所以在相当长的一段时间内很难猜出来

公钥和私钥同生共死(?只是一起生成啦……),而且都依赖于特别大的秘密质数。私钥由两组特别大的质数组成, 而公钥就是它们的乘积。以公钥推算出私钥的两个质数的尝试十分困难。

为啥咧?因为现在还没有一个又快又稳定的分解质因数的算法啦……随着时间的推进,现代的加密套件也允许用户生成 更大更难猜的质数作为密钥。

(以及随着时间推进,更现代的加密算法也被发明出来,像是椭圆曲线加密算法(ECC)和 ElGamal 等等。)

这就是公钥加密的强大之处了,参加加密信息交换的双方在不安全的通道中交换的信息只有双方的公钥啦! 因为不需要交换私钥,所以(理想的情况下)私钥自然不会泄漏。

铭记:需要双方的公钥让公钥密码工作。

换种说法:公钥和私钥一起生成,像阴阳一样交织在一起。

公钥可以搜索和分享,汝可以把它随便发送到哪里去。如果汝不介意暴露邮件地址的话,汝可以把它放在社交媒体 或是汝自己的网站上。

私钥需要安全的保护起来。因为越多的话保持安全和秘密就越困难,所以汝肯定只想留着一把(而且不要搞丢), 而不是把它分享出去或者弄得复件到处都是。(?)

PGP 如何工作

所以说了那么多,PGP 到底是如何工作的呢?假设汝要向 Aarav 发送一些私密消息:

  • Aarav 有一对密钥,像一个优秀的公钥密码用户一样,他把他的公钥放在了他有 HTTPS 的网站上。
  • 汝下载了他的公钥,用它加密了一些消息发送给他。
  • 因为只有他有他自己的私钥,所以只有他能解密发送给他的消息。

PGP(Pretty Good Privacy,优良保密协议)就是聚焦于创建和使用公钥和私钥这些细节的结合。 汝可以创建一对密钥,用密码保护私钥,以及用私钥和公钥加密和签名文本。

如果汝一定要总结一下的话:用足够强的密码短语保护汝的私钥,而且放在安全的地方。

元数据:公钥加密不是银弹

公钥加密的一切(秘密,一致性,防止篡改)都是在保护消息的内容。但这绝对不是汝唯一在 隐私上需要关注的问题,就像前面所说的一样,关于消息的信息(有时被称作“元数据”) 也可能暴露消息的内容。

某些情况下,仅仅是交换加密的信息也有可能让汝遇到危险。例如某些政权中的持不同政见者, 或者仅仅是拒绝解密消息。

伪装汝在和某人交流的事实也许会相当困难。在前面的 PGP 中,一种可行的方法是双方使用 通过匿名网络(例如 Tor )访问的匿名邮箱。在这种情况下, PGP 还是十分有用,无论是 在其他人间保护双方的私密消息,还是证明消息的作者和传递过程没被篡改。

说了那么多,不妨亲手试试看一些端到端加密的应用吧, 例如 可用于 iOS 和 Android 的 Signal

CC BY-NC-ND 2.0