标题：实时加解密
实时加解密技术概述
实时加解密技术(Real Time Encryption/Decryption)是上世纪末开始出现的的一种文件加密技术。这种技术在用户的正常工件中对数据的加解密需求进行实时处理，没有显式的加解密过程，也不产生临时文件。国外早期文献中也称为“On the Fly Encryption/Decryption”，意指其数据“不落地”，是相对传统加密文件必须解密成磁盘上的明文文件才能使用来说的。
上世纪九十年代末，微软公司(Microsoft)推出了划时代的Windows 2000操作系统，Windows 2000不但淘汰了之前取得巨大成功的Windows 95/98系统，也进一步巩固了Windows操作系统在PC机上的绝对统治地位。基于NT内核的Windows 2000引领PC机真正进入了32位时代。此后的Windows XP、2003 Server、Vista以及最近的Windows 7操作系统都是基于NT内核。NT内核的操作系统拥有规范的扩展开发层次架构，并引入了过滤驱动的概念，这为操作系统的第三方扩展提供了标准接口。
文件是操作系统管理数据的唯一方式，因此文件系统是任何操作系统的重要组成部分，操作系统和应用软件的数据维护都离不开文件系统。Windows 特别为文件系统扩展定义了不同用途的接口以及多个扩展并存时的优先级关系，这种标准为同样采用文件系统扩展技术的不同软件的兼容并存提供了保障（也有些采用这种扩展技术的软件与其它同类软件冲突，主要是没有遵守优先级规范，请参考“文件系统过滤驱动的优先级关系”）。
文件系统的扩展技术首先被反病毒软件采用，今天我们熟悉的反病毒软件的实时监控技术就是采用这一技术的成果。通过文件系统扩展监视文件系统的活动，实时扫描正在操作的文件，发现病毒时进行查杀，这就是反病毒软件实时监控技术的原理。实时加解密技术也采用了类似的原理，只不过实时加解密技术有更高的要求，对数据的处理必须真正做到“实时”，因为上层应用请求的数据依赖于实时加解密处理的结果。而反病毒软件的实时扫描并不需要为上层应用提供数据，其行为是独立的，延迟处理或忽略部分文件系统事件一般不影响病毒实时监控。
采用文件系统扩展技术可以不影响前台用户的前提下提供软件需要实现的功能，因此成熟的商用工具软件大量采用的文件系统扩展技术。除各种反病毒软件外，实时备份软件、磁盘压缩软件、文件活动监视软件、系统还原软件、虚拟磁盘软件、Direct CD形式的刻录软件等大都采用了这项技术以提高软件运行效率和提供用户透明操作体验。实时加解密技术在提供用户透明操作体验的同时避免了数据在存储介质上反复加解密的过程，解决了传统加解密技术操作繁杂、效率低下的问题，把加密技术的实用性向前推进了一大步。
实时加解密技术的特点和优势
完全透明的用户体验用户在使用基于实时加解密技术的加密文件时与一般的明文文件感觉上没有任何区别，这种文件加密后在使用上与非加密文件完全相同的用户体验称为“透明”。透明用户体验意味着使用者不需要因为使用保密系统而改变他们即有的操作方式和使用习惯。由于加解密工作是全自动按需进行，因此实时加解密技术在处理加密文件时也不需要使用者做任何配合性的额外工作。这些特点使实时加解密技术在实现文件加密的同时几乎不降低任何人工效率。 
  传统加密技术下的加密文件使用流程传统加密技术加密的文件必须先解密后才能使用。按照保密规范，在查看一个加密文件时，必须经过解密成明文－>查看明文－>删除明文的过程。如果需要修改一个加密文件，则需要经过解密－>修改－>保存－>加密的过程。这些操作中有一半以上步骤是因为文件加密而造成的额外工作。而在实时加解密技术系统中，透明用户体验没有解密过程，加密文件可以直接查看或修改；同样因为磁盘文件实际并没有解密成明文，也就没有删除明文或再次加密的步骤了。
  实时加解密技术下加密文件的使用流程加密文件不会因为使用而被解密实时加解密技术在使用加密文件时没有在存储器上的解密过程，因此存储器上的加密文件是不会因为使用而被解密的，即使操作者当前正在使用中的文件也不会有明文数据在存储器上存在，这种特点相对传统加密技术具有更高的安全性。传统加密技术由于加密文件在使用时解密成为明文文件，因此在使用时没有任何防护，最容易受到攻击造成泄密。不增加输入输出数据量传统加密技术不管应用程序需要使用文件中的多少数据总是先一股脑把整个文件解密。实时加解密技术在应用程序请求加密文件数据时并不解密整个加密文件，而是按需解密，仅向应用程序提供即时运行所需的明文数据。应用程序运行时的数据请求往往是随机的数据片断，这就要求实时加解密技术必须支持对加密文件任意位置任意长度的密文数据随机加解密。因此，从理论上讲，实时加解密技术这种按需加解密的方式不会增加存储器输入输出的数据量。我们知道，数据输入输出是计算机性能的瓶颈，如果在运行中增加了数据输入输出，必定会降低计算机的运行效率。
