【IT168专稿】很多时候为了保护自己的隐私或机密文件需要通过对文件加密来达到保护的目的。加密的目的就是在于证明用户身份,防止别人截取文件或内容。密码是实现秘密通讯的主要手段,是隐蔽语言、文字、图像的特种符号。凡是用特种符号按照通讯双方约定的方法把电文的原形隐蔽起来,不为第三者所识别的通讯方式称为密码通讯。
在保障信息安全各种功能特性的诸多技术中,密码技术是信息安全的核心和关键技术。通过数据加密技术,可以在一定程度上提高数据传输的安全性,保证传输数据的完整性。在数据加密系统中,密钥控制加密和解密过程,一个加密系统的全部安全性是基于密钥的,而不是基于算法,所以加密系统的密钥管理是一个非常重要的问题。
数据加密过程就是通过加密系统把原始的数字信息(明文),按照加密算法变换成与明文完全不同的数字信息(密文)的过程,如图1所示。

图1 数据加密流程
任何一个加密系统至少包括下面四个组成部分: 未加密的报文,也称明文; 加密后的报文,也称密文; 加密解密设备或算法; 加密解密的密钥。
数据加密技术主要分为数据传输加密和数据存储加密。数据传输加密技术主要是对传输中的数据流进行加密,常用的有:
1、链路加密
链路加密是指传输数据仅在物理层前的数据链路层进行加密,不考虑信源和信宿,它用于保护通信节点间的数据,接收方是传送路径上的各台节点机,信息在每台节点机内都要被解密和再加密,依次进行,直至到达目的地。
2 、节点加密
与链路加密类似的节点加密方法,是在节点处采用一个与节点机相连的密码装置,密文在该装置中被解密并被重新加密,明文不通过节点机,避免了链路加密节点处易受攻击的缺点。
3 、端到端加密
端到端加密是为数据从一端到另一端提供的加密方式。数据在发送端被加密,在接收端解密,中间节点处不以明文的形式出现。端到端加密是在应用层完成的。
在端到端加密中,除报头外的报文均以密文的形式贯穿于全部传输过程,只是在发送端和接收端才有加、解密设备,而在中间任何节点报文均不解密,因此,不需要有密码设备。端到端加密同链路加密相比,可减少密码设备的数量。
信息是由报头和报文组成的,报文为要传送的信息,报头为路由选择信息,由于网络传输中要涉及到路由选择,在链路加密时,报文和报头两者均须加密。而在端到端加密时,由于通道上的每一个中间节点虽不对报文解密,但为将报文传送到目的地,必须检查路由选择信息,因此,只能加密报文,而不能对报头进行加密。这样就容易被某些恶意肇事者分析发觉,并从中获取某些敏感信息。
链路加密对用户来说比较容易,使用的密钥较少,而端到端加密比较灵活,对用户可见。在对链路加密中各节点安全状况不放心的情况下也可使用端到端加密方式。
无论是在Linux还是Windows操作系统平台,商用或免费的加密软件非常多。但同时在Linux和Windows中,都能快速地、自由地实现加解密的开源软件就不多见。下面就介绍如何快速实现跨平台的文件加解密。本文介绍的工具WizCrypt是使用java语言编写的所以可以通过安装Java虚拟机跨平台使用。
1、什么是Java虚拟机
Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
2、为什么使用Java虚拟机?
Java语言最重要的特点就是可以在任何操作系统中运行。使用Java虚拟机就是为了支持与操作系统无关,在任何系统中都可以运行。
3、 Java虚拟机的基本原理
Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 微软公司出于竞争策略考虑,在Windows 中不捆绑JVM。在此我们提供java虚拟机下载。
4 、WizCrypt加密解密原理和流程

图2 WizCrypt加密的流程
1. 首先WizCrypt是基于命令行的,通过密码文件对原文件进行加密,使用md5加密算法。
2. 加密文件的前16位字节包括MD5的 hash值。
3. 然后利用用户输入新的密码进行RC4算法加密并且输出。
WizCrypt的解密的流程:
1. 用户提供的MD5的 hash值首先进行计算。
2. 把hash值和加密文件的前16位字节进行比对。
3. 如果两者相同,则进行解密;否则提示用户并且自动退出。
5 两个加密算法简介
Md5算法:
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。
请注意我使用了"字节串"而不是"字符串"这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。MD5将任意长度的"字节串"变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串。从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被"篡改"。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。
如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不"知道"用户的密码是什么。
RC4加密算法
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。 RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。
根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,RC2是一种以64位连续的比特数据为单位的分组密码,而RC4则是一种单位数据不定的流密码。
到此为止笔者介绍了数据加密技术下面我们将介绍WizCrypt加密在Linux 下和Windows下的实战。
1、 windows下安装JRE
如果客户端使用的是微软的Windows操作系统,在下载页面上:http://www.java.com/zh_CN/download/index.jsp 下载安装Java Runtime Environment Version 5.0,该软件包中已经包含了所有所需的软件。即名为:jre-1_5_0_06-windows-i586-p.exe的文件,下载以后,点击进行安装。安装过程非常简单笔者就不赘述了。需要说明的WizCrypt 对JRE的版本要求较高,至少要1.5 以上。
2 、Linux下安装JRE
这里比较麻烦,例如笔者使用的是最新的RHEL 5.0 以及Fedora Core 5 和Fedora Core 6。都已经内置了java 程序,但是版本偏低。需要重新安装。http://java.sun.com 下载自解压文件(jre-1_5_0_06-linux-i586.bin)保存到opt目录下。
chmod +x jre-1_5_0_06-linux-i586.bin
./jre-1_5_0_06-linux-i586.bin
……安装过程省略
设置环境变量
对于PATH和HOME等环境变量大家都不陌生。除此之外,还有下面一些常见环境变量。
◆ HISTSIZE是指保存历史命令记录的条数。
◆ LOGNAME是指当前用户的登录名。
◆ HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
◆ SHELL是指当前用户用的是哪种Shell。
◆ LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
◆ MAIL是指当前用户的邮件存放目录。
◆ PS1是基本提示符,对于root用户是#,对于普通用户是$。除了这些常见的环境变量,许多应用程序在安装时也会增加一些环境变量,比如使用Java就要设置JAVA_HOME和CLASSPATH等,方法如下:gedit /etc/profile.d/java.sh
此时会打开一个编辑器插入以下内容到新文件,如图3 。
#!/bin/sh
JAVA_HOME=/usr/java/jre1.5.0_06
export JAVA_HOME
JAVA_BIN=$JAVA_HOME/bin
CLASSPATH=$CLASSPATH:$JAVA_HOME:$JAVA_HOME/lib
PATH=$JAVA_BIN:$PATH
export JAVA_BIN CLASSPATH PATH

