这几周是「国家网络安全宣传周」。许多上了川大网络安全少年班班,网络安全是干什么呢?我不知道。我只会玩电脑🤪,给大家讲点玩电脑基本常识。
我想起在初一还是初二的时候,我们小组要讲一个网络安全主题班会。我给大家介绍了 HTTPS 和 RSA 相关内容,结果 RSA 讲到一半就给 cyb 叫停了😭️。
但是这里我想介绍什么就介绍什么。
RSA
假如 Alice 和 Bob 希望通信,但是两人之间的信道是公开的,任何人都能知道 Alice 和 Bob 交换了什么信息。那么 Alice 和 Bob 还有有办法加密通信吗?
有的兄弟有的。假设是 Bob 要给 Alice 发消息。Alice 先生成一对密钥,具体操作如下(以下内容中红色表示被公开的信息,当然整个算法也是被公开的):
- 选一对大素数 和 。
题外话,如果你也希望生成一个大素数的话,可以使用:openssl prime -generate -bits <位数>。比如openssl prime -generate -bits 1024就能生成一个 1024 位(二进制位)的素数。以前我写字符串哈希的时候喜欢这样干,不过后来有人告诉我固定大素数模数然后运行时随机 base 更能防 hack。 - 令 。
- 计算 。
- 随便选一个在 意义下有逆元的数 (也即 ,很多时候用的是 )。
- 计算 的在 意义下的乘法逆元,记作 。
- 然后将 公开,这是公钥, 自己保管好,这是解密用的私钥。
Bob 现在知道了 Alice 公开的 ,他有一段想要偷偷发给 Alice 的信息 ,那么他只需要将 发给 Alice。
最后 Alice 只需要解密消息,计算 ,便得到了 。其原理是 ,即欧拉定理。
那么安全性怎么保证?这个也叫做 RSA Problem:已知 ,,,求 。虽然和质因数分解不等价,但是目前比较好的解决方法也只有分解 N。所以 RSA 的安全性很大程度上依赖于质因数分解。然而质因数分解目前没有多项式复杂度算法,所以想要分解长达 2048 甚至 4096 位的 ,几乎是不可能的。
但是,RSA 运算太慢了,如今大家聊天软件中随随便便就传个几 MB 甚至 GB 级别的文档,RSA 的速度无法接受。于是一个好的方案是,随机生成一份强密码,将这个密码用 RSA 传输,具体的消息传递用更快速的对称加密,如 AES 等。
Diffie–Hellman
这是一个专门用于交换密钥的算法。
- Alice 和 Bob 公开选一个素数 和其一个原根 。
- Alice 随机选一个私钥 ,计算公钥 ,并公开。
- Bob 也同理随机选一个私钥 ,计算公钥 ,并公开。
- ,这就是双方协商出来的密钥。
然后就可以拿这个 去对称加密通信了。
安全性在于想从计算 和 计算出 ,需要解出 或 ,但这是离散对数问题,目前没有多项式复杂度算法。
椭圆曲线
椭圆曲线不是圆锥曲线,而是类似 的曲线。在 意义下椭圆曲在线的点可以定义加法乘法。所以自然能想到把上面这些算法搬到椭圆曲在线。
好处是椭圆曲线离散对数问题比 RSA 更难一点,因此用更短的密钥能达到同等的安全性。
签名
非对称加密还有一个用途就是用于签名,其实相当于将 RSA 逆用,RSA 的公钥私钥有明显的对称性。
Alice 有一对 RSA 公私钥,然后又发布了一条消息,怎么证明这条消息确实是 Alice 发布的?
Alice 只需要将这条消息的 hash 值用自己的私钥加密得到 h,然后将其公布。
如果你能用 Alice 的公钥,将 h 解密得到正确的 hash 值,那么就能证明 Alice 极可能有 RSA 私钥。道理和之前的 RSA 通信是一样的。
密钥代表人吗?
上面的过程依赖一件事情,Alice 发布的密钥真的是 Alice 发布的。不安全的信道里,很可能有不法分子在中途篡改 Alice 的消息,导致在最初传递密钥的时候就出错了。后面一切的加密都白搭。
所以怎么办呢,没有好的办法。
一个想法是,不要用不安全的信道传输消息。比如 Alice 和 Bob 可以线下碰头,相互交换密钥,这样安全性会高很多。
但是问题来了,线下碰头成本太高了。并非只有人与人交流才有加密的需求,很多时候你访问网站,确认网站发送的消息真的是网站发送的,保持一定的保密性,同样很重要。结果很荒唐了,本来是为连接世界的互联网,结果为了保证绝对安全,只在线下可以接触的地方互联,真是互联了个寂寞。
还有想法是,创建权威的证书颁发机构,也就是 CA。大体思想是 CA 帮你验证了很多网站的证书合法性,如果你相信 CA 的话,那就相信这些网站吧。但是创建权威的 CA 本身比较中心化,而且很可能有可信度问题。
但至少在这个层面上,人们往往愿意用隐私换取便利。
量子计算机
Shor 算法可以多项式复杂度内分解质因数。所以随着量子计算机的发展,所以上面提到的 RSA、DH,以及他们的椭圆曲线版本,在几十年后都很可能失效。
好在人类还是发明了一些足以应对量子计算的加密算法,什么 Kyber 之类,但是我不会😵💫。
所以,到这里,如果暂时不管量子计算机的话,你可以发现,通过上面的加密手段,设计一个安全的代理、一个安全的通信软件、安全的存放文档,其实都不难,并且这样的技术已经相当成熟了。
这是数学,永远是对的。
加密与犯罪
加密技术既能维护用户隐私安全,又可能被恶意分子滥用。警方无法从端到端加密软件中获取情报。那么政府应该禁止这种端到端的通信软件吗?这是目前很多国家还在争议的话题。
我认为不应该。
- 这种软件实现上并不困难。加密算法一旦公开,边难以收回。政府封锁往往只会让守法公民受限,而犯罪分子猖獗。
- 保护公民隐私,防止信息泄露,对于打击电信诈骗也有积极意义。
- 很多人认为通信隐私权属于基本人权。
密码管理
但是这些东西很大程度上依赖于用户的密码,假如说加密用的密码是 123456,那上面的一切加密都白搭了。
因此我特别推荐用密码管理器,我用的是 KeePass,东西放在本地比放在云端安全一点。多用复杂随机生成的密码,然后自己只需要记忆一个强的主密码就行了。
上游
然而,有太多事情是你掌控不了的。比如你用的 Firefox 或者 Chromium,几千万行代码,可能没有漏洞吗?于是安全性其实是创建在上亿行你从来没有看过,也不可能看过的代码之上。开源软件虽然给了人们阅读甚至自己修改代码的自由,但是不等于安全。而人们倾向于相信有更专业的人已经审阅过了,便无条件相信。况且,对于 99% 以上的人来说,也只能无条件相信,毕竟想要编译 Firefox 都是要有一定水平的。

