26、密码学入门

密码学入门

1. 引言

在当今社会,数字信息以及承载这些信息的系统和网络正遭受着各种形式的滥用。金融交易可能被窃听或篡改,个人和组织的敏感信息可能被窃取,电子服务可能被免费使用,计算机系统和网络也可能被入侵或破坏。实施这些攻击的工具多种多样,从简单的漏洞、密码嗅探器和密码破解器,到恶意软件(如病毒和恶意小程序),甚至是完整的黑客工具包。

传统上,计算机网络通常存在于一个组织内部,人们主要防范来自系统外部的攻击。然而,随着我们向开放的全球网络迈进,以及电子商务时代的到来,出现了更为复杂的威胁模型。我们甚至无法信任与之打交道的各方,系统必须设计成能够抵御内部欺诈。例如,在电子交易系统中,卖家可能会在交易结果不佳时否认发送过订单,而交易者可能会在交易有利可图时否认收到过订单,以谋取钱财。

由于潜在攻击者可以来自全球各地,信息滥用的风险大幅增加。而且,如果有人侵入电子信息系统,其滥用的规模和影响可能比基于纸质的系统大得多。

这些风险使得保护电子信息系统需要采取适当的安全措施。显然,在电子世界中,仅依靠物理安全或人员安全是不够的。密码技术是每个安全信息系统的重要组成部分,其他重要的构建模块还包括安全的操作系统、审计工具和管理指南等。构建安全的计算机系统和网络需要一种保守的方法,这可能与当前行业的快速发展并不总是兼容,而且在设计的第一步就必须考虑到安全性。

本文将讨论密码算法设计的基本原理,区分保密性保护(防止被动窃听者)和认证(防止试图修改信息的主动窃听者)。然后回顾选择、设计和评估密码算法时出现的不同问题,最后给出一些结论性的意见。

2. 保密保护的加密技术

使用密码学保护信息的保密性与书写本身一样古老。其基本思想是对要保护的信息应用一种“复杂”的变换。当发送者(在密码学中通常称为Alice)想向接收者(Bob)发送消息时,她会对明文P应用数学变换E(),这个变换E()称为加密算法,变换的结果称为密文,即C = E(P)。Bob通过应用逆变换D = E⁻¹来解密C,从而恢复出明文P,即P = D(C)。对于安全的算法E,密文C对外部人员来说毫无意义。例如,窃听连接的Eve可以获取C,但无法获取相应明文P的(部分)信息。

然而,这种方法只有在Bob能够保密变换D时才有效。虽然这在个人之间的交流中可以接受,但对于大规模使用来说并不可行。Bob需要D的软件或硬件实现,他要么自己编写程序,要么信任他人为他编写。此外,他需要为每个通信对象使用不同的变换(和程序),这并不实际。而且,Bob和Alice始终面临着Eve以某种方式获取D(或E)的风险,例如通过贿赂软件作者或系统管理员,或者侵入他们的计算机系统。

通过在加密算法E()中引入一个秘密参数——密钥K,可以解决这个问题。通常,这样的密钥是一个40到几千位的二进制字符串。解密算法D使用相应的密钥K’。因此有C = Eₖ(P)和P = Dₖ’(C)。变换必须强烈地(并且以非常复杂的方式)依赖于密钥:如果使用错误的密钥K’₀ ≠ K’,将无法获得明文P,而是得到一个“随机”的明文P₀。现在可以公开加密算法E()和解密算法D(),系统的安全性仅依赖于两个短密钥的保密性。这意味着E()和D()可以公开评估并进行商业分发,就像机械锁一样,每个人都知道锁的工作原理,但要打开特定的锁,需要知道钥匙或秘密组合。在密码学中,假设算法对对手是已知的,这被称为“柯克霍夫斯原则”。

一个简单的加密算法示例是“凯撒密码”,它由罗马皇帝使用。明文逐字母加密,密文通过将字母在字母表中移动固定位置得到,秘密密钥表示移动的位置数。据说凯撒总是使用3作为移动值,例如“an example”会被加密为“dq hadpsoh”。另一个例子是斯坦利·库布里克的《2001太空漫游》中计算机“hal”的名字,它是通过将“ibm”的字母替换为字母表中的前一个字母得到的,相当于移动25个位置。显然,这样的系统是完全不安全的。

另一个尚未解决的问题是Alice和Bob如何交换秘密密钥。简单的答案是密码学并不能解决这个问题,它只是让问题变得更容易。在这种情况下,(大量)明文的保密性已被降低到两个短密钥的保密性,这些密钥可以预先交换。密钥交换问题在密码学的一个领域——“密钥管理”中进行了更详细的研究,本文不再进一步讨论。

