阅读 244

从加密解密演进看 HTTPS 通信(上)——简述加密解密演进

描述

我们都知道加密的目的是为了保障信息传输过程中的安全性。

对于现在人来说,可能会听说过两个名词,一个是对称加密,一个是非对称加密,那你好奇它们的含义以及它们是怎么演变成现在的样子的吗?

接下来就让我来给大家说道说道,提到加密解密其实涉及到一个名词就是密码学,其实听到这个词不用慌,维基百科上提到密码学被一个学者解释为:“密码学是关于如何在敌人存在的环境中通信”,其实说白了就是如果有不怀好意的人想要查看我和他人的通信信息时,那我应该如何确保信息传输的安全无误呢?这样就是密码学要解决的问题。

当我们了解了密码学的历史后,你就会自然会明白什么是对称加密、非对称加密,以及它们都是怎么就解决问题的。

密码学可以以计算机为分水岭,分为古典密码学和现代密码学,至于为什么这么分,且听我娓娓道来,接下来我们先讲古典密码学中加密解密如何进行博弈的。

古典密码学

古典密码学,这时的最小的加密操作单位还是字母。 大致是四个演进时代:

隐藏法

其实就是把信息通过某种方式藏起来,从而达到一种信息安全的效果。藏起来确实是最容易想到的,但是它的隐患其实是当那些隐藏的方式被大家都知道的时候,其实可以在城关检查时加大检查力度,来削弱隐藏法。

提到隐藏法有一个很有趣的故事,希罗多德的记录中说那会先把送信人的头发剃光,然后在它的头皮上写上要传递的信息,待送信人头发长出来之后,就可以让他去送信了,到了对方那里再把送信人头发剃光,这时就能看到要传递的信息了。

移位法和替代法

当隐藏法不那么管用之后,其实就需要去考虑有没有其他方式可以对信息进行加密呢?

  • 移位法,看下面的例子更容易理解:
1234 -> 2345(每个往后移动一位)
I love you -> k nqxg aqw(每个往后移动两位)
复制代码
  • 替代法,其实就把一部分信息替换成另一部分,这时就需要一个替代表来记录:
I love you -> a bcde fcg(假装 I -> a、l -> b,o -> c,然后以此类推);
复制代码

但我觉得移位法其实是一种特殊的替代法,只是替代规则是每次都是去找这个元素后面移动位数对应的那个元素进行替代即可。

关于替代法有一个很有名故事就是十六世纪苏格兰女王的故事,但其中不仅仅只用到了替代法还用到了隐藏法,其实这些手法并不是同时只能存在其一的,而是可以多种方式结合使用,如果感兴趣,可以下面这个连接了解:

苏格兰的玛丽女王

那替代法应该如何破解呢?破解的方法频率分析,利用的是一篇文章中不同英文字母出现的频率不同,本质是大幅降低字母排列组合的可能性。下图是维基百科中英文字母出现频率的统计图:

有了频率分析其实你就可以知道密文中出现最多的字母可能就是 e 了,然后这是第一步,这时还不能完全确定,也许还需要再根据拼写规则筛选一下。

维吉尼亚密码

前面我们讲到了替代法,但替代的规则还很原始,就是进行原文密文一对一的替换,所以也很容易被频率分析破解,那我怎样才能让频率分析不起作用呢?对了对抗频率分析,其实我们可以将替代的关系由原来的一对一改为一对多,这时同一个字母可以由多个字母进行表示,就很难分析了。

既然原来只是使用一套字母表进行替换,那维吉尼亚密码干脆直接使用 26 套字母表进行替代,具体如图示:

直接看这个可能会比较懵逼,我来讲讲它具体是如何加密的,比如原文是 hello,现在的替换的规则是需要我自己指定的,比如 h 用第 3 套(找到序号为 3 的那一行,然后在查看序号为 0 的 H 对应的那一列,接下来找到交点,就确定了讲 h 替换为 k),e 用第 8 套,两个 l 分别用第 20 套和第 11 套,o 用第 14 套,这样下来,hello 就变成了 KMFXC。但是真实情况,不会像上面这么乱指定,而是会约定一个替换规则,这个规则也被称为钥匙,看下面的图可能会更好理解,然后根据钥匙去找对应的替换字母,只要根据钥匙不断重复进行替换即可。

不过这个发明后并没有被大规模使用,因为它太麻烦了,一个短语还好,你自己加密篇文章试试?人手动加密也容易出错,所以直到美国内战才是陆续开始有规模的使用维吉尼亚加密法,至于原因嘛,其实是因为机械的出现。