图3 设置环境变量
保存编辑过的文件。运行如下代码:
source /etc/profile.d/java.sh
/usr/sbin/alternatives --install /usr/bin/java java /opt/jre1.5.0_06/bin/java 2
/usr/sbin/alternatives --config java
您会见到下面的显示如图4 。

图4 选择java版本
这里可以看到有两个java版本,我们选择2 即jre 1.5 。
测试一下:
首先运行java -version 命令,
您应该会看到一些有关java版本的信息类似如下内容:
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)
如图5 。

图5 测试java版本信息
也可以访问sun的Web 站点运行此测试小应用程序:
http://www.java.com/zh_CN/download/help/testvm.xml
如果您可以看到鸭子徽标图像的动画,则表示已成功安装并配置了JRE。
1、 选择相应的WizCrypt版本
WizCrypt主页提供了许多版本的WizCrypt程序。首先必须根据自己的JRE环境下载相应的文件。JRE 1.5 系列可以使用 1.0 和1.1 。JRE 1.6 系列可以使用 2.0和2.2 。下载网站:http://wizcrypt.wiztools.org/download.html
#wget http://download.berlios.de/wizcrypt/wizcrypt-1.1-jar-with-dependencies.jar
说明:这里笔者使用的是jar格式的数据包。JAR(Java存档文件)是一种与平台无关的文件格式,它是将许多文件合并成一个文件。在只有HTTP(超文本传输协议)的信息处理中,可先将多个Java applet小程序及其必需组件(类文件、图像、声音及其它资源)捆绑到一个JAR文件中,然后再依次下载到浏览器上。
该格式还支持文件压缩和数字签名功能。一个 JAR 文件可以用于:用于发布和使用类库 、作为应用程序和扩展的构建单元 、作为组件、applet 或者插件程序的部署单位 、用于打包与组件相关联的辅助资源。
2 、了解WizCrypt命令行参数
WizCrypt是一个命令行工具,它的格式非常简单。使用命令
java -jar Wizcrypt-1.1-jar-with-dependencies.jar
即可查看参数,如图 6 。

图6 WizCrypt 参数
WizCrypt 参数包括:
-d :进行解密操作。
-e :进行加密操作。
-p :输入密码。
-h: :显示帮助信息。
3、 Linux下应用实例
我们看一个实例,tmp目录下有一个txt文件。只要使用命令即可进行加密。
java -jar Wizcrypt-1.1-jar-with-dependencies.jar -e -p goodcjh 1.txt
说明:其中goodcjh 即密码,1.txt 会被文件1.txt.wiz代替。
使用命令进行解密。
java -jar Wizcrypt-1.1-jar-with-dependencies.jar -d -p goodcjh 1.txt.wiz
说明:1.txt.wiz 会被文件1.txt代替。
图7 是加密和解密操作的截图。

图7 加密和解密操作的截图
4 、在Winodws下的操作完全相同
例如c盘下有一个jpeg文件。只要使用命令即可进行加密。
java -jar Wizcrypt-1.1-jar-with-dependencies.jar -e -p goodcjh 7.jpg
解密命令:
java -jar Wizcrypt-1.1-jar-with-dependencies.jar -d -p goodcjh 7.jpg.wiz
图8 是加密和解密操作的截图

图8 Windows平台加密和解密操作的截图
说明:文件在Winodws下的Linux下的传递可以提供SSH安全工具进行完成。常用的SSH客户端软件包括putty和winscp 。
5 、了解一下WizCrypt出错信息
使用WizCrypt会出现一些常见错误信息,如表-1 。
表-1 WizCrypt出错信息

总结:到此为止笔者介绍了数据加密技术和WizCrypt加密在Linux 下和Windows下的跨平台实战。