下面是传统或对称加密的模型图:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    P(明文P):::process --> E(加密算法E):::process
    E -->|密文C| D(解密算法D):::process
    D --> P(明文P):::process
    K(密钥K):::process --> E
    K --> D
    subgraph 安全通道
    end

研究信息加密的科学分支称为密码学,而试图“破解”加密算法(在不知道密钥的情况下恢复明文,或从密文和部分明文推导出密钥)的分支称为密码分析,“密码学”这个术语涵盖了这两个方面。

到目前为止,我们假设解密密钥K’等于加密密钥K,或者很容易从K推导出K’,这种类型的算法称为传统或对称密码。在公钥或非对称密码中,K’和K总是不同的,而且从K计算K’应该很困难。这一特性的优点是可以将K公开,这对密钥管理问题有重要影响。接下来将分别讨论传统算法和公钥算法。

2.1 传统加密

传统加密主要有两种常见的算法:加法流密码和分组密码。

加法流密码

加法流密码的加密过程是将密钥流与明文进行模2加法(异或)。明文和密文被分成m位的字(m通常为1、8或8的倍数),明文、密文和密钥流的第i个字分别用pᵢ、cᵢ和kᵢ表示。加密操作可以写成cᵢ = pᵢ ⊕ kᵢ,其中⊕表示模2加法。解密操作与加密相同,因为pᵢ = cᵢ ⊕ kᵢ = (pᵢ ⊕ kᵢ) ⊕ kᵢ = pᵢ ⊕ (kᵢ ⊕ kᵢ) = pᵢ ⊕ 0 = pᵢ。

显然,m位的密钥流字kᵢ不能是常量,否则密码分析者可以从单个密文字和相应的明文字计算出密钥流字,而且明文中的重复也会在密文中显现。对于强密码,kᵢ序列必须由看起来随机的字符串组成。

在实践中,通常使用有限状态机来计算kᵢ。这种机器将短的秘密密钥K扩展成更长的密钥流序列kᵢ,这称为伪随机字符串生成器。序列kᵢ最终是周期性的,有限状态机的一个重要(但不充分)设计标准是周期必须足够长(典型的下限是2⁶⁴)。kᵢ的值也应该均匀分布,并且连续字(的部分)之间不应存在相关性(注意,存在利用小于百万分之一相关性的密码分析攻击)。

形式上,序列kᵢ可以用一个安全参数进行参数化,要求该序列满足每个多项式时间的随机性统计测试(这里的多项式是指关于安全参数的多项式)。另一个理想的特性是,没有多项式时间的机器能够以显著高于1/2的概率预测序列的下一位(基于先前的输出)。姚期智在理论密码学中的一个重要(也许令人惊讶)的结果表明,这两个条件实际上是等价的。

加法流密码的示例图如下:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    P(明文1010):::process --> +(异或运算):::process
    K(密钥流0010):::process --> +
    + --> C(密文1000):::process
    subgraph 安全通道
    end
分组密码

分组密码采用不同的加密方法,它将明文分成较大的n位字,称为块。每个块使用一个由秘密密钥控制的单向置换进行加密,即对n位字符串集合的置换。使用分组密码加密明文的最简单方法是将明文分成n位块,然后逐块加密,解密也对单个块进行操作:
- 加密:cᵢ = Eₖ(pᵢ)
- 解密:pᵢ = Dₖ(cᵢ)

这种使用分组密码的方式称为ECB(电子密码本)模式。注意,与加法流密码不同,加密操作不依赖于密文中的位置。

考虑对分组密码的一种攻击(所谓的制表攻击):密码分析者收集密文块及其对应的明文块(因为部分明文通常是可预测的),并使用这些信息构建一个大表。利用这样的表,可以推断出在相同密钥下加密的其他明文的信息。为了防止这种攻击,n的值必须相当大(例如64或128),并且明文不应包含任何重复(或其他模式),因为这些会泄露到密文中。

这表明,即使n很大,ECB模式也不适合加密非随机的明文(如文本、图像等),这种模式只应在非常特殊的情况下使用,例如明文已经是随机的(如加密密码学密钥)。不过,有一种简单的方法可以使明文随机化,即使用分组密码的不同操作模式。

分组密码的默认操作模式是CBC(密码块链接)模式。在这种模式下,不同的块通过将前一个密文块模2加到明文块上来耦合:
- 加密:cᵢ = Eₖ(pᵢ ⊕ cᵢ₋₁)
- 解密:pᵢ = Dₖ(cᵢ) ⊕ cᵢ₋₁

这“随机化”了明文并隐藏了模式。为了对第一个明文块(i = 1)进行加密,将c₀定义为初始值IV。通过改变这个值,可以确保相同的明文在相同的密钥下被加密成不同的密文。CBC模式允许在解密时进行随机访问,如果需要,可以只解密密文的一小部分。

