这几周是「国家网络安全宣传周」。许多上了川大网络安全少年班班,网络安全是干什么呢?我不知道。我只会玩电脑🤪,给大家讲点玩电脑基本常识。


我想起在初一还是初二的时候,我们小组要讲一个网络安全主题班会。我给大家介绍了 HTTPS 和 RSA 相关内容,结果 RSA 讲到一半就给 cyb 叫停了😭️。

但是这里我想介绍什么就介绍什么。

RSA

假如 Alice 和 Bob 希望通信,但是两人之间的信道是公开的,任何人都能知道 Alice 和 Bob 交换了什么信息。那么 Alice 和 Bob 还有有办法加密通信吗?

有的兄弟有的。假设是 Bob 要给 Alice 发消息。Alice 先生成一对密钥,具体操作如下(以下内容中红色表示被公开的信息,当然整个算法也是被公开的):

  1. 选一对大素数 ppqq
    题外话,如果你也希望生成一个大素数的话,可以使用:openssl prime -generate -bits <位数>。比如 openssl prime -generate -bits 1024 就能生成一个 1024 位(二进制位)的素数。以前我写字符串哈希的时候喜欢这样干,不过后来有人告诉我固定大素数模数然后运行时随机 base 更能防 hack。
  2. n=pqn=pq
  3. 计算 r=φ(n)=φ(p)φ(q)=(p1)(q1)r = \varphi(n) = \varphi(p) \varphi(q) = (p-1)(q-1)
  4. 随便选一个在 modr\bmod r 意义下有逆元的数 ee(也即 gcd(r,e)=1,1<e<r\gcd(r,e)=1, 1 < e < r,很多时候用的是 65537=216+165537=2^{16}+1)。
  5. 计算 ee 的在 modr\bmod r 意义下的乘法逆元,记作 dd
  6. 然后将 (n,e)\textcolor{red}{(n,e)} 公开,这是公钥,(n,d)(n,d) 自己保管好,这是解密用的私钥。

Bob 现在知道了 Alice 公开的 (n,e)\textcolor{red}{(n,e)},他有一段想要偷偷发给 Alice 的信息 tt,那么他只需要将 cte(modn)\textcolor{red}{c} \equiv t^{\textcolor{red}{e}} \pmod {\textcolor{red}{n}} 发给 Alice。

最后 Alice 只需要解密消息,计算 tcd(modn)t \equiv \textcolor{red}{c}^d \pmod {\textcolor{red}{n}},便得到了 tt。其原理是 cd(te)dtedtedmodφ(p)t(modn)c^d \equiv \left(t^e\right)^d \equiv t^{ed} \equiv t^{ed \bmod \varphi(p)} \equiv t \pmod n,即欧拉定理。

那么安全性怎么保证?这个也叫做 RSA Problem:已知 eenncte(modn)c \equiv t^e \pmod n,求 tt。虽然和质因数分解不等价,但是目前比较好的解决方法也只有分解 N。所以 RSA 的安全性很大程度上依赖于质因数分解。然而质因数分解目前没有多项式复杂度算法,所以想要分解长达 2048 甚至 4096 位的 nn几乎是不可能的。

但是,RSA 运算太慢了,如今大家聊天软件中随随便便就传个几 MB 甚至 GB 级别的文档,RSA 的速度无法接受。于是一个好的方案是,随机生成一份强密码,将这个密码用 RSA 传输,具体的消息传递用更快速的对称加密,如 AES 等。

Diffie–Hellman

这是一个专门用于交换密钥的算法。

  1. Alice 和 Bob 公开选一个素数 p\textcolor{red}{p} 和其一个原根 g\textcolor{red}{g}
  2. Alice 随机选一个私钥 aa,计算公钥 Aga(modp)\textcolor{red}{A} \equiv \textcolor{red}{g}^a \pmod{\textcolor{red}{p}},并公开。
  3. Bob 也同理随机选一个私钥 bb,计算公钥 Bgb(modp)\textcolor{red}{B} \equiv \textcolor{red}{g}^b \pmod{\textcolor{red}{p}},并公开。
  4. KBaAbgab(modp)K \equiv \textcolor{red}{B}^a \equiv \textcolor{red}{A}^b \equiv \textcolor{red}{g}^{ab} \pmod{\textcolor{red}{p}},这就是双方协商出来的密钥。