那它该如何破解呢?其实就是从找出重复多次的单词,可能会有多个重复多次的单词,然后每个重复多次的单词中间都会有几个间隔长度,找出这里面的交集,这个交集其实就很有可能是钥匙的长度。算出钥匙的长度有什么呢?其实就是把多套字母表加密的规则降级为单套字母表加密,然后对这个单套字母表加密提取出来的字母进行频率分析。下面这张图其实就是一个简单的例子,出现过两次 BUK,估算钥匙长度为 4,然后从第一个字母开始每个 4 个字母提取出来形成一组字母集,这套字母集就可以用频率分析去做处理试着破解了,其实可以整理出来 4 套字母集,然后去找交集,这样会更准确一些:

恩尼格玛机

这是二战期间德国一直信赖的加密方式,它的原理也是替代,只是比起维吉尼亚加密法,它更难以破解,而如果想要对它进行破解其实也是只能暴力破解,先看看它长什么样子吧:

这张图的恩尼格玛机其实还只是简单版本,德国海军的恩尼格玛机比这个更复杂(三个转子提升到八个转子,并且还有接线器,用来调换字母,比如所有输入的 a 都会替换成 b 然后再进行加密),我觉得它很像计算机,因为它也是三部分,输入 -> 处理(加密) -> 输出(对应字母的灯泡会亮),中间的齿轮结构被称为转子,它可以保证每次输入进来字母被加密替代的字母都是不一样的,那么是如何保障的呢?当我一个字母进来之后,会根据第一个转子的字母进行替换,然后第一个转子转一格,第一个转子的结果会被当作第二个转子的输入进行再次加密,接着第二转子的结果会被当作第第三个转子的输入再进行加密,并且这个过程不断进行。当第一个转子转一圈后会带动第二个转子转一格,第二个转子转一圈会带动第三个转子转一格,只要是双方设置好相同起始的三个转子的位置,双方就可以进行加密了。而它的钥匙的概率是 26 * 26 * 26(三个转子的情况下),所以就算破解钥匙也只能进行暴力破解。

虽然这种加密方式很强大,但这时候其实电报已经很普及了,你发出去的信息很容易被截获(只要频率相同),也需要稍微考虑我的钥匙该如何传输才更安全,当然这时讨论这个还稍微有点早,这时还可以线下发放钥匙簿(也就是每天按照什么钥匙进行加密通信的统一规则书),但其实德国很谨慎,基本上会每个消息都用一个新钥匙,防止同一天所有消息都是用同一把钥匙从而进一步降低被破解的可能性。

德国人是如何协商密钥的呢?刚才提到了钥匙簿,他们当天会有大钥匙,比如是 WER,然后操作员随便想一个单词比如 XYZ(这就是这次的钥匙,被称为小钥匙),然后先加密一次 XYZ -> ASF,然后再加密一次 XYZ -> RWF,然后这两个拼在一起就成了 ASFRWF,其实真正的信息是从第七字母开始的,前六个字母就是这条消息的小钥匙,也是大钥匙用来加密本次传输的小钥匙,而小钥匙用来传递本次传输的内容。只要对方按照大钥匙先调整好恩尼格玛机然后把前六个还原为 XYZXYZ 即可,这样对方就知道了后面加密的内容都是用 XYZ 进行加密的,如果不是重复出现 XYZ 就说明通信有问题,不用理会即可。

讲到这里,你也知道了它的破解难度,但大部分人也都听说过图灵的故事,就是他最终完成了恩尼格玛机的破解,当然这其中并不是只有他一批人,而是前前后后五六批人为破解恩尼格玛机做出了贡献,至于图灵是怎么破解的,我三言两语也并不好解释清楚,只需要直到他通过找到德军加密的一些规律,降低了钥匙了可能性,然后就会交给叫做他们发明的一个叫“炸弹”的机器进行暴力破解,毕竟机器还是需要机器去对抗的。

补充:

  • 钥匙为什么重要?
    • 因为如果想要使用多套密码给原文加密,你需要知道其中的对应关系;
  • 频率分析万能吗?
    • No,信息量不够的话,谁给你分析去;
    • 每次钥匙不一样也很难,因为可能还会因为信息不够,下一篇的密文用的钥匙就不同了;
    • 所以如果可以做到每次都是一个新的(最好是随机的)钥匙,那其实安全性还是很高的;
  • 密码学的应用其实就是一种想方设法给哦别人读取信息制造更多麻烦,与此同时又不给自己读取信息增加太多麻烦。所以实际考量后的加密目标,并不是追求绝对的安全、无法破解,而是在尽可能增加安全性的基础上,保证使用上的效率,找到平衡点;

现代密码学

现代密码学,这时的最小的加密操作单位已经是 0 1 0 1 这样的二进制了。二进制的好处是,它打乱的是语言规律的底层结构,使得改变发生在文本内部。直到现在大致分为三个演进时代。

在了解了古典密码学概念后其实后面的现代加密并不难理解,让我们来看看吧。

魔王加密系统