也可以通过将输出反馈到输入,将分组密码用作加法流密码,这种模式称为OFB(输出反馈)模式。另一种流模式是CFB(密码反馈)模式,它具有更好的同步特性。这些操作模式已经在相关标准中进行了标准化。

分组密码是一种非常灵活的构建模块。最著名的分组密码是数据加密标准(DES),自1977年以来被广泛使用。DES的块大小为64位,密钥长度为56位,但后续会说明这已经不够安全。因此,美国政府计划用新的分组密码——高级加密标准(AES)来取代它。1997年9月,美国政府公开征集算法,截至1998年6月的截止日期,已提交了15个候选算法,目前评估程序正在进行中。AES的块长度为128位,密钥长度在128到256位之间。

传统加密算法的比较如下表所示:
| 算法类型 | 加密方式 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- |
| 加法流密码 | 逐位异或 | 实现简单,速度快 | 密钥流生成要求高,安全性依赖于密钥流质量 | 对实时性要求高,数据量小的场景 |
| 分组密码(ECB模式) | 逐块加密 | 简单直接 | 不适合非随机明文,易受制表攻击 | 明文已经随机的场景,如加密密钥 |
| 分组密码(CBC模式) | 块间链接加密 | 随机化明文,隐藏模式,支持随机访问 | 实现相对复杂 | 通用的加密场景 |
| 分组密码(OFB模式) | 输出反馈 | 可作为流密码使用 | | 对同步要求不高的场景 |
| 分组密码(CFB模式) | 密码反馈 | 同步特性好 | | 对同步要求高的场景 |

2.2 传统算法的安全性

选择加密算法时,安全级别是一个关键因素。1926年,G.S. Vernam发布了一种用于电报消息的简单加密算法。该算法是一种加法流密码,其密钥流由二进制对称源生成的完全随机序列组成(所有位均匀且独立分布)。1949年,信息论之父C. Shannon从数学上证明了这种方案提供了完美的安全性,即无论对手拥有多少计算能力,从观察密文都无法获得关于明文的任何信息。然而,该方案的主要缺点是秘密密钥与消息长度完全相同,且密钥流绝不能重复使用。C. Shannon还表明,如果想要完美的安全性,这是所能达到的最佳效果。尽管密钥很长,但Vernam算法仍被外交官和间谍使用,例如华盛顿和莫斯科之间的“红色电话”就采用了该算法,间谍过去常常携带带有随机字符的密钥本(该方案很容易推广到任意字母表)。该方案的安全性依赖于密钥本的每一页只使用一次,这就是“一次性密码本”名称的由来。

在大多数商业应用中,无法承受分发与明文一样长的密钥。因此,人们使用不提供完美安全性的加密算法,这意味着原则上可以从密文中恢复明文和/或秘密密钥,但这并不意味着在实践中也能做到。例如,加法流密码试图模仿Vernam方案,用从短密钥生成的伪随机序列代替随机密钥流序列。

2.3 公钥加密

传统密码学尚未解决的一个主要问题是密钥分发问题。特别是在大型网络中,在所有用户对之间分发密钥是不可行的(在一个有t个用户的网络中,有t(t - 1)/2个这样的用户对)。一种替代方法是在中央位置管理所有密钥,但这可能会成为单点故障。公钥密码学为这个问题提供了一个更优雅的解决方案。

公钥密码学的概念于1976年由W. Diffie和M. Hellman以及R. Merkle独立发明。公钥密码学的核心思想是陷门单向函数的概念。单向函数是一种易于计算但难以求逆的函数。例如,在传统分组密码中,密文必须是明文和密钥的单向函数:从明文和密钥计算密文很容易,但给定明文和密文,应该很难恢复密钥(否则分组密码就不安全)。同样,可以证明加法流密码(伪随机字符串生成器)的存在意味着单向函数的存在。陷门单向函数是一种具有额外特性的单向函数:给定一些额外信息(陷门),就可以对单向函数求逆。

利用这些函数,Bob可以向Alice发送秘密消息,而无需事先安排秘密密钥。Alice选择一个具有公共参数PA(Alice的公钥)和秘密参数SA(Alice的私钥)的陷门单向函数。Alice将她的公钥广泛公开(她可以将其放在主页上,也可以将其包含在特殊目录中)。任何想要向Alice发送机密信息的人,使用参数PA在陷门单向函数下计算明文的像作为密文。收到密文后,Alice使用她的陷门信息SA恢复明文。攻击者如果不知道SA,只能看到明文在单向函数下的像,将无法恢复明文。需要注意的是,如果要向Alice发送消息,必须知道Alice的公钥PA,并且要确保该密钥确实属于Alice(而不是Eve),因为只有相应私钥的所有者才能解密密文。公钥的分发不需要安全通道,但需要一个认证通道。

