Matrix 精选
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
总有一天,我们会遇见自己的男朋友、女朋友。爱情之神秘,正如密码之鬼魅,捉摸不透,惹人心醉。
诚如 Bruce Schneier 在《应用密码学》的开篇说道:
如果把一封信锁在保险柜中,把保险柜藏在纽约的某个地方,然后告诉你去看这封信,这并不是安全,而是隐藏。
相反,如果把一封信锁在保险柜中,然后把保险柜及其设计规范和许多同样的保险柜给你,以便你和世界上最好的开保险柜的专家能够研究锁的装置,而你还是无法打开保险柜去读这封信,这才是安全的概念。
不如我们就来借着恋爱的故事,讲讲这隐藏和安全的门道。
古典密码,古典而有趣
女生翻开课本,发现有人在自己的书里夹了一张纸条。上面写着:
Se nkgxz oy gtj grcgey corr hk euaxy.
这似乎是一种十分冷门的小语种。然而借助翻译工具,女生几乎尝试了所有支持的语言,却依然寻找不到它的含义。
事实上,这种名为「凯撒密码」的加密方式在古罗马就被恺撒大帝用于军事上的信息传送——它是一种名副其实的「古典」密码了。
凯撒密码的加密方式很简单。首先,你需要在心中想一个 1 - 25 之间的整数,然后按照英文字母表的顺序,给句子中的每一个字母「加上」你所想的那个数。
比如,我们要加密「LOVE」这个词语,那么步骤是这样的:
- 想一个数字,既然 7 待和女生在一起,那就选 7 吧
- 对于「LOVE」中的第一个字母,为它加上 7:L -> M -> N -> O -> P -> Q -> R -> S。于是,L 变成了 S
- 一样的,O 变成了 V
- V 有些特殊,它在到达 Z 后会回到 A 继续向前:V -> W -> X -> Y -> Z -> A -> B -> C
- 最后,E 变成了 L,那么 LOVE 经过加密就变成了 SVCL
这种古典加密的方式,在互联网上有许多工具可以帮助计算——如果你会编程,甚至可以用几行代码自己写一个。我在酷安上找到了一个名为 RSCipher 的应用,可以用它来进行简单的计算:
显然,凯撒密码的解法和加密的方式是相反的。加密可以「增加」,那么解密就直接「减少」一位位尝试,最多尝试 25 次,就可以找到正确的答案了。
回到前面的女生收到的纸条,借助这个手机应用的「向前偏移一位」按钮依次尝试:
点击 6 次后发现了一个有含义的句子:
0. Se nkgxz oy gtj grcgey corr hk euaxy.
1. Rd mjfwy nx fsi fqbfdx bnqq gj dtzwx.
2. Qc lievx mw erh epaecw ampp fi csyvw.
3. Pb khduw lv dqg dozdbv zloo eh brxuv.
4. Oa jgctv ku cpf cnycau yknn dg aqwtu.
5. Nz ifbsu jt boe bmxbzt xjmm cf zpvst.
6. My heart is and always will be yours.
My heart is, and always will be, yours.
真甜。真好。
同一个密码,同一份心意
古典密码只可怡情,它十分容易破解,完全扛不住现代计算机的狂轰乱炸。像前面说的凯撒密码,最多只需要 25 次就可以解出密码,在计算机面前连一秒钟都不需要。
基于强大的数学原理和计算技术,科学家们构筑起了更加稳健的现代密码学。使用「同一个密码」进行加解密的对称加密就是其中十分典型的一种。
今年情人节,男生出差了,不能跟女生一起度过。不过,女生收到了男生送来的一个上锁的盒子,里面藏着今年情人节的小礼物。而这个盒子经过了好几个朋友依次传递送达,却没有任何一个朋友能够知道里面的小礼物究竟是什么。
为什么呢?因为只有女生才知道密码呀!早在男生出差之前,他就已经和女生讨论决定,用他们的纪念日「20200202」作为礼物的密码。
就像 Bruce Schneier 所说的那样,保险箱可以由你随意研究,甚至你可以在淘宝上买到同款保险箱,但是不知道密码,任何其他人都不可以解开这个箱子。
在日常使用电脑的过程中,这种加解密使用「同一个密码」的加密方式我们经常遇到。你一定收到过加密的压缩包吧!压缩包的 加密方式 是公开的,但是只有拥有正确的密码,才能解开压缩包,读取到里面的视频或文件。
公开投递,钥匙却在我手里
窈窕淑女,君子好逑。男生爱上了一个女生,却还没有勇气表白。和所有其他的追求者们一样,男生还不可能跟女生有提前约定的密码。
这天,男生写了一封长长的信件来倾诉他的情意。为了不让自己的小秘密被其他同学知道,男生把信件投到了女生家门口的信箱。而这个信箱的钥匙,只有女生才有;这封信件,也就只有女生才可以读到。
敲黑板,都是知识点。
男生和女生不需要提前约定密码。女生的信箱用来加密,所有追求者都知道她的信箱,都可以投递信件,称为公钥。女生的钥匙用来解密,只有女生自己可以打开信箱,称为私钥。
借助知名的不对称密码工具 GPG(GnuPG,The GNU Privacy Guard),我们可以模拟这一整个收到情书的过程。你可以在 官网下载 到 Windows 和 macOS 的客户端。
在表白之前,男生一定对女生有所了解。无论是女生亲口说了自己家的信箱地址,还是男生从班主任老师那儿打听到的信息,总之,男生会拿到一个类似下面的文件,也就是公钥。这个文件完全公开,无需保密。——如果你好奇这个密钥文件是如何生成的,看到上图中的「新建密钥对」了吗?点击试试,你就可以得到一个公钥和一个私钥。
于是,男生把它导入到自己的 GPG 密钥库中。
迫不及待地,男生使用这个公钥对自己的小情书进行加密。与此相对应的,是男生把信件投入了女生的信箱。
此时,只有女生可以使用钥匙来查看这封信,任何其他人却没办法看到这封信了。甚至连男生自己都不可能再打开信箱阅读信件内容了,除非他提前另外抄了一份。
根据「输出」中的配置,最后会产生一个 gpg
文件,就是加密后的文件内容。
女生作为密钥对的主人,不但拥有公钥,当然还拥有私钥。
收到了这个加密后的文件,女生可以使用 GPG 解密。
保存之后,就会得到信件的原文。
哟,这份爱情,充满了独立的自我,却又温婉可人。
数字签名,比签名更可靠
前面使用 GPG 的过程中,男生拥有女生公开的公钥,使用公钥加密。女生拥有自己的私钥,使用私钥解密。
如果反过来呢?
女生读了男生的信,怦然心动,愿属以一生。于是她决定向全世界宣布这份爱情。但是,如何让大家相信,「我爱上了他」,真的是女生所说,而非男生杜撰呢?对,让女生签个名就好了。
公钥是公开的,而私钥是秘密的。让女生使用只有她能够使用的私钥来签个名,就可以证明确实是她本人在发布文件了。和现实生活中的「签名」一样,数字签名同样可以用来证明「她确实说了这句话」。
于是,女生用私钥对这个文件进行签名。
签名得到的是一个 sig
文件。她把签名前后两个文件发布出去,就像她写了一页纸,签上名之后,贴在了黑板上。所有人都能看到这张纸上的内容,因为有了签名,大家会说:是的,这个确实是女生自己的签名,所以她确实是爱上了他。
如何使用 GPG 来验证文件的正确性呢?同样的,首先男生需要向值得信任的熟人要来女生的公钥文件,导入 GPG 后,进行一次验证操作,GPG 工具会自动核对签名是否有效。
祝贺这个男生,也祝福他们可以永远幸福。
当然,也祝福你,亲爱的读者。祝福你拥有一份美好的爱情,和一个美好的人生。
© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。