基于Java的DES加密算法是如何实现的,今天我就给大家介绍一下。

一、DES加密算法

DES( Data Encryption Standard),是一种常见的对称加密算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。DES加密算法已经被应用于许多需要安全加密的场合。(如:UNIX的加密算法就是以DES加密算法为基础的)

目前在国内,随着金卡工程的应用,DES加密算法在POS、ATM、磁卡及智能卡(IC卡)、加油站,高速公路收费站等领域被广泛应用,以此来实现关键效据的保密,如信用卡持管人的PIN的加密传输,IC
卡与Pos间的双向认证、金融交易数据包的MAC校验等,均用到DES加密算法。

IPSec协议组中的FSP (IP Encapsulating Security Payload,封装安全载荷)要求强制实现的加密算法就是DES。

DES加密算法的入口参数有3个:Key,Data,Mode。其中Key为8个字节共64位,是DES加密算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加
密或解密。

DES加密算法具有极高安全性,到目前为止,除了用穷举搜索法对DES加密算法进行攻击外,还没有发现更有效的办法,同时,通过定期在通信网络的接收方和发送方同时改用新的Key,便能更进一步提高
数据的保密性,这正是现在网络中使用DES加密算法的的流行做法。

二、基于Java的DES加密算法

Java是Sun公司开发的一种面向对象的编程语言,并且由于它的平台无关性被大量应用于Internet的开发,在Java中实现数据的加密/解密,是使用其内置的JCE(Java加密扩展)来实现的。

JCE最初是在在Java SDK 1.1中提供,现在已经成为Java SDK1.4的核心组成部分。JCE基本上是一组提供加密框架的实现、密钥生成以及消息认证代码(MAC)算法的Java包,在Java环境中使用JCE中实现数据传输过程中的加密/解密需要以下3个步骤:安装并且正确配置Java安全供应者(如SunjCE)、创建密钥/密码、对数据进行加密/解密。

1、安装并且正确配置Java安全供应者

JDK 1.1引入了安全供应者(简称为“供应者”)的概念,它是一个(或一组)包,用于提供JDK安全API的密码子集的具体实现。

要使用密码功能的程序,可以只请求一个实现特殊服务(例如DES加密算法)的特殊型态对像(例如Signature对象),并从已安装的某个供应者那里获得该对象的实现方法。

每次安装JDK都将安装一个或多个供应者包,用户可能会使用不同的供应者配置自己的运行时环境,并为它们指定一个优先级。

Sun版本的Java运行时环境都带有一个名为“SUN”的预设标准供应者(即SunjCE)。用户可以静态或动态地安装供应者。

*静态安装 

在使用或安装JCE之前,要首先从Sun的网站获取相关的Java库。JCE包含了Sun的安全供应者SunjCE,为了在默认供应者列表中静态添加SunjCE,需要编辑以下安全属性文件:

* <java - home > \jre \lib \security\java. security(Win32);

* <java - hc)me >/jre/lib/security/java. security(UNIX)。

例如,在基于Windows计算机的C:\jdk文件夹下面安装了JDK,那么需要编辑如下文件:

C:\jdk\jre\lib\securit中添加以下代码以完成Suny\java.security并在其JCE的静态装载:

security. provider. n = com~ sun. crypto.provider. SunjCE

例如,名为“SUN”的安全供应者在sun.security.provider包中名为DES的类中实现了加密算法,其提供者的子类通过如下方法将DES类加进去:

put("Signature. DES",sun. security.provider."DES")

*动态安装

在实际应用中,更多的时候是在需要时才动态安装JCE的,为了在运行时动态装载供应者,首先要保证在JVM中可以提供JCE,然后使用下面的代码来完成JCE的动态安装,以便使用Java安全供应者:

import java. security. Security;

public cjass DynamicProvider

{

public static void rnain(String[]args)

{

Security. addProvider (new com. sun.crypto. provider. SunjCE ()) ;

}

}

2、创建密钥

安装完JCE中的Java安全供应者之后,下一步就是要使用JCE的API来产生相应加密算法的密钥/密码。JCE API由很多类和接口组成,它们具有若干种算法和安全特性,要在Java中使用对称算法数据加密标准DES(Data Encryption Standard)来完成密钥/密码的创建的任务。

首先要通过调用KeyGenerator类的静态方法getlnstance获得KeyGenerator的一个实例,并同时在参数中指明使用DES加密算法:

KeyGenerator deskg ;

KeyGenerator.getlnstance ("DES");

获得了KeyGenerator之后就可以调用gener-ateKey方法得到密钥:

Key deskey -deskg. generateKey();

然后通过调用Cipher类的静态方法getlnstance,采用和生成密钥相同的方式生成一个密码(该方法的参数同KeyGenerator完全一样):

Cipher descipher = Cipher. getlnstance("DES");

3、对数据进行加密/解密

DES加密算法是在字节级别上进行的,所以数据的各个方面一个不落全都会被加密.一旦获得了密钥和密码,就可以对数据进行安全操作了。值得注意的是密钥和密码必须采用同类算法,数据的加密/解密是使用Cipher对象完成的。

*加密过程

首先调用Cipher对象的init方法,在参数中指明采用加密模式并同时给出密钥;

cipher, init(Cipber. ENCRYPT_ MODE,deskey);

加密数据的最简单办法就是调用Cipher对象的doFinal方法,同时传递字节数组:

byte[]desdata;"This a DES examplecode.".getBytes();

byte[]desresult =cipher. doFinal(desdata);

此时,desresult数组中包含传递数据的加密形式。

*解密过程

对同一数据解密也很容易,但在解密之前,我们必须重新初始化Cipher对象以便其准备解密:

descipher. init (Cipher. DECRYPT_ MODE,deskey);

然后同样使用doFinal方法进行解密:

byte[]desoriginal=descipher. doFinal(desresult);

现在desoriginal应该和desdata.完全相同。

三、程序实现流程

下面的程序给出完整的数据文件加密的过程:

基于Java的DES加密算法

前面我们已经讨论了如何以静态和动态方式安装JCE,以及采用对称加密算法DES对简单消息的加密和懈密具体实现,并给出程序实现的流程图,在实际应用中,我们可以使用Java开发工具包(JDK)中内置的对Socket通信的支持,通过JCE中的Java流和链表,加密基于Socket的网络通信,我们知道,加密/解密是数据传输中保证数据完整性的常用方法,Java语言因其平台无关性,在Internet上的应用非常之广泛,使用Java实现基于DES的数据加密传输可以在不同的平台上实现并具有实现简洁、安全性强等优点。

小知识之DES算法

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。