实时加解密技术原理
实时加解密技术类似于一个介于计算机内存和永久存储器（硬盘等存储装置）之间的编码器，其加解密是以管道方式进行的，管道的一端是明文端，连接着应用程序，数据流向应用程序时必须是明文，从而使应用程序获得正确的运行时数据。管道的另一端是密文端，连接着存储器。不管数据的流向如何，管道两端的数据属性不会改变。
  实时加解密技术原理　　实时加解密技术把计算机的内存与永久存储器隔离开，保证所有进入永久存储器的数据都是密文，而进入内存的数据都是明文。为什么采用这种设计呢？我们知道计算机运行的部件是CPU，而CPU能够操作的数据全部处于内存。即使在保护模式CPU可寻址的范围远大于物理内存总量，但当CPU实际存取这个地址的数据时这块数据必须处于物理内存中。因此，即使外部存储器上的数据是加密的，但只要进入内存后被解密成明文，对于计算机来说就和没有加密的数据是一样的了。实时加解密就是利用这个原理实现加密数据的透明操作。安全性角度上看，计算机内存不是永久存储器，操作系统的重启、掉电都会清除内存中的数据。另外，计算机内存中的数据即使在运行时也是杂乱无章，在操作系统的多任务调度和VMM分页机制下，即使打开正在使用的加密文件在内存中也难以获得其完整的明文数据。因此，实时加解密技术的安全性优于传统加密技术。如果结合主动加密技术，可以限制加密数据不能以任何明形式式流出当前计算机，即使是加密数据的片断或其转换后的数据。这就是基于实时加解密和主动加密技术的内网防泄密方案原理。
