为了保证信息安全不受侵犯,可以采用多种技术,如加密技术、访问控制技术、认证技术以及安全审计技术等。但迄今为止,最重要的网络与通信自动化安全中工具是加密,而目前被广泛使用的两种加密形式是传统加密和公钥加密。那么我们今天就将两种加密形式相结合,在Java环境下看看如何使用AES和RSA加密算法对数据进行加密和解密。

一、数据加密技术概述

加密是从明文到密文的变换过程。计算机上数据文件加密、解密变换是由密钥控制实现的。根据加、解密过程使用的密钥是否相同,可将现代密码技术分为对称加密算法和公钥加密算法两类。对称加密算法中,加、解密使用的密钥相同,加、解密速度快,算法简便高效,密钥简短,但其安全性完全依赖于密钥。而密钥管理是对称密码的一个严重瓶颈。在公钥加密算法中,加、解密使用不同的密钥,几乎不可能从一个密钥推导出另一个密钥,它适应于网络开放性要求,密钥管理简单,但算法复杂,加、解密效率低。

目前常用的对称加密技术有DES、3DES和AES。DES是旧的加密标准,它的密匙长度为56位,加密强度较低已被认为不是安全的加密技术。3DES是对DES的改进,对明文用一个不同的DES密匙进行DES加密、解密和再加密,这样可以提高加密强度。AES是新的加密标准,它是DES的替代者,它的密钥长度有128、192和256三种,目前还没有被人攻破。目前使用的非对称加密技术主要有RSA和ECC,其中1024位的RSA是目前使用最为广泛的非对称加密技术。下面我们将在Java平台下将AES与RSA相结合对网络通信中数据进行混合加密。

二、Java中的数据加密类

由于Java一开始就是面向网络应用的,它十分重视数据的安全性,在JDK1.1中就已支持DES加密技术,在JDK1.5中支持DES、3DES、AES等对称加密技术,在非对称加密技术方面支持RSA技术,在Java还可以安装其它公司的加密包,使用“SunJCF”所不支持的其它加密算法,因此Java在电子商务中得到了广泛的应用。Java中的与数据加密相关的类与方法主要有:

1)KeyGenerator类用于获得各类对称加密技术的密钥,主要方法有:

getlnstance(“加密算法字符串”),用于设置要获得的密钥的加密算法init()化对称加密的密匙对象;

generateKey(),从对称加密的密钥对象中取得密钥;

2)KeyPairGenerator类用于获得非对称加密技术的密钥。主要方法有:

getInstance(“非对称加密算法字符串”),用于设置要获得的密钥的加密算法;

initialize(“密钥长度”),用于初始化非对称加密的密钥对象;

generateKeyPair(),返回非对称加密密钥对;

getPublic(),从非对称密钥对中取得公钥;

getPrivate(),从非对称密钥组中用于取得私钥;

3)Cipher类是Java加密的主要类,用于按一定的算法对数据进行加密、解密、包装和返包装。主要方法有:

getlnstance(“加密算法字符串”),用于设置要使用的加密算法;

Init(“类型”,密钥),按提供的类型和密匙初始化加密对象;

getBLockSize(),用于返回加密算法的输入分组长度;

getOutputSize(),用于返回加密算法的输出分组长度;

update(inBytes,blockSize,outBytes),对inBytes进行加密或解密处理,并将处理结果输出到outBytes中;

doFinal(),对要不足分组长度的数据进行填充处理;

三、基于RSA与AES的混合加密方案

1、混合加密通信模型

我们设计的混合加密方案利用公钥加密(RSA)传输对称加密密钥,用对称密码(AES)进行数据通信,本方案综合对称加密的加密快和公钥加密密钥分发简单的优点,解决了通信中的效率和安全问题。本混合加密方案的通信过程可分为公钥加密传输对称密钥和对称加密传输数据两个阶段。基于混合加密的安全通信模型如图1所示。

混合加密技术在网络通信安全中的应用

 

混合加密通信流程

1)公钥加密传输对称密钥K。公钥加密传输对称密钥的通信流程如下:

