伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

了解公钥加密

Posted on 2008-06-03 17:32  伯乐共勉  阅读(613)  评论(0编辑  收藏  举报

本主题从较高的层次讲述了与邮件安全明确相关的公钥加密元素。此外,还有其他一些资料,您可以参考这些资料,以便更深入地了解该主题。

密码学是一门研究如何通过使用代码和密码来保护信息的学科。密码学形成了邮件安全的基础部分。

简单来说,编码是系统地更改信息以使其不可读(并无从了解该信息是如何改变的)的过程。最早也是最简单的代码之一(称为恺撒密码)是通过采用字母表并使所有字母移动固定的位数而产生的。发件人和收件人均应了解移动了多少个字母,并因此能够使用该代码来更改信息,从而使他们中的每个人都能够读懂该信息,但其他任何人都读不懂该信息。将信息更改为代码的这一过程称为加密,而将代码重新更改为信息的过程则称为解密。原始邮件称为“纯文本”。更改后的邮件称为“密码”。用于将纯文本更改为密码的信息称为“密钥”。密钥更改信息时所采用的特定方法称为“算法”。

注意:
不应将本上下文中的纯文本(或明文)与谈及电子邮件格式时所提到的纯文本混为一谈。在后一种上下文中,纯文本用于区别邮件的 HTML 格式或 RTF 格式。在讨论邮件安全性的上下文中,纯文本用于区别密码,以指出该文本未加密。

例如,如果发件人希望使用此方法加密邮件,那么发件人需要知道纯文本中的字母 A 的每个实例都将被密钥更改为密码中的字母 D;纯文本中的字母 B 的每个实例都将更改为密码中的字母 E,依此类推。使用此密钥(采用“将字母前移三位”的算法),纯文本中的单词“help”将加密为“khos”密码。

当收件人收到密码邮件时,需要将它重新转换为纯文本,方法是使用密钥来解密信息,在本例中即是将字母后移三位,从而撤消更改。

在本例中,发件人和收件人必须将密钥保存在隐秘的地方,因为任何知道密钥的人都可以使用它来解密并阅读邮件。密钥丢失会使得加密变得毫无价值。此外,算法的强度也很重要。未经授权的一方可以获取加密后的密码,并通过根据密码来确定密钥的方法,设法破解加密。

请注意,发件人和收件人使用的是相同的密钥。此类加密称为“对称密钥”加密,因为双方使用相同的密钥。

虽然这只是一个简单的示例,但它说明了密码学的核心概念和功能。密码学最新的进步和提高是逐步产生的。

1976 年,Whitfield Diffe 和 Martin Hellman 创建了公钥加密。公钥加密是重大的创新,因为它从根本上改变了加密和解密的过程。

Diffe 和 Hellman 提议使用两个密钥,而不是使用一个共享的密钥。一个密钥(称为“私钥”)是保密的。它只能由一方保存,而不能各方共享。第二个密钥(称为“公钥”)不是保密的,可以广泛共享。这两个密钥(称为“密钥对”)在加密和解密操作中配合使用。密钥对具有特殊的互补关系,从而使每个密钥都只能与密钥对中的另一个密钥配合使用。这一关系将密钥对中的密钥彼此唯一地联系在一起:公钥与其对应的私钥组成一对,并且与其他任何密钥都不关联。

由于公钥和私钥的算法之间存在特殊的数学关系,从而使得这种配对成为可能。密钥对在数学上彼此相关,例如,配合使用密钥对可以实现两次使用对称密钥的效果。密钥必须配合使用:不能使用每个单独的密钥来撤消它自己的操作。这意味着每个单独密钥的操作都是单向操作:不能使用一个密钥来撤消它的操作。此外,设计两个密钥使用的算法时,特意设计无法使用一个密钥确定密钥对中的另一个密钥。因此,不能根据公钥确定出私钥。但是,使得密钥对成为可能的数学原理也使得密钥对具有对称密钥所不具有的一个缺点。这就是,所使用的算法必须足够强大,才能使人们无法通过强行尝试,使用已知的公钥来解密通过它加密的信息。公钥利用数学复杂性以及它的单向特性来弥补它是众所周知的这样一个事实,以防止人们成功地破解使用它编码的信息。

如果将此概念应用于前面的示例,则发件人将使用公钥将纯文本加密成密码。然后,收件人将使用私钥将密码重新解密成纯文本。

由于密钥对中的私钥和公钥之间所存在的特殊关系,因此一个人可以在与许多人交往时使用相同的密钥对,而不必与每个人分别使用不同的密钥。只要私钥是保密的,就可以随意分发公钥,并让人们放心地使用它。使许多人使用同一个密钥对代表着密码学上的一个重大突破,因为它显著降低了密钥管理的需求,大大提高了密码学的可用性。用户可以与任意数目的人员共享一个密钥对,而不必为每个人单独设立一个密钥。

公钥加密是邮件安全中的一个基本要素。如果没有公钥加密,那么是否存在实用的邮件安全解决方案是值得怀疑的,因为在公钥加密出现之前,密钥管理是一件很麻烦的事情。在了解了公钥加密的基本概念之后,接下来便是了解如何借助这些概念来实现邮件安全性。

公钥加密和数字签名

前一部分已讨论了,数字签名的核心是能够唯一地标识邮件的发件人。密钥对关系中的互补性本质使得通过公钥加密实现这种唯一标识成为可能。

由于密钥对中的私钥只属于一方,因此,任何时候只要显示已使用了私钥,就可以断定使用该密钥的即是它的所有者。这样,私钥的使用便类似于书面签名,因为只有签名的所有者才真正能够进行该签名。签名代表了它的所有者,就像私钥代表了它的所有者一样。

如果在加密和解密操作中成功地使用了密钥对,那么必定在操作的某个部分使用了密钥对中的私钥。由于公钥仅仅与一个私钥关联,因此可以使用对应的公钥来识别与它相关的唯一私钥。如果在加密和解密操作中成功地使用了特定的公钥,那么可以推断出在操作的某个部分使用了对应的私钥。因为只有密钥所有者可以使用私钥,所以,这意味着只有密钥所有者能够执行加密和解密操作中的特定部分。

使用私钥确定身份说明已成功地完成整个加密和解密操作。完整的操作意味着必须使用私钥将纯文本加密成密码,然后使用对应的公钥将密码重新解密成纯文本。如果显示此操作已成功完成,则说明使用了私钥,并且仅使用了私钥。

要说明已成功执行了加密和解密操作,那么加密和解密操作前的纯文本必须与加密和解密操作后的纯文本匹配。必须直接对两组纯文本进行比较,并且必须显示两者完全匹配。必须存在一个用来进行比较和验证的控件。

在电子邮件中,此控件就是实际的邮件。由于邮件对于发件人和收件人而言均可用,因此是一个很方便的控件元素。

若要在此比较操作中使用邮件,需要对邮件进行“哈希”转换,即将其全部文本转换成数字形式。完全相同的邮件文本将生成完全相同的哈希值。

通过在发送时获取邮件的哈希值并将它与私钥组合在一起,私钥的所有者就能够证明是他或她发送的该邮件。

将邮件与私钥组合是通过使用发件人的私钥加密哈希值(创建实际的数字签名)来完成的。根据发件人电子邮件系统的配置,数字签名将附加到邮件的底部(创建“明文签名”邮件),或者与原始邮件组合成一个二进制附件(创建“不透明签名”邮件)。

由于明文签名邮件的数字签名作为附件添加到原始邮件中,因此不支持 S/MIME 的电子邮件客户端能够阅读此类邮件。非 S/MIME 客户端将丢弃签名并显示原始邮件。但是,无法对邮件进行验证;它本质上与未签名的邮件相同。明文签名邮件的缺点是:干预邮件网关以改变邮件,从而使签名无效的可能性越来越大。

相反,在不透明签名邮件中,由于邮件和数字签名被视为一个二进制附件,因此在传送过程中不太可能被改变。但是,只有 S/MIME 客户端能够阅读该附件。如果非 S/MIME 客户端收到了不透明签名邮件,该邮件将是不可读的。

在某种程度上,创建不透明签名邮件是为了解决以下电子邮件系统问题:即电子邮件在传送过程中邮件正文发生改变。在此应当指出的是,遵守 S/MIME 标准的当前电子邮件解决方案不会改变邮件正文。不过,有许多客户端无法阅读不透明签名的电子邮件。因此,建议您发送明文签名的邮件。

当收到邮件时,可以检索数字签名,并在解密操作中应用发件人的公钥,从而产生出邮件的原始哈希值。然后,可以将此哈希值与收到的邮件的哈希值进行比较。由于只有一个私钥可以与公钥对应,并且只有公钥的所有者能够用它来成功地加密哈希值,因此使用公钥解密哈希值意味着加密该哈希值的是私钥的所有者。由于哈希值是邮件文本的数字表示形式,因此,如果加密的哈希值与已收到邮件的哈希值匹配,则意味着发送的邮件文本与收到的文本匹配。考虑到只有私钥所有者能够发送该邮件,因此结果便是收件人确信只有密钥所有者发送了该邮件,从而提供了身份验证,并因此而提供认可功能。它还显示出邮件未被更改,从而提供了数据完整性。如果哈希值不匹配,那么收件人便知道邮件在传送过程中被改变,或者所使用的公钥与所使用的私钥不匹配。在这两种情况下,收件人知道邮件无效,不应信任。

因此,可以看出公钥加密是通过什么途径提供组成数字签名的安全服务。

下图显示在添加了公钥加密的支持元素的情况下进行签名的顺序。

公钥加密以及电子邮件的数字签名

 


  1. 捕获邮件。
  2. 计算邮件的哈希值。
  3. 检索发件人的私钥。
  4. 用发件人的私钥加密哈希值。
  5. 将加密的哈希值作为数字签名附加到邮件中。
  6. 发送邮件。

下图显示在添加了公钥加密的支持元素的情况下进行验证的顺序。

公钥加密以及验证电子邮件的数字签名

 


  1. 接收邮件。
  2. 从邮件中检索包含加密哈希值的数字签名。
  3. 检索邮件。
  4. 计算邮件的哈希值。
  5. 检索发件人的公钥。
  6. 用发件人的公钥解密加密的哈希值。
  7. 将解密的哈希值与接收邮件时产生的哈希值进行比较。
  8. 如果值匹配,则说明邮件有效。

该序列操作显示了公钥加密如何提供必要的功能,以使数字签名具备其核心的安全服务:身份验证、认可和数据完整性。

公钥加密和邮件加密

与数字签名不同,公钥加密和邮件加密之间的关系通常更为简单,因为加密是公钥加密的核心功能。但是,邮件加密不仅是通过使用密钥对来加密和解密邮件而完成的。密钥对用于邮件加密中,而不用于整个邮件。

由于邮件加密的目的是确保只有已经授权的收件人能够查看邮件,因此每个收件人的私钥都适合于提供该服务。由于只有私钥所有者能够成功地使用私钥,因此在阅读邮件的过程中使用该密钥确保了只有该密钥的所有者能够阅读该邮件。此功能提供了作为邮件加密基础的保密性。此外,由于公钥可以广泛地分发,因此它使得任意数目的人都可以向一个私钥持有者发送信息。

但是,密钥对不是用在整个邮件中。这是因为,由于密钥算法所必需的复杂性,从而使得使用密钥对进行加密和解密操作是一个昂贵的过程。虽然需要使用密钥对,但它不是必须用在整个邮件中。它需要成为信息“锁定”和“解锁”过程中的一部分。只要在提供私钥前邮件不可读,便满足邮件加密的目的。

本主题前面的“公钥加密的工作原理”已提到,公钥使用强算法来弥补它广为人知这一特性。这些强算法意味着它们比原来的对称密钥更大,因此使用它们进行计算的速度也更慢。由于私钥仅仅用于在查看信息之前解锁信息,而不是用在整个邮件中,因此,确保在提供私钥之前信息不可用的同时,对尽可能少的信息使用密钥对、而对尽可能多的信息使用速度更快的对称密钥则更为经济一些。

对称密钥使用一个双方必须都知道的密钥。此过程有时称为“密钥协商”。如果使用密钥对,则没有密钥协商过程,因为一个公钥可以被许多人使用。密钥对还可以与对称密钥配合使用,以实现密钥协商。可以选择对称密钥,并且可以使用密钥对的公钥对该密钥进行加密,然后将其发送给私钥的所有者。当发送给多个收件人时,可以对所有收件人使用该对称密钥,然后使用每个特定收件人的公钥对该对称密钥进行加密。由于只有私钥所有者可以解密对称密钥,因此对称密钥对于未经授权的人而言仍然是保密的。可以在特定的操作或会话期间生成用于一次性使用的对称密钥。这种对称密钥称为“会话密钥”。公钥加密可以增强对称密钥加密的效应,而不是将其取而代之。

邮件加密的目标是确保在出示私钥之前,邮件不可读。在对称密钥协商中可以使用私钥,以便安全地传送对称密钥。由于可以安全地将对称密钥传送给收件人,因此,可以使用对称密钥加密邮件,然后使用密钥对中的公钥加密该对称密钥。只有私钥持有者可以解锁对称密钥,然后使用解锁后的对称密钥解密邮件。此操作的作用就好像使用密钥对对整个邮件进行加密和解密。但是,由于它对大多数信息使用速度更快的对称密钥,因此此操作比其他操作方法的速度要快。在此过程中,邮件在出示私钥之前一直处于被保护状态,从而提供了保密性,这是邮件加密的基本服务。由于加密和解密过程,在加密后改变邮件会导致解密操作失败,从而提供数据完整性。

虽然人们通常都想不到使用对称密钥,并且它的优势不会立即就显示出来,但是它可以在不损失邮件安全性的情况下提高邮件加密的速度,从而增强了邮件安全性。下图显示在具有公钥加密的支持元素的情况下进行加密的顺序。

公钥加密以及电子邮件的加密

 


  1. 捕获邮件。
  2. 检索收件人的公钥。
  3. 生成一次性对称会话密钥。
  4. 用会话密钥对邮件执行加密操作。
  5. 用收件人的公钥加密会话密钥。
  6. 加密的会话密钥包含在加密的邮件中。
  7. 发送邮件。

下图显示在添加了公钥加密的支持元素的情况下进行解密的顺序。

公钥加密以及解密电子邮件

 


  1. 接收邮件。
  2. 从邮件中检索加密的邮件和加密的会话密钥。
  3. 检索收件人的私钥。
  4. 用收件人的私钥解密会话密钥。
  5. 用解密的会话密钥解密邮件。
  6. 将未加密的邮件返回给收件人。

这一系列活动显示出公钥加密如何为邮件加密的下列核心服务提供支持:保密性和数据完整性。

了解如何将公钥加密同时用于数字签名和邮件加密

数字签名和邮件加密是倍受赞誉的服务。在考虑如何将公钥加密分别用于每个服务后,考虑这些服务如何一起使用会对您有所帮助。

下图显示在添加了公钥加密的支持元素的情况下进行签名和加密的顺序。

公钥加密以及对电子邮件进行数字签名和加密

 


  1. 捕获邮件。
  2. 计算邮件的哈希值。
  3. 检索发件人的私钥。
  4. 检索收件人的公钥。
  5. 用发件人的私钥加密哈希值。
  6. 将加密的哈希值作为数字签名附加到邮件中。
  7. 生成一次性对称会话密钥。
  8. 用会话密钥对邮件执行加密操作。
  9. 用收件人的公钥加密会话密钥。
  10. 加密的会话密钥包含在加密的邮件中。
  11. 发送邮件。

下图显示在添加了公钥加密的支持元素的情况下对数字签名进行解密和验证的顺序。

公钥加密以及解密电子邮件和验证数字签名

 


  1. 接收邮件。
  2. 从邮件中检索加密的邮件和加密的会话密钥。
  3. 检索收件人的私钥。
  4. 用收件人的私钥解密会话密钥。
  5. 用解密的会话密钥解密邮件。
  6. 从邮件中检索包含加密哈希值的数字签名。
  7. 计算邮件的哈希值。
  8. 检索发件人的公钥。
  9. 用发件人的公钥解密加密的哈希值。
  10. 将解密的哈希值与接收邮件时产生的哈希值进行比较。
  11. 如果值匹配,则说明邮件有效。
  12. 将未加密的邮件返回给收件人。

这一系列活动显示出公钥加密如何使得数字签名和邮件加密成为可能。

请注意双方是如何基于特定的操作而需要另一方的公钥或私钥的。例如,发件人必须使用他或她的私钥对电子邮件进行数字签名,但是必须使用收件人的公钥发送加密的电子邮件。由于此过程会让人产生混淆,因此,下图中显示了一个图表,该图表说明了具体的操作过程中哪一方需要什么密钥。

基于角色和操作的密钥需求

 


要了解的下一个元素是数字证书。数字证书通过分发密钥对,从而使数字签名和加密成为可能。