实时加解密技术在Windows平台上的实现
在Windows操作系统中，代码的运行级别被分为两个特权级RING0和RING3，通常我们把RING3称为用户层，RING0称为内核层。应用程序运行于用户层，操作系统提供应用程序接口（API）支持各种应用程序的运行。用户层与内核层数据是隔离的，用户层不能直接访问内核层的数据，操作系统通过功能调用实现用户层和内核层代码的切换。90%以上的应用程序是不关心这种代码切换机制的，因为一般应用程序只调用API，从用户层到内核层的代码切换是提供API的操作系统组件完成的。日常使用的应用软件如Office办公、CAD设计、工程计算、企业ERP、Internet浏览/电子邮件等都运行于操作系统的用户层。用户层提供了丰富的人机界面和逻辑功能，但用户层实际上是不和任何计算机硬件打交道的，所有应用软件逻辑功能的实现最终必须在计算机硬件动作上体现，操作系统在内核层把所有用户层的逻辑功能转换成内核层的硬件动作，这通过各种硬件驱动实现。存储器也是一种硬件设备，为了管理存储器上存储的数据，操作系统在存储器物理驱动之上设计了文件系统，这通过文件系统驱动实现，操作系统中的所有的文件输入输出请求最终都会经过文件系统驱动进入实际的物理存储器。
实时加解密技术必须在应用程序和物理存储器之间找一个合适的接入位置，从Windows系统的架构上，可以看出有以下几个位置可以接入，一个是在用户层的API接口上，一个是内核层的文件系统与物理存储器驱动之间，还有一个在物理存储器驱动与存储器硬件之间。我们称第一种为“API拦截”方式，第二种为“文件系统驱动”方式，第三种为“存储驱动方式”。下面对这几种方式作一个比较：
1. 通用性
API拦截方式只能对调用API的用户层应用程序有效，如果一个应用程序不是以调用一般文件操作API的方式存取文件（如以VMM的内存映射方式直接读取或修改文件），API拦截方式就无效了。Windows操作系统中最经典的记事本（NotePad）程序就是以内存映射方式存取文件的，经常看到一些保密系统可以支持大型软件的文件格式，却不能支持最简单的TXT文本文件。这是因为API拦截方式从原理无法支持内存映射方式存取文件。因此API拦截方式只能适用于测试通过的已知软件。
不管以何种方式存取文件，操作系统最终都会请求文件系统驱动执行相应的动作。因此基于文件系统驱动方式的实时加解密技术支持所有应用程序。而且理论上可以支持运行在这个操作系统下的未知应用程序和将来发布的新应用程序。
存储驱动方式是文件系统驱动最后的存储动作实现者，因此存储驱动方式与文件系统驱动方式具有相似的广泛支持性。
2. 规范性
API拦截方式是一种编程技巧，却不是公开的编程规范。由于没有规范，当系统中有两个以上采用这种技术的软件存在时常会发生冲突造成应用程序崩溃。而文件系统驱动和存储驱动都可以使用标准的操作系统过滤驱动方案，多个采用相同技术的软件并存时也能协同工作。
3. 性能
API拦截方式处于操作系统的用户层，操作系统在这一层更多地考虑到应用程序调用的方便性，与驱动层的实际功能并没有一对一的关系，实际上用户层的API接口数量远大于驱动层的功能数量。操作系统一般在文件系统驱动中对来自用户层的请求重新优化整合，以减少实际的物理存取。操作系统的文件系统缓存技术就是这一优化技术的体现。在缓存技术的作用下，大部分用户层的文件操作并没有产生真正的物理存储器动作。如果以API拦截方式实现实时加解密，因为用户层无法确定一次文件存取是否会实际产生存储器动作，就不得不对所有文件输入输出数据请求进行加解密处理。而文件系统驱动层可以仅处理那些产生存储器实际输入输出的请求。可见支持同样的文件实时加解密驱动方式执行的加解密动作次数比API拦截方式要少得多，从而具有更高的性能。
存储驱动方式与上述两种加密方案有所不同，API拦截方式和文件系统驱动方式都可以按需加密文件，因此可以对系统中的文件按加密和不加密分别处理，基本可以不影响不加密的文件的存取性能。而存储驱动的加密只能对整个存储器加密，只要使用就会对存储器的数据一股脑加密，因此在实际应用中损耗会比较大，其加密效果与一些有加密功能的存储器自身的加密效果相似（如笔记本硬盘的内置加密功能）。硬件存储器本身的加密效率远高于软件驱动的实现，因此在保密系统中单纯采用这种方式的不多见，一般以虚拟磁盘分区的方式实现，而不是直接支持现有的物理存储器。  Windows平台文件系统层次关系图4. 实现难度
API拦截虽然不是规范的编程方式，担这项技术早在16位Windows时代就已经成功应用于商业化软件产品，早期的电子词典软件就是使用这项技术实现抓屏。因此API拦截技术的实现并不难。
操作系统驱动编程相对比较困难，无论从设计还是开发阶段的调试。能够进入稳定商用则需要大规模的测试和较长时间的考验。驱动程序一旦出现错误会造成整个操作系统的崩溃，也就是我们常见的“蓝屏”。而文件系统驱动的繁杂性又远大于存储驱动，因为文件系统驱动中有复杂的逻辑数据划分，而存储器驱动一般只需要基本的数据输入输出。
从兼容性来说，文件系统驱动却好于存储器驱动。操作系统在所有存储器上加载文件系统，没有文件系统的存储器不会被操作系统识别，因此一个文件系统过滤驱动可以支持所有的不同类型的物理存储器。而存储器驱动是与物理设备有关的，不同物理存储器有不同的存储驱动，必须对不同的存储器驱动分别处理。支持一个物理存储器就必须单独写一个对应的存储器过滤驱动，这样显然十分麻烦，因此采用这种技术的产品一般都不支持物理存储器，而是仅支持自己的虚拟驱动器（虚拟区）。
综上所述，基于文件系统驱动方式的实时加解密技术具有压倒性优势，唯一的问题是实现难度。因此文件系统驱动方式的实时加解密技术最关键的指标是其系统稳定性（驱动程序的健壮性）。
实时加解密技术与透明用户体验
有一种说法叫“透明加解密”，这种说法不是太恰当。“透明”实际上是一种用户体验，也就是用户的感觉。实时加解密可以提供透明用户体验，反之提供透明用户体验的加密系统却未必就是实时加解密。
怎样才算是透明用户体验？一般认为不改变用户的操作方式就是透明用户体验。对于加密文件来说就是加密文件可以直接使用。而直接使用有多种方法，在Windows系统中最常用的就是通过鼠标双点击文件打开。所以一般加密文件可以直接双点击打开的就被称为“提供透明用户体验”了。
文件压缩技术的应用比加密技术要早，我们以压缩软件提供的透明用户体验来说明各种透明用户体验之间的区别。WinRAR是目前应用十分广泛的压缩软件，WinRAR为其压缩的文件提供了比较完善的透明用户体验，用户可以通过双点击打开压缩文件内部的文档、执行内部的可执行文件等。NTFS文件系统也提供了文件的压缩功能，压缩过的文件也可以直接使用。这两者有什么区别呢？WinRAR在用户打开压缩包内部的一个文件时实际上是把这个文件解压缩到系统的临时文件夹，然后再打开临时文件夹中的文件。而NTFS的压缩却是以文件系统驱动实现的，使用了前文提到的管道原理，没有中间文件产生。
有些提供透明用户体验的加密技术与WinRAR的处理类似，这种处理就是加密技术中所谓的“壳式加密”，加密时叫“加壳”，解密时叫“脱壳”，提供透明用户体验时实际上已经自己“脱壳”了。这种技术实现上仍然属于传统加密技术，因为其在使用加密文件时的操作步骤与传统加密完全相同，只是解密过程和修改后的加密过程由加密系统在后台自动实现，从而给前台工作的用户以透明操作体验。壳式加密的透明用户操作体验有一定局限性，因为在使用加密文件时要完全解密，这在用户打开文件时会造成前台应用程序的明显迟滞感，尤其在文件很大的时候。
  采用壳式加密技术的加透明用户体验处理流程　　前面提到的利用存储器驱动实现的虚拟磁盘分区加密技术实现的透明用户体验则要完善得多，虚拟分区上的数据无论对用户还是操作系统都是透明的，因为虚拟磁盘完全以一个独立的存储器设备出现在操作系统中。这种虚拟磁盘分区的技术最早的应用并不是加密而是映像盘。著名的虚拟光驱软件Daemon-Tools就是采用的这种技术。但作为基于存储器驱动技术的产物，其缺点在前文已做过分析，存储器驱动上没有文件系统的逻辑数据，操作系统在存储器驱动上加载的文件系统已经脱离存储器驱动的控制，因此不能对虚拟磁盘上的文件作单独控制和细化区分。另外由于虚拟磁盘没有能够做到对物理存储器的支持，必须把需要加密的数据挪到虚拟分区里才能够加密，这也限制了虚拟分区所能够加密的对象必须是孤立的数据文件。由于其不能支持对除虚拟分区以外的存储区域数据加密，因此难以基于虚拟磁盘分区技术实现主动加密技术。但因其突出的数据透明性和相对独立性，比较适合文档、图片等私人资料的加密。