魔王加密系统,因为计算机的出现,让加密解密的最小单位从字母变成了数字,数字的变化打乱了信息的底层结构。

它的确实能保证信息主体的安全,但是呢,你要是钥匙怎么传递却是一个很大的问题,不过后面还是有人发明了安全的钥匙传递方法,也就是“迪菲-黑尔曼钥匙交换方案”,这里的具体的数学原理我就不展开讲了,不过靠的是不可逆的单向函数,也就是模运算。感兴趣的人可以看看下面的文章:

迪菲-赫尔曼密钥交换不要用比喻去理解所有的科学(day48)

不过它并没没有解决中间人攻击问题(就是我假装是你的身份和对方通信),而且还需要两者同时在线一起协商出密钥才行,所以并不是很完美,也真是由于这些原因才会迭代出更好的加密方式。

RSA 加密

RSA 加密,它解决了钥匙传递中的漏洞,虽然它并不是无法破解的,但因为计算量太大,只要提升钥匙长度在理论上破解时间无限长。

RSA 也是就是我们常常听到的非对称加密,为什么叫非对称加密,其实是因为它有两把钥匙,一把可以公开的钥匙和一把自己私有的钥匙(也就是公钥和私钥),并且它使用到的加解密算法是同一个,而这之前的那些加密方式其实都是对称加密,它们加密和解密都是同一把钥匙,而加密和解密用的是不同算法(基本上是逆向进行)。

而且 RSA 还有一个特性,就是公钥和私钥可以互相加解密。由于是两把钥匙,我只需要将公钥公开给别人,就可以让别人用我的公钥给我发加密信息了。基于这个特性,那么如果爱丽丝想要给鲍勃发消息,只需要拿到鲍勃的公钥进行数据加密即可,这样发过去的消息,只有持有持有私钥的鲍勃本身才能解开这条信息。

虽然这样发过去的消息确实没问题了,只是鲍勃没办法验证消息真的是来自爱丽丝的,如果是中间的伊芙想要捣乱,他可以假装自己是爱丽丝给鲍勃发消息,因为只要我拿到鲍勃的公钥即可,而公钥有时可以在晚上传输的,所以是可以被拦截的。

如果想要解决这个问题就要利用到另一个特性,如果在生活中我想要验证一条消息来自某个人那我只需要让对方把消息写下来并在末尾签上自己的名字即可,因为实际在纸上的签名并没有那么容易进行伪造。这时候我们也需要通过签名这种思路来完成身份验证,那非对称加密中该如何完成这个签名呢?其实只需要利用别人都没有而我只有我有的信息即可,也就是自己持有的私钥,因此用私钥加密的过程也被称为签名,而公钥解密的过程也被称为验签。讲到这里你应该直到该怎么做了,也就是爱丽丝再给鲍勃发消息时只需要先拿鲍勃公钥对信息加密,再对这个密文进行私钥签名即可,而鲍勃收到消息,也会先用爱丽丝的公钥验签,然后在用鲍勃的私钥解密即可完成通信。

但是你以为到这里两边的通信就真的完全安全了吗?并不是,因为在公钥传输的过程中,还是存在中间人伊芙,他可以对网上传输的信息进行拦截和修改,这时候如果他将传输过去的原本鲍勃的公钥换成了自己的,那其实爱丽丝也是并不能发现的,那该怎么呢?这时就需要一个第三方权威机构来给鲍勃的公钥进行信用背书,然后爱丽丝拿到这个背书后进行一系列验证即可,如果验证都没问题,就说明真的可以相信传递过来的公钥就是鲍勃的了,只是这个过程其实也很复杂,而且这里说的信用背书其实就是颁发证书的过程,而验证的过程就是证书验证的过程,具体的验证细节会放到下一讲。

量子加密

说实话,这玩意我也不懂,我能跳过它吗?

只是听说,如果这个东西真的出来大规模使用了,那 RSA 这种难以破解的加密方式也会容易被破解。

并且由于量子物理本身的特性,在钥匙传输和通信方面量子加密都是非常安全的。

这我不懂我就不多说了。

总结

到这里为止加密解密的基本演进我们也就讲完了,其实这个演进过程是十分有趣的,你能看到人类智力大比拼,并且加密方和解密方不断你方唱罢我登场,但是现在看来,加密方还是占据了上方,毕竟 RSA 并不那么容易破解。

如果不看量子加密,其实我从古典密码学到现代密码学的演进中看到了有一些趋势,比如:

  • 加密单位越来越小;
  • 数学起到的作用越来做越大(只是我提到比较少);
  • 公开透明的部分越来越多;
  • 信息越来越容易被截获;

感谢非对称加密的暂时领先,让我们能安心的进行数据传输。

感谢

以上内容参考了密码学的维基百科、得到的《卓克·密码学 30 讲》、扔物线的 HenCoder Plus 以及《码书》。