答案:
密码的故事 2002 年 3 月 14 日 本文是由一个问题引出的。我需要一种将密码保存在加密文件中的方法,因为我需要记住许多密码,但记忆力却已大不如前。我知道有许多商用工具能够做到这一点,但我感到学习 .NET 中的一项新技术真的很有好处。 我用 Visual Basic® .NET 完成了一个简单而完整的程序,用于加密和解密文件,从中学到了许多知识。既然加密对于多种开发都是一个重要问题,本文就介绍一下如何构造这样的程序。 有各种低级别的技术可以用于加密,如 Microsoft Crypto API。而在 .NET 中,则是将这些复杂内容打包在各个 .NET 框架类中,并且由一个 System.Security 命名空间包含这些与加密相关的类。我们不可能查看该命名空间中的所有类,但通过分析一个最简单的、使用数据加密标准 (DES) 算法进行加密和解密的类,可以大概了解它们的工作原理。 正如前面提到的,我们要执行一个完整的加密和解密文件的过程,但首先需要解释一下该程序中涉及的许多基本概念。除有关密码的原理外,还有必要简单讨论一下 .NET 中的流,因为加密类是以流的形式实现的。 理解流流是 .NET 中处理字节的基本概念。下面简单介绍一下其工作原理。 假设要读取一个文件,将所有大写字母更改为小写字母,然后将结果写入另一个文件。图 1 显示了要完成的各个步骤的关系图。 图 1:读取文件、处理内容并写回结果的过程 在 .NET 中,完成此过程的最好方法是使用流。“流”是一个对象,用于接收和/或发送信息字节。流有两种 - 后端流和过程流。 后端流后端流从某个可以保存字节的位置获取字节或将字节存储到该位置。文件流就是一种后端流。文件流使用文件作为字节的后端存储,并读取或写入该文件。 文件流在 .NET 的 FileStream 类中实现,该类位于 System.IO 命名空间。FileStream 对象使用 Read 和 Write 方法访问文件。将 FileStream 对象附加到现有文件时,您可以使用 Read 方法,以一系列字节的形式获取文件内容。而使用 Write 方法时,FileStream 对象可以将一系列字节写入文件(现有文件或新文件)。FileStream 类还使用 Seek 方法来定位文件中的特定位置。 后端流的其他示例有网络流(将数据放到 TCP/IP 堆栈或从中获取数据)和内存流(使用内存作为临时后端)。它们的基本结构与 FileStream 对象相同,都使用 Read 和 Write 方法访问后端存储的字节。有些后端流(如网络流)不支持 Seek 方法,因为没有可供执行查找操作的永久存储内容。 过程流过程流用于接收并处理字节,然后将字节写入其他流(通常是后端流)。例如,我们可以从名为 Stream 的 .NET 基类中继承,然后创建一个将大写字母更改为小写字母的过程流。再将这个流附加到任何后端流。现在,上图的关系可以表示为图 2。 图 2:使用流表示的读取文件、处理内容并写回结果的过程 我们的“变为小写”流类只在经常需要执行该操作时才有用。但这种流类可以对通过它的字节执行所需的各种操作。 .NET 中的加密在 .NET 中,加密和解密是使用过程流来实现的。例如,加密的典型步骤为:
加密流被封装到一个名为 CryptoStream 的类(本文后面将详细介绍该类)。假设我们正在读取和写入磁盘文件,那么如果使用这一术语,则此过程的关系如图 3 所示。 图 3:加密文件的过程 加密类型加密信息的方法已经有几百年的历史。小说家艾伦·坡就曾经涉足密码学,而设计和破解密码也曾经是第二次世界大战中的一项重要活动。然而,计算机的出现使密码学有了飞速发展。计算机强大的分析加密消息的能力迫使人们不断研究越来越难以破解的加密技术。 其结果是研究出了多种加密方法。.NET 中提供的常用方法包括:
|