第一步,发送方和接收方分别在本地生成自己的密钥对(公钥PK和私钥SK),安全保存SK,公开发布PK;

第二步,通过检索公钥目录,发送方获得接收方的PK;

第三步,发送方生成对称密钥K;

第四步,发送方用接收方的PK加密K得到C,将C发给接收方;

第五步,接收方用自己SK解密C,获得密钥K。

这样,收发双方拥有共享密钥K,安全地完成了密钥的分发。

2)对称加密进行数据通信。收发双方利用共享密钥K进行数据通信的流程如下:

第一步,发送方用K加密消息P得到密文C;

第二步,发送方将C发送给接收方;

第三步,接收方用K解密C获得消息P,即可获得消息原文,从而实现数据的保密通信。

当一个密钥K被安全分发后,在安全期内,混合加密系统利用密钥K进行对称密码通信。当由于K被泄露或过了K的有效期需要更换密钥时,才再次利用公钥密码分发新的密钥K。

四、混合加密方案的Java实现

1、使用公钥加密分发对称密钥加密的实现

方案中采用RSA分发对称密钥,公钥密码分发对称密钥的实现过程如下:

1)公钥(RSA)密钥对的生成。实现代码为:

KeyPairGeneratorkeyGen=KeyPairGenerator.getlnstance(“RSA”);

//创建密钥对生成器,指定RSA加密算法

SecureRandomrandom=newSecureRandom();

//生成随机数keyGen.initialize(1024,random);

//初始化密钥生成器KeyPairkeyPair=keyGen.generateKeyPair0;

//生成密钥对SecretKeyprk=keyPair.generateKey();

//获得私钥PublicKeypbk=keyPair.readObject();

//获得公钥

2)创建对称密钥。实现代码为:

//读取自己的公钥和私钥

FilelnputStreamfis=newFileInputStream(args[0]);

ObjectInputStreamobj=newFileObjectlnputStream(fis);

PublicKeypbk=(PublicKey)obj.readObject();

FilelnputStreamf=newFileInputStream(args[1]);

ObjectlnputStreamob=newObjectlnputStream(f);

PrivateKeyprk=(PrivateKey)ob.readObject();

KeyAgreementka=KeyAgreement.getlnstance(“RSA”);

//创建密钥协定对象ka.init(prk);

//初始化密钥协定对象Ka.doPhase(pbk,true);

//执行密钥协定byte[]b=ka.generateSecret();

//生成密钥

3、对称密钥加密进行数据通信的实现

利用公钥密钥加密传输的对称密钥就可进行保密通信。对称加密通信的具体流程如下:

Cipercp=Ciper.getInstance(“AES”);

//创建密钥器

Cp.inti(Ciper.ENCRYPT_MODE,dd.aesKey());

//初始化密钥器

FileInputStreamsin=newFileInputStream(args[0]);

//获取待加密数据

FileOutputStreamfos=newFileOutputStream(args[1]);

CiperOutputStreamcout=newCiperOutputStream(fos,cp);

//创建加密输出流While(((b=in.read())!=-1){cout.write(b);

}

//写输出流

五、系统测试与分析

本加密方案使用公钥加密来实现对称密钥的交换,使用对称加密来加密通信数据,既有对称加密系统的处理速度,又解决了对称加密系统中密钥交换的难题,从而兼顾了通信中的效率和安全问题,且在Java平台上实现该方案,使本加密方案具有与平台无关性、安全、方便的特点。但本方案只能解决网络通信中数据的保密性问题,对于数据完整性与不可否认性,还需要采用数字签名、数字摘要等方案来解决。

网络安全是保障网络应用的基础,经过对各种加密方法的分析,本文提出了一套混合数据加密方法,来保证网络中通信信息的安全。事实上,网络安全是一个综合性的课题,需要各个方面的努力,以及安全技术的不断进步。相信在不久的将来,网络信息安全的地位将更加重要,网络信息安全必然随着网络应用的发展而不断发展。

小知识之JDK

JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。