Linus’s law 说:given enough eyeballs, all bugs are shallow。但是真的有 enough eyeballs 吗?最后网络安全的大厦落在了极少数默默无闻开发者的良心上。
开源软件的开发不应该只是慈善事业。
用户应该有「不安全」的自由
这个「安全」打引号。
除了这些开源软件尚且可以看一看源代码,人们每天还依赖很多闭源商业公司产品,比如手机,户晨风最喜欢的苹果,其操作系统本来就是封闭的,许多 Android 手机的厂商定制系统也是封闭的。它们面向的客户 99% 不懂技术,它们也不希望用户懂技术。
打着安全的旗号,为你好,无非只是希望你少用竞争对手的产品,为自己更好地谋求利益罢了。
当然也不只是商业公司。
线下真实
网络安全到最后,大道至简,竟是社会工程学。技术绝对不是万能的,很多时候安全问题不止在数学和算法。
前面这么多这么牛的加密方法,真的有用吗?
应当明确一点,加密≠没有特征。所以不需要能够解密你的加密数据,只需看出你的数据是刻意加过密的,便知道你很可能心里有鬼。所以优秀的代理软件往往会倾向于模仿正常流量,以免被注意。
如果有一天,刀子就架在你的脖子上了,到底是你的数据隐私重要,还是生命重要,只有你自己知道。