环游密码世界系列之一
密码
与密码相关的技术种类繁多,而且它们之间有着紧密的关联。我们暂且抛开那些繁琐的细节,先从整体上了解一下密码世界究竟是个什么样子吧。
要讲解密码,我们需要为参与信息交互的人和计算机起几个名字。如果用A、B之类的符号未免显得无趣,因此后面我们用小发、小接等人名来指代这些信息交互的参与者。
小发:发送者
小接:接收者
小窃:窃听者,可窃听通信内容
小攻:主动攻击者,可妨碍通信、伪造消息等
小信:可信的第三方
小验:验证者
请想象一下小发向小接发送电子邮件的场景:
在这个场景中,发出邮件的小发称为发送者,而收到邮件的小接则称为接收者。用邮件这个例子会比较便于理解,但实际上发送者和接收者这两个术语的使用范围并不仅仅局限于邮件。当某个人向另一个人发送信息时,发出信息的人称为发送者,而收到信息的人称为接收者。另外,被发送的信息有时也统称为消息
邮件是通过互联网从小发的计算机发送到小接的计算机的。在发送邮件时,邮件会经过许多台计算机和通信设备进行中转,在这个过程中,就存在被恶意窃听者偷看到的可能性。
窃听者并不一定是人类,有可能是安装在通信设备上的某种窃听器,也可能是安装在邮件软件和邮件服务器上的某些程序。尽管邮件内容原本应该只有发送者和接收者两个人知道,但如果不采取相应的对策,就存在被第三方知道的风险。
加密与解密
小发不想让别人看到邮件的内容,于是她决定将邮件进行加密后再发送出去。
加密之前的消息称为明文,加密之后的消息称为密文。
明文的内容是:你好,这个周末去喝啤酒吧。而密文是:Lfu-胱yi北5KEHo。
我们看到明文可以理解其中的含义,而看到密文则无法理解其中的含义。明文被加密之后,就会变成看不懂的密文。
小接收到了来自小发的加密邮件,但是小接也是无法直接阅读密文的,需要对密文进行解密之后再阅读。
解密就是将密文恢复成明文的过程。
将消息加密后发送的话,即使消息被窃听,窃听者得到的也只是密文,而无法得知明文内容。
密码保证了消息的机密性
在上述场景中,将邮件进行了加密与解密。
这样做的目的,是为了不让窃听者读取邮件的内容。通过运用密码技术,保证了邮件的机密性
破译
消息进行加密之后,小窃只能得到密文。如果小窃很想知道明文的内容,就需要采取某种手段将密文还原为明文。
正当的接收者将密文还原为明文称为解密,但接收者以外的其他人试图将密文还原为明文,则称为密码破译,简称为破译,有时也称为密码分析。
进行破译的人称为破译者。破译者并不一定是坏人,密码学研究者为了研究密码强度(即破译密码的困难程度),也经常需要对密码进行破译,在这样的情况下,研究者也会成为破译者。
对称密码与公钥密码
密码算法
用于解决复杂问题的步骤,通常称为算法。
从明文生成密文的步骤,也就是加密的步骤,称为加密算法,而解密的步骤则称为解密算法。
加密、解密的算法合在一起统称为密码算法。
密钥
密码算法中需要密钥。现实世界中的“钥”,是形状微妙而复杂的小金属片。然而,密码算法中的密钥,则是像 203554728568477 这样的一串非常大的数字。无论是在加密时还是在解密时,都需要知道密钥,就像锁门开门都需要钥匙一样。
密码中的密钥相当于保险柜中的钥匙,可以保护你的重要数据。即使保险箱再坚固,如果钥匙被盗,则里面的贵重物品也会被盗。同样地,我们也必须注意不要让密码的密钥被他人窃取。关于密钥,我们将在后面详细讲解。
对称密码与公钥密码
根据密钥的使用方法,可以将密码分为对称密码和公钥密码两种。
对称密码是指在加密和解密时使用同一密钥的方式。
而公钥密码则是指在加密和解密时使用不同密钥的方式。因此,公钥密码又称为非对称密码
混合密码系统
将对称密码和公钥密码结合起来的密码方式称为混合密码系统,这种系统结合了对称密码和公钥密码两者的优势。
关于混合密码系统,我们将在后面详细讲解。
其他密码技术
密码技术所提供的并不仅仅是基于密码的机密性,用于检验消息是否被篡改的完整性、以及用于确认对方是否是本人的认证等都是密码技术的重要部分。
单向散列函数
我们想象一下通过互联网下载免费软件的场景。我们所下载的软件,是否和软件的作者所制作的东西一模一样呢?会不会有坏人在软件里植入了一些恶意程序呢?
为了防止软件被篡改,有安全意识的软件发布者会在发布软件的同时发布该软件的散列值。散列值就是用单向散列函数计算出来的数值。
下载该软件的人可以自行计算所下载文件的散列值,然后与软件发布者公布的散列值进行对比。如果两个散列值一致,就说明下载的文件与发布者所发布的文件是相同的。
单向散列函数所保证的并不是机密性,而是完整性。完整性指的是“数据是正牌的而不是伪造的”这一性质。使用单向散列函数,就可以检测出数据是否被篡改过。单向散列函数是一种保证完整性的密码技术。关于单向散列函数,我们将在后面详细讲解。
消息认证码
为了确认消息是否来自所期望的通信对象,可以使用消息认证码技术。
通过使用消息认证码,不但能够确认消息是否被篡改,而且能够确认消息是否来自所期待的通信对象。也就是说,消息认证码不仅能够保证完整性,还能够提供认证机制。
消息认证码是一种能够保证完整性和提供认证的密码技术。关于消息认证码,我们将在后面详细讲解
数字签名
小接刚刚收到了一封来自小发的邮件,内容是“以100万元的价格购买该商品”。
不过,这封邮件到底是不是小发本人写的呢?小接仅通过阅读邮件内容,是否能够判断该邮件确实来自小发呢?邮件的发送者(From:一栏的内容)很容易被伪造,因此确实存在别人伪装成小发的风险。
假设小发真的发出过邮件,但是小发当初写的内容真的是“以100万元的价格购买该商品”吗?是否存在这样一种风险,即小发原本写的是“1万元”,而在邮件传输的过程中被某些别有用心的人进行了篡改,将1万元改成了100万元呢?
反过来说,还有这样一种风险,即小发真的向小接发送了内容为“以100万元的价格购买该商品”的邮件,但后来小发又不想买了,于是便谎称“我当初根本没发过那封邮件”。
像这样事后推翻自己先前主张的行为,称为否认。
能够防止上述伪装、篡改和否认等威胁的技术,就是数字签名。数字签名就是一种将现实世界中的签名和盖章移植到数字世界中的技术,它也是一种重要的密码技术。
用刚才的例子来说,小发可以对“以100万元的价格购买该商品”的内容加上数字签名后再通过邮件发送,而小接则可以对该数字签名进行验证。通过这样的方式,不但可以检测出伪装和篡改,还能够防止事后否认。
数字签名是一种能够确保完整性、提供认证并防止否认的密码技术。关于数字签名,我们将在后面详细讲解
伪随机数生成器
伪随机数生成器是一种能够模拟产生随机数的算法。
随机数和密码技术有关,这样说大家可能会感到意外,但实际上随机数确实承担着密钥生成的重要职责。关于伪随机数生成器以及随机数的话题,我们将在后面详细讲解。
密码学家的工具箱
在以上内容中,已经出现了很多种类的密码技术,其中以下六种发挥着尤其重要的作用:
- 对称密码
- 公钥密码
- 单向散列函数
- 消息认证码
- 数字签名
- 伪随机数生成器
在此处,我们将上述六种技术统称为密码学家的工具箱。
隐写术与数字水印
上面我们已经讲过,密码是一种能够让消息内容变得无法解读的技术。
除此之外,其实还有另外一种技术,它不是让消息内容变得无法解读,而是能够隐藏消息本身,这种技术称为隐写术。
我们来看一个简单的例子:
千山鸟飞绝,
万径人踪灭。
孤舟蓑笠翁,
独钓寒江雪。
上面这段话其实就是隐写术的一个例子,我们将每一行的第一个字拿出来看一看。
这样我们就会发现,原来上面这段话中还隐藏着另一句话一“千万孤独”,这很像我们的藏头诗。
隐写术的目的是隐藏消息本身,但如果搞清楚了嵌入消息的方法,也就可以搞清楚消息的内容。因此,隐写术并不能代替密码。
隐写术在计算机中也有一定的应用,例如最近的数字水印技术就运用了隐写术的方法。数字水印是一种将著作权拥有者及购买者的信息嵌入文件中的技术。
但是仅凭数字水印技术是无法对信息进行保密的,因此需要和其他技术配合使用。例如,将密码和隐写术相结合的方法就很常用。首先,我们将要嵌入的文章进行加密并生成密文,然后再通过隐写术将密文隐藏到图片中。这样一来,即便有人发现了密文的存在,也无法读取出所嵌入的文章的内容。
密码与信息安全常识
在继续下面的内容之前,我们先来介绍一些关于密码的常识。刚刚开始学习密码的人常常会对以下这几条感到不可思议,因为它们有悖于我们的一般性常识。
- 不要使用保密的密码算法
- 使用低强度的密码比不进行任何加密更危险
- 任何密码总有一天都会被破解
- 密码只是信息安全的一部分
不要使用保密的密码算法
很多企业都有下面这样的想法:“由公司自己开发一种密码算法,并将这种算法保密,这样就能保证安全。”
然而,这样的想法却是大错特错,使用保密的密码算法是无法获得高安全性的。我们不应该制作或使用任何保密的密码算法,而是应该使用那些已经公开的、被公认为强度较高的密码算法。
这样做的原因主要有以下两点。
-
密码算法的秘密早晚会公诸于世。从历史上看,密码算法的秘密最终无一例外地都会被暴露出来。
-
开发高强度的密码算法是非常困难的。要比较密码算法的强弱是极其困难的,因为密码算法的强度并不像数学那样可以进行严密的证明。密码算法的强度只能通过事实来证明,如果专业密码破译者经过数年的尝试仍然没有破解某个密码算法,则说明这种算法的强度较高。 稍微聪明一点的程序员很容易就能够编写出“自己的密码系统”。这样的密码在外行看来貌似牢不可破,但在专业密码破译者的眼里,要破解这样的密码几乎是手到擒来,现在世界上公开的被认为强度较高的密码算法,几乎都是经过密码破译者长期尝试破解未果而存活下来的。因此,如果认为“公司自己开发的密码系统比那些公开的密码系统更强”,那只能说是过于高估自己公司的能力了。
试图通过对密码算法本身进行保密来确保安全性的行为,一般称为隐蔽式安全性,这种行为是危险且愚蠢的。
反过来说,将密码算法的详细信息以及程序源代码全部交给专业密码破译者,并且为其提供大量的明文和密文样本,如果在这样的情况下破译一段新的密文依然需要花上相当长的时间,就说明这是高强度的密码。
使用低强度的密码比不进行任何加密更危险
一般人们会认为:就算密码的强度再低,也比完全不加密要强吧?其实这样的想法是非常危险的。
正确的想法应该是:与其使用低强度的密码,还不如从一开始就不使用任何密码。
这主要是由于用户容易通过“密码”这个词获得一种“错误的安全感”。对于用户来说,安全感与密码的强度无关,而只是由“信息已经被加密了”这一事实产生的,而这通常会导致用户在处理一些机密信息的时候麻痹大意。
任何密码总有一天都会被破解
如果某种密码产品宣称“本产品使用了绝对不会被破解的密码算法”,那么你就要对这个产品的安全性打个问号了,这是因为绝对不会被破解的密码是不存在的。
无论使用任何密码算法所生成的密文,只要将所有可能的密钥全部尝试一遍,就总有一天可以破译出来。因此,破译密文所需要花费的时间,与要保密的明文的价值之间的权衡就显得非常重要。
严格来说,绝对不会被破解的密码算法其实是存在的,这种算法称为一次性密码本,但它并不是一种现实可用的算法。关于这个话题,我们会在后面详细探讨。
此外,还有另外一种技术被认为有可能造就完美的密码技术,那就是量子密码。关于量子密码,我们会在后面进行介绍。
密码只是信息安全的一部分
我们还是回到发送邮件的例子。即便不去破解密码算法,也依然有很多方法能够知道邮件内容。例如,攻击者可以不去试图破译经过加密的邮件,而是转而攻击小发的电脑以获取加密之前的邮件明文。
上面提到的攻击手段,都与密码的强度毫无关系。
要保证良好的安全性,就需要理解“系统”这一概念本身的性质。复杂的系统就像一根由无数个环节相连组成的链条,如果用力拉,链条就会从其中最脆弱的环节处断开。因此,系统的强度取决于其中最脆弱的环节的强度。
而最脆弱的环节并不是密码,而是人类自己。