然后就可以拿这个 KK 去对称加密通信了。

安全性在于想从计算 AABB 计算出 KK,需要解出 aabb,但这是离散对数问题,目前没有多项式复杂度算法。

椭圆曲线

椭圆曲线不是圆锥曲线,而是类似 y2=x3+ax+by^2 = x^3 + ax + b 的曲线。在 modp\bmod p 意义下椭圆曲在线的点可以定义加法乘法。所以自然能想到把上面这些算法搬到椭圆曲在线。

好处是椭圆曲线离散对数问题比 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 之类,但是我不会😵‍💫。

所以,到这里,如果暂时不管量子计算机的话,你可以发现,通过上面的加密手段,设计一个安全的代理、一个安全的通信软件、安全的存放文档,其实都不难,并且这样的技术已经相当成熟了。

这是数学,永远是对的。

加密与犯罪

加密技术既能维护用户隐私安全,又可能被恶意分子滥用。警方无法从端到端加密软件中获取情报。那么政府应该禁止这种端到端的通信软件吗?这是目前很多国家还在争议的话题。

我认为不应该。

  1. 这种软件实现上并不困难。加密算法一旦公开,边难以收回。政府封锁往往只会让守法公民受限,而犯罪分子猖獗。
  2. 保护公民隐私,防止信息泄露,对于打击电信诈骗也有积极意义。
  3. 很多人认为通信隐私权属于基本人权。

密码管理

但是这些东西很大程度上依赖于用户的密码,假如说加密用的密码是 123456,那上面的一切加密都白搭了。

因此我特别推荐用密码管理器,我用的是 KeePass,东西放在本地比放在云端安全一点。多用复杂随机生成的密码,然后自己只需要记忆一个强的主密码就行了。

上游

然而,有太多事情是你掌控不了的。比如你用的 Firefox 或者 Chromium,几千万行代码,可能没有漏洞吗?于是安全性其实是创建在上亿行你从来没有看过,也不可能看过的代码之上。开源软件虽然给了人们阅读甚至自己修改代码的自由,但是不等于安全。而人们倾向于相信有更专业的人已经审阅过了,便无条件相信。况且,对于 99% 以上的人来说,也只能无条件相信,毕竟想要编译 Firefox 都是要有一定水平的。

xkcd dependency

Linus’s law 说:given enough eyeballs, all bugs are shallow。但是真的有 enough eyeballs 吗?最后网络安全的大厦落在了极少数默默无闻开发者的良心上。

开源软件的开发不应该只是慈善事业。

用户应该有「不安全」的自由

这个「安全」打引号。

除了这些开源软件尚且可以看一看源代码,人们每天还依赖很多闭源商业公司产品,比如手机,户晨风最喜欢的苹果,其操作系统本来就是封闭的,许多 Android 手机的厂商定制系统也是封闭的。它们面向的客户 99% 不懂技术,它们也不希望用户懂技术。

打着安全的旗号,为你好,无非只是希望你少用竞争对手的产品,为自己更好地谋求利益罢了。

当然也不只是商业公司。

线下真实

网络安全到最后,大道至简,竟是社会工程学。技术绝对不是万能的,很多时候安全问题不止在数学和算法。

前面这么多这么牛的加密方法,真的有用吗?

应当明确一点,加密≠没有特征。所以不需要能够解密你的加密数据,只需看出你的数据是刻意加过密的,便知道你很可能心里有鬼。所以优秀的代理软件往往会倾向于模仿正常流量,以免被注意。

如果有一天,刀子就架在你的脖子上了,到底是你的数据隐私重要,还是生命重要,只有你自己知道。