基于文件系统驱动的实时加解密技术不仅实现完全透明的用户体验，对操作系统中的任何应用，甚至包括来自内核层的请求其数据都是透明的。文件系统实时加解密技术加密文件不改变这个文件的物理存储位置，这一点与基于虚拟分区的技术不同。另外其加密的文件完全融入到原来存储器的文件系统中，因此这种技术可以嵌入现有的应用程序，加密应用程序的全部或部分数据文件甚至程序文件。因其能够支持操作系统能够识别的所有存储器，适合结合其它访问控制技术（如主动加密技术）组成适用范围广、操作透明度高的防内部泄密系统。
理想的透明用户体验，应当做到以下几点：
1. 不限定可以加密的文件类型
2. 不限定可以使用加密文档的应用程序
3. 不限定加密文档的打开方式
4. 不限定加密文档的存放位置
加密技术做到这些，可以保障加密文件的使用者感觉不到文件加密后与加密前的差异。以下是几中加密技术的比较（◎：有限制，－：不限制）。
﻿文件类型限制
应用程序限制
打开方式限制
存放位置限制
壳式加密
◎
◎
◎
－
API拦截
－
◎
－
－
虚拟分区
－
－
－
◎
文件系统驱动
－
－
－
－

secWall 中的实时加解密技术
secWall 是提出实时加解密概念和并率先将该技术应用到商业化加密产品。secWall 全系统产品中的文件加密均基于实时加解密引擎。从secWall的加密产品中还可以看出实时加解密技术下加密文件还有很多扩展的功能特征：
1. 结合硬件，加密文档即插即用，拔离隐藏
secWall的实时加解密技术把secWall IC的即插即用特征扩展到实时加解密技术中，使加密文件可以随硬件身份认证IC即插即用。在IC拔离系统时，加密文件立刻对操作系统不可见并不可访问。
2. 任何文件系统对象都可以加密
文件系统对象，小到单个文件，大到整个逻辑盘（驱动器）都可以加密。一些操作系统中特殊的对象和应用程序的数据对象，如程序组、桌面图标、收藏夹、Internet访问记录、邮件收件箱、QQ/MSN聊天记录等都可以被加密。 
3. 集成的授权访问控制技术
secWall把文件加密和授权访问控制技术集成在一起，阻止未授权者看到、移动、复制、删除、更改和执行加密文件，可以使用内置访问控制技术加密可执行文件以限制特定应用软件的使用者。 
4. 使用文件系统的容器对象继承加密属性，自动加密新建数据
文件系统中可以容纳其它对象的文件夹或驱动器称为容器对象。secWall可以加密这些容器对象，尽管这些容量对象没有数据内容关联。在加密后的容器对象中新建的对象将自动继承其父对象的加密属性，从而在新建时自动加密。因此在secWall系统中任何一个加密的文件夹或驱动器都是一个独立的“保险箱”，数据存放到这些“保险箱”中会被自动加密。
  加密属性的继承5. 扩展的存储介质支持，包括远程网络共享
secWall把实时加解密技术扩展到支持远程网络文件，可以在远程服务器的共享路径中使用实时加解密技术，远程服务器甚至可以是其他非Windows操作系统。如Unix或IBM小型机，甚至可以是未知的系统。只要可以以网上邻居的方式访问这些远程资源，就可以使用secWall的实时加解密技术。secWall将实时加解密技术扩展到网络支持极大提高了实时加解密技术在企业联网工作环境的实用性。网络支持技术也为企业内部涉密资料共享和涉密权限划分奠定了基础。 
6. 加密对象在传输过程中始终保持密文状态，杜绝网络窃听
secWall在网络上共享的加密文件在网络线上传输时总是保持密文状态。因此加密文件的共享是安全的。只有使用这个密文的客户机实时加解密引擎具备解码密文的条件（拥有解码密钥）才能解读这个共享加密文件。
  数据未加密时的网络拦截  数据加密时的网络窃听