1.5 密码算法分类和抽象化
我们将密码算法分为两大类。
● 对称密码(密钥密码)——算法只有一个密钥。如果多个参与者都知道该密钥,该密钥也称为共享密钥。
● 非对称密码(公钥密码)——参与者对密钥的可见性是非对称的。例如,一些参与者仅知道公钥,而另一些参与者同时知道公钥和私钥。
虽然对称密码和非对称密码并不是密码学中仅有的两类原语,但是由于我们很难对密码学的其他的子类进行划分,所以本书的大部分篇幅都是关于对称和非对称密码原语的。当今广泛应用的密码算法都包含在这两类原语中。另一种划分密码学原语的方式如下。
● 基于数学理论构造——这种密码算法的构造都建立在诸如因子分解之类的数学困难问题上。基于RSA算法的数字签名和非对称加密就属于这种构造。
● 基于启发式构造——这种算法的构造依赖于密码分析者的观察和统计分析。AES算法就是这种构造的典型案例。
这种分类方式还考虑到算法效率因素,基于数学理论构造通常比基于启发式构造的密码算法要慢得多。我们可以得出这样的结论:对称密码大多数都是基于启发式构造的,而非对称密码主要是基于数学理论构造的。
我们很难严格地对密码学涉及的所有算法进行准确分类。事实上,每本书或每门课程对密码学定义和分类都有所不同。其实,这些定义和分类对我们来说并不重要,因为我们只会将这些密码学原语看作独特且具有各自的安全声明的工具。反过来,我们可以把这些工具当作构造安全协议的基础原语。对于实现协议安全,了解这些工具的工作原理以及提供的安全声明才是重中之重。出于这种考虑,本书的第一部分主要介绍常用的密码原语及其安全属性。
本书中的许多概念在初次使用时可能比较难懂。但与学习和理解其他知识一样,对这些概念了解得越多,在具体语境中见到的次数越多,我们就越能把它们抽象出来,理解起来也就愈加自然。本书的作用就是帮助读者建立起密码算法构造的抽象思维模型,理解把各类密码算法组合在一起形成安全协议的方法。本书会反复提到各类密码原语构造的接口,给出它们在现实世界的实际使用示例。
密码学以前的定义很简单,其原理类似于Alice和Bob想要交换秘密信息。当然,现在密码学的定义已经有了变化。当今,密码学围绕着新的发现、突破和实际需求演变成一门非常复杂的学科。归根结底,密码学的真正目的在于增强协议安全性,使协议在敌手存在的情况下仍能安全运行。
为了准确地理解密码学使协议变得安全的原理,厘清协议所要达到的一系列安全目标至关重要。本书涉及的密码原语至少满足下面性质中的一条。
● 机密性——掩藏和保护一些不想让别人看到的消息。例如,加密就可以掩盖传输中的消息。
● 认证性——确定通信另一方的身份。例如,认证技术可以让我们确信接收到的消息确实是由Alice发送来的。
当然,这里只是对密码学所能提供的算法功能进行了简化。在大多数情况下,每个密码原语的安全定义中都包含对算法功能的详细说明。密码原语的使用方式不同,协议产生的安全属性也会不同。
在本书中,我们将会学习一些新的密码原语,同时还会学习将它们组合起来实现满足机密性或认证性等安全属性的方法。请认识到这样一个事实:密码学是一门在敌手存在的环境下为协议提供安全保护的技术。虽然本书对“敌手”还没给出明确的定义,但是我们可以把企图破坏协议的参与者、观察者、中间人都当作敌手。这些角色反映了现实生活中敌手可能的身份。毕竟,密码学是一个实用的领域,它最终对抗的坏人是有血有肉的。