由于加密和解密使用不同的密钥,并且Alice和Bob拥有不同的信息,公钥算法也被称为非对称算法。公钥或非对称加密的模型图如下:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    P(明文P):::process --> E(加密算法E):::process
    E -->|密文C| D(解密算法D):::process
    D --> P(明文P):::process
    PA(公钥PA):::process --> E
    SA(私钥SA):::process --> D
    subgraph 认证通道
    end

公钥加密算法必须满足以下条件:
1. 生成密钥对(PA, SA)必须容易。
2. 加密和解密操作必须容易。
3. 从相应的私钥SA计算公钥PA应该很困难。
4. SA(PA(P)) = P。

设计一个安全的公钥加密算法显然是一个非常困难的问题。在众多的提案中,只有少数几个幸存下来(例如,几乎所有基于背包问题的系统都已被破解)。最流行的算法是RSA算法,它以其发明者R.L. Rivest、A. Shamir和L. Adleman的名字命名。RSA的安全性基于这样一个事实:找到两个大素数(在1998年,大意味着115位十进制数或更多)并将它们相乘相对简单,但使用当前的算法和计算机对它们的乘积(230位十进制数)进行因式分解是不可行的。

RSA算法的具体步骤如下:
- 密钥生成
1. 找到两个至少115位的素数p和q,并计算它们的乘积n = p * q,n称为模数。
2. 计算Carmichael函数λ(n),即p - 1和q - 1的最小公倍数。
3. 选择一个加密指数e(至少40到64位长),e与λ(n)互质,并使用欧几里得算法计算解密指数d = e⁻¹ mod λ(n)。公钥由对(e, n)组成,私钥由解密指数d或对(p, q)组成。
- 加密 :将明文表示为区间[0, n - 1]内的整数,并计算密文C = Pᵉ mod n。
- 解密 :P = Cᵈ mod n。

在不解释算法的数学背景的情况下,可以观察到解密需要提取模e次根,目前还没有不使用n的素因数的算法来解决这个问题;找到解密指数需要知道λ(n),因此需要知道n的因数。另一方面,加密操作不需要这些知识。

在实际使用RSA时,必须考虑许多技术细节。例如,为了避免简单的攻击(例如,当Pᵉ < n时提取自然e次根),明文P必须通过一个易于求逆的函数映射到区间[0, n - 1]内的随机整数。

公钥密码学更复杂的特性似乎需要一些“高级”的数学结构,大多数公钥算法基于数论问题(如某些群中的因式分解和离散对数问题)。虽然这些数论问题被认为是困难的,但应该注意到,自从公钥密码学发明以来,因式分解已经取得了显著进展:1975年的因式分解记录是39位十进制数,1985年增加到65位,1994年分解了一个130位的模数。这种进展是更复杂的因式分解算法与硬件和并行处理进步相结合的结果。密码学家在为公钥算法选择足够大的密钥时应考虑到这一点。

公钥算法的主要优点是简化了密钥管理,主要缺点是密钥较大(通常为64到256字节)且性能较慢。在软件和硬件中,公钥加密算法比传统算法慢两到三个数量级。例如,在90 MHz的奔腾处理器上,1024位的指数运算大约需要0.3秒,对应于3.4 kbit/s的速度,而在同一台机器上,DES的运行速度为16.9 Mbit/s。由于性能差异很大,且块长度较大(这会影响错误传播),通常会结合使用公钥算法和传统算法。

传统加密和公钥加密的比较如下表所示:
| 加密类型 | 密钥特点 | 安全性 | 性能 | 密钥管理 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 传统加密 | 加密和解密密钥相同或易推导 | 依赖密钥保密性,部分算法安全性有限 | 速度快 | 密钥分发困难,大规模网络不可行 | 小规模网络,对性能要求高的场景 |
| 公钥加密 | 加密和解密密钥不同,难推导 | 基于数学难题,安全性较高 | 速度慢 | 公钥可公开,简化密钥管理 | 大规模网络,密钥分发困难的场景 |

总结

本文介绍了密码算法设计的基本原理,包括传统加密和公钥加密。传统加密算法如加法流密码和分组密码,在不同场景下有各自的优缺点,而公钥加密算法解决了传统加密中的密钥分发问题,但存在密钥大、性能慢的问题。在实际应用中,需要根据具体需求选择合适的加密算法,并结合其他安全措施,如安全的操作系统、审计工具和管理指南,以确保电子信息系统的安全性。同时,随着技术的发展,密码算法也需要不断更新和改进,以应对日益复杂的安全威胁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值