1.3 Kerckhoff原则:只有密钥保密
设计一个密码算法(就像我们前面提到的对称加密原语)是一件简单的事情,但是设计一个安全的密码算法并非易事。虽然本书很少涉及构造这样的密码原语,但是本书会教大家判别一个密码算法优劣的方法。这做起来可能有点困难,因为对于一个给定的任务,我们可能有许多密码算法可以选择。不过,我们可以从密码学历史和密码学社区吸取他人的经验教训,并从中得到一些启示。通过回顾历史,我们可以了解到如何将一个密码算法变成安全可信的算法。
数百年后,依靠信件传递消息的Alice和Bob已经成为历史,纸质信件不再是我们的主要交流方式,取而代之的是更好、更实用的通信技术。如今,我们可以使用功能强大的计算机和互联网。当然,这意味着我们以前面临的恶意信使也变得更加强大。恶意信使无处不在:它可以是咖啡店里的Wi-Fi发射器,也可以是组成互联网并转发信息的服务器,还可以是运行我们算法的计算机。我们的敌手(恶意信使)现在也有能力观察到更多的信息,例如向网站发出的每一个请求都可能通过错误的线路传递,并在几纳秒内被更改或复制,而这一切可能不会有人察觉到。
回顾历史,我们可以清晰地看到密码算法存在漏洞、被一些组织或独立研究人员破解、不能真正地保护消息和未实现设计者所声称功能的例子比比皆是。通过从这些错误中总结经验教训,慢慢地我们知道了设计良好密码算法的方法。
注意:
攻破一个密码算法的方法有很多种。对于加密算法,我们可以通过以下方法来攻击这个算法:将密钥泄露给攻击者、在没有密钥的情况下解密消息、仅仅通过观察加密的消息就可以知道消息本身等。任何对算法假设的削弱也可以认为算法被攻破。
密码学的发展经历了漫长的试错过程,而一个更成熟的观点也在这个过程中产生:为了对密码学原语的安全性获得足够的信心,每个密码原语必须由密码专家对其进行公开分析。若做不到这一点,密码原语的可靠性只能依赖于含糊不清的安全性说明,而历史证明了其效果不尽如人意。这就是密码学家(Cryptographer,密码原语设计者)长期以来需要密码分析者(Cryptanalyst,又称“密码原语分析者”)帮助他们分析所构造密码原语安全性的原因(见图 1.5)。因此,密码学家也常常是密码分析者,反之亦然。
图1.5 密码分析者的主要工作就是帮助密码学家分析所构造密码学原语的安全性
我们以高级加密标准(Advanced Encryption Standard,AES)加密算法为例。AES算法是一个由美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)组织的国际竞赛的产物。
注意:
NIST是一个美国的标准和指南制定机构,其提出的标准主要供美国政府相关职能部门、其他公共和私人组织使用。NIST对许多像AES算法这样应用广泛的密码原语进行了标准化。
AES加密算法竞赛持续了数年之久,其间有许多来自世界各地的密码分析者参与尝试攻击各种各样的候选算法。历经数年的公开分析,人们对候选算法产生了足够的信心,最终将一个最具竞争力的算法提名为AES算法。如今,人们普遍认为AES算法是一个可靠、应用广泛的加密算法。例如,我们每天浏览网页就会用这个算法加密。
以公开方式构造密码算法标准的思路与Kerckhoff原则有关,该原则可以理解为:依靠保密算法来实现安全是不明智的,因为敌手很容易知道我们所使用的密码算法。因此,我们会选择公开密码算法。
如果Alice和Bob的敌手知道他们加密信息的算法,那么他们的加密算法还怎么保证安全呢?答案是密钥。协议的安全依赖密钥,而与算法本身是否保密无关。无论是我们将要学习的密码算法,还是在现实世界中使用的密码算法,我们通常都可以自由地进行研究和使用,这是本书涉及的密码算法的共性。只有作为这些算法输入的密钥才需要保密。就像吉恩·罗伯特·杜卡莱特(Jean Robert du Carlet)所说:“即使对大师来说,艺术也是一个秘密。”在1.4节中,我们将讨论一种完全不同的密码原语。现在,让我们用图1.6来汇总目前已学到的内容。
图1.6 AES是一个对称加密算法实例,对称加密算法是对称密码体系中的一类算法