第 1 部分: 概览
对他人隐私的好奇心和隐藏信息是所有人类社会的特征。
随着计算能力的出现和高级数学技术的发展,系统变得非常复杂,
目前有可能构造出很难被有效破解的密码。用来加密和解密数据的算法分为两大类:
秘钥(secret key)或对称密码术,其中对加密和解密这两个过程使用同一密钥;
以及公钥或非对称密码术,其中一个密钥用来加密,另一个用来解密。现在,标识发送方、
认证和不可抵赖性(non-repudiation)与信息隐藏一样重要。本文对密码术做了广泛而详细的研究。
在该系列的后续文章中会更详细地研究具体问题。
一般信息
好奇心是人类最普遍的特征之一,与之对应的是隐藏个人信息的愿望。
情人、间谍和军队都会采用信息隐藏技术来安全地传递消息,有时还故意包含一些使人产生误解的信息。
隐写术是在看起来单纯的情形中隐藏信息的一种机制,可单独使用,也可以与其它方法一起使用。
根本上讲,加密在于扰乱消息,这样它的内容就无法轻易获取,而解密是这一过程的逆向过程。
这些过程取决于特定的算法,称为密码:经过适当扰乱的文本称为密文,而原始文本毫无疑问是明文。
可读性并不是某些明文的充要条件。在有些情况下,例如,如果对已加密的文本进一步加密的话,
在读取时,原始文本很可能没有任何明显的意义。还有可能构造一种机制,它的输出是可读文本,
但与未经加密的原始文本实际上没有任何关系。
密钥与密码结合使用来加密或解密文本。在把字符串用作密码的情况下,密钥看起来可能是有意义的,
但是与这个转换无关 — 密钥的功能在于由位组成的字符串,决定了明文到密文的映射。
直到最近,在计算机能力发展的帮助下,非常普遍的加密方法是使用某种替代形式。
这可能非常简单,就象影片 2001: A Space Odyssey 中所声称的隐藏计算机实名那样,
其中将字母 HAL 在字母表中移一位就会产生一个似是而非的结果。
在众多间谍小说中,把一些从单纯的文档或书籍中选取的字或短语或任意字母序列用来生成消息,
构造密钥或创建替代表,以加密或解密文本。
为什么使用密码术?
出于安全性原因而保护对信息的访问仍是使用密码术的主要原因。
但是,它也正越来越多地用于个人的标识、认证和不可抵赖性。
随着因特网、全球贸易和其它活动的增长,这一点尤为重要。
电子邮件和 Web 用户的身份非常容易隐藏或伪造,
而安全认证可以向那些用户提供远程交互的可信度:他们正与恰当的人进行交易,
消息没有被伪造或更改。在商业活动中,不可抵赖性是一个重要概念,
它确保(假设)如果商定了合同,一方就不能声称他们实际上并不同意来违约,
也不能在其它时间(可能是价格上涨或下浮时)这样做。
数字签名和数字时间戳记在这种情况下使用,并且常结合其它诸如消息摘要和数字证书等机制使用。
密码术及相关技术的使用范围是相当广泛的,而且正在稳定增长。密码使用很普遍,
但是它们提供的保护却常常不可靠,因为可能许多组织中的安全性策略并没有经过深思熟虑,
而且使用它们所引起的问题和麻烦会更多,根本不值得这样做。
在许多使用密码的情况下(例如,保护字处理文档),使用的密码根本无法胜任,
只要从可免费获得的一些攻击程序中使用一个,就能毫不费力地攻击它们。
遗憾的是,对立法者也有相当大的压力,使他们制定了一些荒谬的法规,
如美国的“千年虫适应性法案(Millennium Compliance Act)”,
它在本质上免除了组织设法尽力保护自己或承担不作为结果的责任。
保护视频录制的机制(例如,CSS)是脆弱得可怜,实用程序 DeCSS 不费吹灰之力就可以挫败它,
并使资料可用于其它平台上。
对于开发人员应该掌握些什么?
通常,安全性问题都难于理解和实现,所以对于开发人员来说,
掌握一些应用于加密的原则并学习使用的机制是很有用的。
编写密码算法是一项困难且复杂的任务,但是切合实际地在应用程序中实现现有机制,
或利用著名的产品来帮助信息隐藏或认证就不太一样了,这可能是一个非常有用的技能。
可以采样和提取或更改数字数据而不用担心检测,这一事实是密码术使用快速增长的一个原因。
特别是在跨因特网的情况中,不会发生面对面的接触,消息可能通过多个易受攻击的系统传播:
网站可能保存应受保护的敏感数据;信用卡号和其它敏感的个人数据都需要安全地传输;
电子邮件可以象明信片那样方便地读取;可能需要控制对受限区域的访问;
价值单位(数字现金、电子债券等)不能在没有保护的情况下随意地到处摆放;
内容供应商希望保护他们的电影或电视节目或音乐,以便只有订户才有访问权;
需要控制对网络的远程访问;移动电话、PDA 和膝上电脑会很容易地丢失或被盗;
ATM 只应对合法请求分发现金。这些都是需要并使用密码术的一些实例。
本文的目的是:概括地介绍相关背景知识,广泛地评价使用的一些技术和考虑一些含义。
接下来的其它文章将就不同主题更详细地论述。
密码技术
最古老的加密方法已经用了几千年,这种方法被称为密钥或对称加密。在这种方法中,
同一密钥既用于加密明文,也用于解密密文。使用的机制可能非常多样化,
但它们共同的弱点 — 因为需要共享密钥,所以一旦密钥落入坏人之手将很危险。
一旦未经授权的人得知了密钥,就会危及基于该密钥的安全性。
如果只涉及一条消息,可能不要紧;但是,电子通信的真正本质就意味着:
同一个密钥很可能被重复使用,而未必知道密钥已不再是保密的。
当然,一个密钥很可能被许多人作为一组算术方式构造的文件所共享,
这样在可以使用密钥前都需要对任何元素进行一些最小组合,但是这并不改变普遍原理。
对称系统一般都比较快,现在实际上可以使它很难于破解。与任何这类事物一样,
不存在绝对的保证,但是有理由说,运用目前可用的知识和使用当前级别的计算能力,
一个正确构造的系统可以是彻底安全的。
不同的密码容易受到不同形式的攻击侵袭,因此,在某些情况下,
某组一些特定密钥的安全性会比其它的要差。但是,密钥越长(其它所有条件相同),
破解加密的难度就越大。
软件代码是一种有价值的资源,许多公司竭尽全力保护它们的源代码,
完全反对“自由软件基金会(Free Software Foundation)”或开放源码运动的观点。
但是,在密码情况中,将算法完全地无偿地公之于众,接受大众的详细审查是必要的。
在字处理程序情况中,这可能会使人不快,但如果出现一些错误或其它问题,
通常也没有太大关系。错误是一定存在的,即使没有目前那种急于推出不成熟产品的倾向。
在加密软件或至少其中的密码部分的情形中,错误是非常危险的,会产生极端严重的后果。
发现这样的缺陷的唯一切实可行的方法是公开内部代码,让其他人进行同级评估与分析。
简单地说:不要相信,也不要使用任何其核心部分(包括加密算法)不可公开访问、
而且尚未同意同级评估的加密软件。密码发展的历史显示了众多证明这一策略的实例。
1976 年撰写的论文 New Directions in Cryptography 包含了设计一个具有公/私钥对系统的协议
的详细信息;随后这一算法以两位作者的姓名:
Whitfield Diffie 和 Martin Hellman(他们当时在斯坦福大学)命名。
Diffie-Hellman 算法现在在公共领域中广泛使用, 作为大量被称为公钥系统的基础。
公钥系统使用两个由质数构成的、互补的密钥,使得一个密钥用于加密明文,
然后可以用另一个且只能用这个密钥来解密。这也称为非对称密码术。
密钥对中一个密钥秘密保管,称为私钥,而另一个是公钥,它被广为公开。
这一过程独特的本质是:任何知道我的公钥的人都可以加密一条消息,
然后只能由我有使用安全的私钥才能解密这条消息。相反,我可以用我的私钥加密一条消息,
任何使用我自由可用的公钥解密它的人都可以确信这条消息是我发出的。
实际上,情况要比这复杂得多,因为非对称密钥与对称密钥相比,通常都很长
(大约 768 位相对于 56 或 128 位),所以处理文本会很慢。其中一个最广泛使用的公钥系统
是 1977 年由三个 MIT 的研究人员:Ron Rivest、Adi Shamir 和 Leonard Adelman 利用
Diffie 和 Hellman 引入的概念开发的。这一系统以他们姓名的首字母 RSA 命名,
并于 1983 年在美国获得专利。
遵从前面提到的警告和条件,公钥系统也可以是无懈可击的。
对这种系统的攻击方法通常是尝试对数字进行因数分解,而对大质数的因数分解是极其困难的。
但是,也可以采用其它方法,完全有可能发现新的数学技术,严重危及这些密码中的一个或多个,
或致使密码完全无效。而且,就象密钥密码术会因在分发时单个密钥落入坏人之手而易受攻击一样,
公钥密码术也容易受到称为内奸的风险的攻击。稍后将对此进行更完整地讨论,
但是本质上这是愚弄用户:让用户相信公钥来自某个源的,而实际上它是来自另一个源。
出于这一原因,公钥密码术通常都与其它安全性方法(如数字证书,它寻求确认公钥的完整性)相关联。
显然,私钥被人知道后,系统也是易受攻击的,但因为一般不需要共享私钥,所以这一风险不会很大。
我在前面曾提到,消息认证正变得与信息隐藏一样重要了。这里需要的是一种机制,
使接收方放心:消息真的是来自所声称的发送方,并且自它创建以来没有被改过。
通常,通过使用散列技术生成消息摘要来提供消息的完整性。
散列是一种将变长字符串转换为定长结果(一般 128 位)的技术。
实际上,对消息所做的任何更改 — 即使只是象添加或除去一个空格这样细微的更改 — 都会
导致在运行进程时创建一个不同的散列值。
下面这个简化的模型显示了这些不同元素如何在一起工作,
以保护消息不会被随意查看,并且确信接收到的消息是我(授权发送方)发出的:
我对明文消息应用一个适当的处理,以生成一个用作消息摘要的散列值。
我用私钥加密这个摘要,而不是消息本身,向任何可以用公钥解密它的人确认消息是我发出的。
我生成一个一次性使用的密钥,用来迅速加密消息文本。
我使用接收方的公钥加密这个密钥并将整个包发送给他。
我的收件人使用他的私钥获得这个密钥,接着用该密钥解密消息,
对消息应用相同的消息摘要算法,并将其与使用我的 公钥解密的消息摘要进行比较。
倘若它们匹配,他就可以确定消息是我发出的,而且没有被更改过。
虽然实际应用可能要复杂些,但这基本上就是使用非常广泛的程序 — “PGP 加密软件
(Pretty Good Privacy,PGP)”和其它一些应用程序的工作原理,
它们极好地以一种有效而快速的方法结合了一起工作的各种互补元素。
结束语
安全性在于管理风险,而不是排除风险。密码术是任何安全性策略的一个重要组成部分,
它正越来越多地在大量情形中在幕后使用。计算机技术的发展意味着,早期曾被认为是十分安全的密码,
现在可能已不再安全了,或只有适度的安全性。同时,在使用新算法或早期算法的变体时,
上述的这些发展也使得在合理的期限内使用越来越长的密钥成为可能。
诸如椭圆曲线(elliptic curve)或量子密码术(quantum cryptography)
等一些技术都展示了相当可观的前景,但是它们对于常规使用仍可能过于深奥。
现在,为了所有实际用途,在任何合理的时间段实现完全安全的系统是极可能的。
接下来的问题是如何实现一个这样的系统,以及如何理解在机器和人类术语方面的含义。
还有一点:虽然绝对认证似乎是一个有吸引力的选项,
但是它有相当的风险 — 如果某人的数字身份被盗,则结果会是灾难性的。
政府将密码系统当作战略资源,并希望控制它们的分发和使用,尽管政府有各种关于出口
和使用的宽松的法规,但仍越来越担心它们提供的内容。虽然它们可能不愿承认这一点,
但如果不对公认的行为自由实施严格限制的话,则它们正在进行的是一场不可能获胜的战斗。
对于开发人员,在开发使用加密技术的应用程序和掌握各种系统的优缺点,
以及在组织的约束内如何正确管理一些安全性风险等方面都有相当多的机会。
密码术简介,第 2 部分: 对称密码术
Murdoch Mactaggart(IBMDev@TextBiz.com)
自由撰稿人
2001 年 3 月
对称密码术(也称作秘钥密码术)早已被人们使用了数千年,
它有各种形式:从简单的替换密码到较复杂的构造方式。
不过,数学的发展和计算能力的不断进步使得创建牢不可破的密码成为可能。
对称系统通常非常快速,却易受攻击,因为用于加密的密钥必须与 需要对消息进行解密的所有人一起共享。
IBM 开发的密码 DES 已被广泛使用,但如今已到了其使用寿命的尽头,应该要更换了。
无论开发人员在他们的应用程序中使用哪种密码,都应该考虑使用的方法、
认识到发生的折衷方案以及规划功能更强大的计算机系统的前景。
简介--------
对称或秘钥密码术早已被人们使用了数千年,它包括任何加密形式,
其中同一个密钥既用于加密也用于解密所涉及的文本。
最简单的形式之一往往被称为“恺撒(Caesar)”密码 — 据说是 Julius Caesar 用来隐蔽消息
的方法 — 其过 程很简单,就是将字母表沿某一方向或反方向移动数位。
第 1 部分中提供的 HAL/IBM 示例正是这种形式,它的密钥指示将字母向前移动一位进行解密。
在这个普通示例中,解密密钥是一个加密密钥的镜像(mirror image),而不是它的复制品,
但这并没有损害作为对称机制的保密级别。
这种简单方案的变体涉及使用一个任意排序的字母表,它和用于明文消息的字母表有同样的长度。
在这种情况下,密钥可能是由数字组成的一个长序列,例如:5, 19, 1, 2, 11 ...
表明 A 应该映射为 E、B 为 S、C 为 A、D 为 B、E 为 K 等等 — 也可能是许多有点独创性方案中的一种,
这些 方案包含的字母(假定)是从特定小说的句子中选取的。
当然,这样的系统是极其脆弱的,而现代的系统则使用基于难解的数学问题的复杂算法,
并因此趋于极端强壮。
非对称密码术的过程有一个公共元素,而且几乎从不共享私钥。
与非对称密码术的这种情况不同,对称密码术通常需要在一个受限组内共享密钥并同时维护其保密性。
对于一个查看用对称密码加密的数据的人来说,如果对用于加密数据的密钥根本没有访问权,
那么他完全不可能查看加密数据。如果这样的秘钥落入坏人之手,
那么就会马上彻底地危及使用该密钥加密的数据的安全性。
因此,使用秘钥方法的这个组中的所有系统所共享的内容是密钥管理的难点,
将在关于实际问题的特性中(紧接在本系列后)更详细地讨论。
通常提到的密钥都有特定的位长度,如 56 位或 128 位。这些长度都是对称密钥密码的长度,
而非对称密钥密码中至少私有元素的密钥长度是相当长的。
而且,这两组的密钥长度之间没有任何相关性,除非偶尔在使用某一给定系统的情况下,
达到某一给定密钥长度提供的安全性级别。
但是,Phil Zimmermann,非常有效而且重要的软件包 — 称为“PGP 加密软 件
(Pretty Good Privacy,PGP)”的创始人,提出 80 位的对称密钥目前在安全性方面与 1024 位的
非对称密钥近似相等;要获得 128 位对称密钥提供的安全性,可能需要使用 3000 位的非对称密钥。
有些人肯定会对其中一些比较、(毫无疑问)甚至对比较的尝试持反对意见。
但是,在任何特定组中,所用密钥的长度通常是确定安全性时的一个重要因素。
而且,密钥长度并不是线性的,而是每增加一位就加倍。
二的二次方是四,三次方是八,四次方是十六,依次类推。Giga Group 提供一个简单的比喻,
它提出如果一个茶匙足够容纳所有可能的 40 位的密 钥组合,那么所有 56 位的密钥组合需要
一个游泳池来容纳,而容纳所有可能的 128 位的密钥组合的体积将会粗略地与地球的体积相当。
一个用十进制表示的 128 位的值大概是 340,后面跟 36 个零。
对称密钥方法比非对称方法快得多,因此加密大量文本时,对称密钥方法是首选机制。
诸如 DES(qv)的密码在软件中至少比非对称密码 RSA(在关于非对称系统的特性中有所讨论)
快 100 倍,而且在专门的硬件上实现时可能高达 10,000 倍。秘钥密码最适合用于在单用户或
小型组的环境中保护数据,通常都是通过使用密码实现。实际上,正如在别处已提到的,
广为散布或大规模实际使用的最令人满意的方法往往都同时组合了对称和非对称系统。
对称密码的类型
现在,通常使用分组密码(block cipher)或序列密码(stream cipher)实现对称密码,
我们将在此讨论这两种密码。这一特性中还要考虑称为“消息认证代码(Message Authentication Code,MAC)”
的一种使 用秘钥的校验和机制。MAC 与消息摘要 是完全不同的,消息摘要是在数字签名中使用的,
将在关于非对称密码术(第 3 部分)的特性中讨论。
分组密码
分组密码将定长的明文块转换成等长的密文,这一过程在秘钥的控制之下。
使用逆向变换和同一密钥来实现解密。对于当前的许多分组密码,分组大小是 64 位,但这很可能会增加。
明文消息通常要比特定的分组大小长得多,而且使用不同的技术或操作方式。
这样的方式示例有:电子编码本(ECB)、密码分组链接(CBC)或密码反馈(CFB)。
ECB 使用同一个密钥简单地将每个明文块一个接一个地进行加密;在 CBC 方式中,
每个明文块在加密前先与前一密文块进行“异或”运算,从而增加了复杂程度,
可以使某些攻击更难以实施。 “输出反馈”方式(OFB)类似 CBC 方式,
但是进行“异或”的量是独立生成的。 CBC 受到广泛使用,例如在 DES(qv)实现中,
而且在有关密码术的技术性方面的相应书籍中深入讨论了各种方式。
请注意:您自己建立的 密码系统的普遍弱点就是以简单的形式来使用某些公开的算法,
而不是以提供了额外保护的特定方式使用。
迭代的分组密码是那些其加密过程有多次循环的密码,因此提高了安全性。
在每个循环中,可以通过使用特殊的函数从初始秘钥派生出的子密钥来应用适当的变换。
该附加的计算需求必然会影响可以管理加密的速度,
因此在安全性需要和执行速度之间存在着一种平衡。
天下没有免费的午餐,密码术也是如此;与其它地方一样,应用适当方法的技巧中有一部分是
源于对需要进行的权衡以及它们与需求平衡的关系如何的理解。
分组密码包括 DES、IDEA、SAFER、Blowfish 和 Skipjack — 最后一个是“美国国家安全局
(US National Security Agency,NSA)”限制器芯片中使用的算法。
序列密码
与分组密码相比,序列密码可以是非常快速的,尽管某些方式下工作的一些分组密码
(如 CFB 或 OFB 中的 DES)可以与序列密码一样有效地运作。
序列密码作用于由若干位组成的一些小型组,通常使用称为密钥流的一个位序列作为密钥
对它们逐位应用“异或”运算。有些序列密码基于一种称作“线形 反馈移位寄存器
(Linear Feedback Shift Register,LFSR)”的机制,该机制生成一个二进制位序列。
序列密码是由一种专业的密码,Vernam 密码(也称为一次性密码本(one-time pad)),
发展而来的。序列密码的示例包括 RC4 和“软件优化加密算法
(Software Optimized Encryption Algorithm,SEAL)”,
以及 Vernam 密码或一次性密码本的特殊情形。
消息认证代码
消息认证代码(MAC)并不是密码,而是校验和(通常是 32 位)的一种特殊形式,
它是通过使用一个秘钥并结合一个特定认证方案而生成的,并且附加在一条消息后。
消息摘要是使用单向散列函数生成的,紧密联系的数字签名是使用非对称密钥对生成并进行验证的。
与这两者相比,预期的接收 方需要对秘钥有访问权,以便验证代码。
对称密码的示例
DES
数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准
(Data Encryption Standard,DES)是规范的描述,它出自 IBM 的研究工作,
并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,
最初开发的 DES 是嵌入硬 件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。
这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。
使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,
这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。
攻击 DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。
如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。
随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,
然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,
而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;
它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,
允许在特定条件下可以免除专利使用费而使用。
IDEA
国际数据加密算法(International Data Encryption Algorithm,IDEA)是由两位研究员
Xuejia Lai 和 James L. Massey 在苏黎世的 ETH 开发的,一家瑞士公司 Ascom Systec
拥有专利权。IDEA 是作为迭代的分组密码实现的,使用 128 位的密钥和 8 个循环。
这比 DES 提供了更多的 安全性,但是在选择用于 IDEA 的密钥时,应该排除那些
称为“弱密钥”的密钥。DES 只有四个弱密钥和 12 个次弱密钥,而 IDEA 中的弱密钥数相当可观,
有 2 的 51 次方个。但是,如果密钥的总数非常大,达到 2 的 128 次方个,
那么仍有 2 的 77 次方个密钥可供选择。
通过支付专利使用费(通常大约是每个副本 $6.00),可以在全世界广泛使用 IDEA。
这些费用是在某些区域中适用,而其它区域并不适用。IDEA 被认为是极为安全的。
使用 128 位的密钥,蛮力攻击中需要进行的测试次数与 DES 相比会明显增大,
甚至允许对弱密钥测试。而且,它本身 也显示了它尤其能抵抗专业形式的分析性攻击。
CAST
CAST 是以它的设计者 — Nortel 的 Carlisle Adams 和 Stafford Tavares 命名的。
它是一个 64 位的 Feistel 密码,使用 16 个循环并允许密钥大小最大可达 128 位。
其中变体 CAST-256 使用 128 位的分组大小,而且允许使用最大 256 位的密钥。
虽然 CAST 相当新,但是它看来对各种攻击(蛮力和分析性)都非常安全。虽然非常快,
但是它的主要优势是安全性,而不是速度。在 PGP 的最新版本及 IBM、Microsoft 等
厂商的产品中都使用了它。
Entrust Technologies 拥有 CAST 的专利权,但是据说在商业或非商业应用中,
无需支付专利使用费就可以使用它。
一次性密码本
一次性密码本或 Vernam 密码具有被认为是十分安全的优点,所以在某些特殊情况中
(通常是在战争中)有很高的应用价值。它使用完全与消息一样长的随机生成的密钥。
通常使用位的“异或”运算,将其应用于明文中,以 产生加密文本。应用同一密钥和适当的算法,
可以方便地解密消息:
一次性密码本加密/解密的简单例证
-----------------------------------------------------------------
00101100010....11011100101011 原始明文消息
01110111010....10001011101011 与消息长度相等的随机生成的密钥
01011011000....01010111000000 加密后的消息
01110111010....10001011101011 重用于解密的密钥
00101100010....11011100101011 恢复的原始消息
--------------------------------------------------------
虽然一次性密码本是完全且绝对安全的,但是它常常是不太实用的,因为需要以某种安全的方法
将与消息长度相等的密钥传送给接收方,以允许解密。而且,密钥只使用一次,
然后就被丢弃,虽然这明显对安全性有利,但增加了密钥管理问题。
目前可能使用一次性密码本的一个领域是在 MAC 中。
AES
如果 DES 已经到了它使用寿命的尽头,预计高级加密标准(AES)会代替 DES 作为
新的安全标准。在 1997 年,美国国家标准和技术研究所
(US National Institute of Standards and Technology,NIST)曾宣布一项竞 赛,
将 15 个原始项减少到 5 个。 最终的获胜者是比利时的 Joan Daemen 和 Vincent Rijmen
提交的一个名为 Rijndael 的产品(当前正在处于大规模试验和评估中)。
从技术上讲,Rijndael 的结构是复杂的而且有点不同寻常,却似乎非常安全且通用,
因为它的执行速度很快,十分适合于现代需求(如智能卡),而且能够使用的密钥大小范围很广。
结束语
密钥长度是确定密码提供的安全性程度的众多因素之一。在所有安全性问题中,
最重要的一个是平衡成本、时间、金钱和其它元素的风险。
例如,用于 DES 的 56 位密钥的确不太安全,但普通的 Yale 锁也是不安全的,
但多数屋主仍信赖它,因为即使是插芯锁也不足以防范坚定的入侵者。
开发人员需要结合开发成本、执行速度、专利使用费和安全性强度来评估需要的是什么。
也就是,应当清楚地知道尽可能使用强安全性,与其它因素保持一致并考虑应用程序的预期寿命。
计算机速度越快意味着可以迅速处理越长的密钥,但是也意味着可以更容易地破解旧系统中的短密钥。
考虑应用特定算法的方法、认识到简单的应用程序可能不是非常安全的,也是非常重要的。
与此相关的是允许公众详细审查的问题,为确保产品的信任度,这是绝对必要的。
那些阻止使他们的应用程序的密码元素可以公开获得的开发人员或软件出版商完全不值得信赖,
而且几乎肯定在提 供一种较差的产品。
密码术简介,第 3 部分: 非对称密码术
自由撰稿人(IBMDev@TextBiz.com)
Murdoch Mactaggart
2001 年 3 月
非对称密码体制提供的安全性取决于难以解决的数学问题,
例如,将大整数因式分解成质数。公钥系统使用这样两个密钥,
一个是公钥,用来加密文本,另一个是安全持有的私钥,只能用此私钥来解密。
也可以使用私钥加密某些信息,然后用公钥来解密,
而公钥是大家都可以知道的,这样拿此公钥能够解密的人就知道此消息是
来自持有私钥的人,从而达到了认证作用。
简介
加密和解密都需要共享一个秘钥,这可能是使用密码术的对称密码体制的主要弱点。
在非对称密码术或公钥密码术中没有这样的问题。使用在数学上相关的两个密钥,
并通过用其中一个密钥加密的明文只能用另一个密钥进行解密的方法来使用它们。
通常,其中一个密钥由个人秘密持有,因此几乎没有必要共享密钥,从而避免了对安全性的威胁。
第二个密钥,即所谓的公钥,需要让尽可能多的人知道。
加密/解密过程可以双向进行。即,我可以使用您的公钥加密某个信息以确保只有您
可以使用您的私钥来读取它。另外,还可以使用我的私钥来加密某个信息,
尽管从信息隐藏的观点来看,这是没有意义的实践 — 因为知道我公钥的任何人
都可以解密该消息 — 但这是认证系统的基础,其确保了消息确实来自知道我
私钥的人那里,推测起来就是我。
以前,我提到过非对称密码是 1976 年由 Whitfield Diffie 和 Martin Hellman
(后来去了斯坦福大学)在其 New Directions in Cryptography 一文中提出的。
但是,正如来自英国密码术权威的报告所显示的
(J.H. Ellis,The Possibility of Secure Non-Secret
Digital Encryption,CESG Report,1970 年 1 月),早先可能已经提出并检验了
一种很相似的机制,但是却被英国当局保密着。无论事实源自什么
(这种开发总是构建在以前开展的工作上),非对称密码体制概念的引入以及
后来在各种特定系统中的改进都是非常重要的发展。
对称密码体制和非对称密码体制各有利弊。特别是,非对称密码体制在
几方面易受攻击(例如,通过伪装),并且加密/解密过程比对称密码体制慢得多。
但是,它们有突出的优点,尤其是可以与对称密码体制一起创建完美和有效
的密码机制,并且可以提供非常高级别的安全性。在后继文章中将更充分地讨论这
两种常见方法的互补特性;本文更侧重于与公钥系统相关的技术以及其它方面。
虽然散列函数与公钥密码体制不同,但因为散列函数通常用于消息摘要,
因此在这里将它们视为认证和数字签名的整个系统的一部分也是适宜的。
非对称密码的示例
Diffie-Hellman
在前面提到的论文中对 Diffie-Hellman 协议作了充分描述。
它允许两个用户通过某个不安全的交换机制来共享密钥,
而不需要首先就某些秘密值达成协议。它有两个系统参数,
每个参数都是公开的,其中一个质数 p,另一个通常称为生成元,
是比 p 小的整数;这一生成元经过一定次数幂运算之后再对 p 取模,
可以生成从 1 到 p-1 之间任何一个数。
在实际情况下,可能涉及以下过程。首先,每个人生成一个随机的私有值,
即 a 和 b。然后,每个人使用公共参数 p 和 g 以及它们特定私有值 a 或 b
通过一般公式 g n mod p(其中 n 是相应的 a 或 b)来派生公共值。
然后,他们交换这些公共值。最后,一个人计算 kab = (g b ) a mod p,
另一个人计算 kba = (g a ) b mod p。当 kab = kba = k 时,即是共享的秘钥。
这一密钥交换协议容易受到伪装攻击,即,所谓中间人(middle-person)攻击。
如果 A 和 B 正在寻求交换密钥,则第三个人 C 可能介入每次交换。
A 认为初始的公共值正在发送到 B,但事实上,它被 C 拦截,
然后向 B 传送了一个别人的公共值,然后 B 给 A 的消息也遭受同样的攻击,
而 B 以为它给 A 的消息直接送到了 A。这导致 A 与 C 就一个共享秘钥达成协议
而 B 与 C 就另一个共享秘钥达成协议。然后,C 可以在中间拦截从 A 到 B 的消息,
然后使用 A/C 密钥解密,修改它们,再使用 B/C 密钥转发到 B,B 到 A 的过程与此相反,
而 A 和 B 都没有意识到发生了什么。
为了防止这种情况,1992 年 Diffie 和其他人一起开发了经认证的
Diffie-Hellman 密钥协议。在这个协议中,必须使用现有的私钥/公钥对以及
与公钥元素的相关数字证书,由数字证书验证交换的初始公共值。
RSA
1977 年,即,Diffie-Hellman 的论文发表一年后,MIT 的三名研究人员根据
这一想法开发了一种实用方法。这就是 RSA,它是以三位开发人员 — Ron Rivest、
Adi Shamir 和 Leonard Adelman — 姓的首字母大写命名的,
而且 RSA 可能是使用最广泛的公钥密码体制。1983 年给 RSA 在美国申请了专利,
并正式地被采用为标准,虽然到目前为止,它的出口仍受到限制,
但在美国以外还是一直广泛地用于本地开发的实现。
与其它此类系统一样,RSA 使用很大的质数来构造密钥对。每个密钥对共享两个质数的乘积,
即模数,但是每个密钥对还具有特定的指数。RSA 实验室对 RSA 密码体制的原理做了如下说明:
“用两个很大的质数,p 和 q,计算它们的乘积 n = pq;n 是模数。选择一个比 n 小
的数 e,它与 (p - 1)(q - 1) 互为质数,即,除了 1 以外,e 和 (p - 1)(q - 1)
没有其它的公因数。找到另一个数 d,使 (ed - 1) 能被 (p - 1)(q - 1) 整除。
值 e 和 d 分别称为公共指数和私有指数。公钥是这一对数 (n, e);私钥是这一对数 (n, d)。”
知道公钥可以得到获取私钥的途径,但是这取决于将模数因式分解成组成它的质数。
这很困难,通过选择足够长的密钥,可以使其基本上不可能实现。
需要考虑的是模数的长度;RSA 实验室目前建议:对于普通公司使用的密钥
大小为 1024 位,对于极其重要的资料,使用双倍大小,即 2048 位。
对于日常使用,768 位的密钥长度已足够,因为使用当前技术无法容易地破解它。
保护资料的成本总是需要和资料的价值以及攻破保护的成本是否过高结合起来考虑。
RSA 实验室提到了最近对 RSA 密钥长度安全性的研究,这种安全性是基于在 1995 年
可用的因式分解技术。这个研究表明用 8 个月的努力花费少于一百万美元可能对 512 位
的密钥进行因式分解。事实上,在 1999 年,作为常规 RSA 安全性挑战的一部分,
用了 7 个月时间完成了对特定 RSA 512 位数(称为 RSA-155)的因式分解。
记住:对于提供的安全性范围,这里给出的各种数字都是平均值,
有时识别一个特定的私钥可能会快得多,这一点也很重要。同样,
提供的安全性假设是基于对质数进行因式分解是很困难的。
如果发现了能使因式分解变得简单的新数学技术,这种假设就会发生变化,
那时 RSA 提供的安全性和类似的算法就可能立即变得毫无价值。
还请注意,密钥长度增加时会影响加密/解密的速度,所以这里有一个权衡。
将模数加倍将使得使用公钥的操作时间大致增加为原来的 4 倍,而用私钥加密/解密
所需的时间增加为原来的 8 倍。进一步说,当模数加倍时,生成密钥的时间平均将增加
为原来的 16 倍。如果计算能力持续快速地提高,并且事实上非对称密码术通常用于简短文本,
因此在实践运用中这不是问题。
其它非对称密码体制
以其开发人员的名字命名的 ElGamal 系统基于离散对数问题,并有加密和签名变体,
而数字签名算法(DSA)部分基于 ElGamal。该系统看来与 RSA 一样安全,但是通常更慢,
在加密期间扩展消息的时间是 RSA 的两倍。这些限制不太影响该算法在签名中的使用。
其它体制包括 1978 年第一次发布的 Merkle-Hellman 背包(knapsack)密码体制、
1984 年第一次发布的 Chor-Rivest 背包密码体制及其 1988 年的修订版。
还有在澳大利亚和新西兰开发的 LUC 公钥系统。McEliece 公钥加密算法基于代数编码理论,
并使用一类称为 Goppa 代码的纠错码。这些代码提供快速译码,但使用的密钥大小约有半兆,
并且加密时对消息文本的扩展也很大。
一组更先进的公钥密码体制是在八十年代中期提出称为椭圆曲线的密码体制,
现在引起了人们的兴趣。这些体制基于数字理论和代数几何学中的数学构造,
并通常定义在有限域上。这些体制尽管使用较短的密钥长度,但似乎有可能提供与
现有系统类似的安全性,有些则可能在移动计算或基于智能卡的系统中特别有用。
RSA 实验室提出使用 160 位密钥长度的椭圆曲线密码体制可能提供与使用 1024 位密钥
的 RSA 几乎相同的安全性。然而,问题是:对于某些尚未完全开发的专门攻击来说,
椭圆曲线密码体制可能是脆弱的。
散列函数
散列涉及将任意的数据字符串转换成定长结果。原始的长度可能变化很大,
但结果将总是相同长度,在密码使用中通常为 128 或 160 位。散列广泛用于填充
用来快速精确匹配搜索的索引;在技术上有各种散列函数,但概念上从密码编码角度是完全相同的。
当使用散列来构造索引项时,需要在工作系统中预计索引项的密度和
可能的冲突(即,不同的项返回同一散列值)之间寻求平衡。
除非索引很大且填充得很疏松,否则将一定会有冲突,但在创建索引中这些问题
很容易解决,比方说,与空值链接,然后在返回结果前检查那些具有相同散列值的原始项。
但是,当在密码体制中使用散列时,这种做法是不现实的,相应的算法需要尽可能地消除冲突。
比方说,128 位散列值的极限是 3.4 x 1038。但是,因为可能的消息数目是无限的,
所以冲突一定是可能的(并且实际上,数量是无限的)。另外,在任何构造良好的密码散列算法中,
两个不同消息产生同一散列值的可能性是极其微小的,对于所有实际用途,可以假设不会发生冲突。
散列函数只能单向工作,对于检索明文的目的,它毫无作用。然而,
它提供了一种数字标识,这种数字标识仅特定于一个消息,
如果纯消息文本有任何更改(甚至包括添加或除去一个空格)该标识也将更改,
散列函数在这方面确实做得很好。前面段落中给出的告诫对它也适用,这意味着可以
使用一个适当的散列函数来确认给定的消息未被更改。这个散列值称为消息摘要。
消息摘要对于给定消息来说是很小的并且实际上是唯一的,它通常用作数字签名和数字
时间戳记中的元素,将在后面的系列文章中讨论每一种用法。
如果可能生成冲突,则可能伪造摘要,然后发送欺诈的消息。这样做的一种方法是
使用称为“生日攻击”的一类蛮力攻击,“生日攻击”这个名称的由来是根据这样一个事实:
23 个人的一组中有两个或多个人的生日在同一天的概率大于 1/2 这一惊人的结果。
想伪造消息的人首先创建一条欺诈消息并拿取一条被攻击对象要签名的消息。然后,
他使用任意秘钥及适当散列算法来生成被攻击消息的 2 n/2 个变体以及相同数量的欺诈消息的变体,
n 是消息摘要的位数。假设最微小的更改也会产生不同的消息摘要,至少在理论上可能创建仅在
较小细节上不同的消息。根据生日理论,被攻击消息的一个变体与欺诈消息的一个变体的
散列值相匹配的概率大于 1/2。伪造者让没有产生怀疑的目标对象对所选的被攻击消息签名,
然后适时地将其换成欺诈消息,该欺诈消息的摘要与被攻击消息的签名者创建的新摘要完全相同。
使用这种方法,在生成消息摘要时不必知道目标对象所使用的秘钥。
MD4 和 MD5
MD2、MD4 和 MD5 是由 Ron Rivest 开发的用于数字签名应用程序的消息-摘要算法,
在数字签名应用程序中将消息压缩成摘要,然后由私钥加密。MD2 是为 8 位计算机系统设计的,
而 MD4 和 MD5 是为 32 位计算机系统开发的。MD4 是在 1990 开发的,现在它被认为是不安全的。
RSA 实验室将 MD5 描述为“系有安全带的 MD4”,它虽然比 MD4 慢,但却被认为是安全的。
与使用 MD4 时相同,会填补明文消息以确保其位的长度加上 448 可以被 512 整除。
然后添加表示原始消息长度的 64 位二进数,然后使用循环压缩函数在 512 位块中处理该消息,
每块都要经过四轮各不相同的处理。
SHA 和 SHA-1
安全散列算法(SHA)是由美国国家标准和技术协会(National Institute of Standards and Technology)
开发的,该协会隶属于美国商务部,负责发放密码规程的标准。
然而,该算法的安全性要比其名称所暗示的低,1994 年适时发布了原始算法的修订版,称为 SHA-1。
与 MD5 相比,SHA-1 生成 160 位的消息摘要,虽然执行更慢,却被认为更安全。
明文消息的最大长度可达到 264 位。
结束语
公钥密码术是特别用于认证技术的重要部分。虽然公钥体制可能只用于加密明文,
但其实际价值可能更多地取决于和其它元素的结合使用,包括消息摘要和对称密码体制,
从而支持复合信息包的认证和安全传输。
诸如 RSA 这样的公钥体制使用很长的密钥长度 — 现在,建议至少使用 768 位的密钥。
因式分解成质数是攻击许多此类系统的基本方法,而这样做非常困难。
因为计算机系统的处理能力不断增强,在蛮力攻击下,以前安全的密钥也可能变得脆弱,
因此确保使用足够长的密钥以提供保护应付将来可能存在的威胁,这一点很重要。
虽然计算机能力的提高使攻击旧的密钥变得更容易,但通过更方便地在合理的时间里使用
在可预见的将来不可能被破解的较长密钥,实际上许多人获得了更多的好处。
密码术简介,第 4 部分:因特网上的密码术
自由撰稿人(IBMDev@TextBiz.com)
Murdoch Mactaggart
2001 年 3 月
因特网引入了大量与以往不同的安全性弱点。您正在与之通信的组织或个人可
能是您不认识的或者可能是伪装成其他组织(个人)的组织或个人。不必过分
猜疑这类问题,但有必要采取适当的预防措施来防止通过各种方式造成的损失,
这些方式包括资金转移、错误认证的结果、机密信息丢失、毁约等。
密码术就是主要处理这类风险的,本文介绍了某些协议和相关机制,
这些协议和相关机制与因特网活动(包括,电子邮件)有特定的相关性。
与因特网相关的协议和机制
请求注释(Request for comment (RFC))
请求注释是由因特网网络工程任务组(IETF)管理的正式因特网文档,它用作传播有
关因特网工程咨询和意见信息的一种方式。RFC 描述了开放标准,使那些可能希望或
需要使用那些标准进行通信的人受益。它们是由参与不同工作组的志愿者编写的,
发布在不同位置上,特别在 IETF 站点上。有关 TLS 的详细信息(请参阅下面的描述)
就是以这种格式表示的。
IPSec
IETF 的 IP 安全性协议工作组目前正在定义 IP 的安全性附加协议,它是为 IP 数据
报这一层提供认证、完整性和保密性服务的规范。在几个 RFC 中对它都有描述,
虽然是想专门用于 IP v.6.0 的,但它也可以用于 IP v. 4.0(IP v. 4.0 是当前标准,
使用点分四组形式的地址,如 192.168.1.3)。它旨在用作对因特网通信
(例如,为 VPN 和封装隧道等)提供安全性的基础。一些供应商和软件组织正在开发
或提供集成了 IPSec 的产品。例如,芬兰的 SSH Communications Security 有一种称
为 IPSec Express 的产品,它是为方便符合 IPSec 的电子商业应用程序开发而设计的,
而从1999年6月开始,NetBSD Foundation 已经将IPSec代码合并到了NetBSD分发版中。
虽然 IPSec 已经成为因特网安全性实现的一个事实上的标准,但却受到来自
Niels Ferguson 和 Bruce Schneier(后者是被广泛关注的 Blowfish 密码的设计者)
等人的批评。Ferguson 和 Schneier 认为 IPSec 已经变得过度复杂并趋于难以管理。
他们说,这里的问题是:对 IPSec 进行的内容增加并没有以期望的方式增强该产品,
而是为了满足表达出来的广泛兴趣的愿望和期望。他们不合时宜地将这种方法与 NIST
采用的方法进行对照以便选择一种新的安全性算法来代替 DES,在有关对称密码术的
文章(第 2 部分)中对此作了描述。