混合加密技術(shù)在網(wǎng)絡(luò)通信安全中的應(yīng)用

為了保證信息安全不受侵犯,可以采用多種技術(shù),如加密技術(shù)、訪問控制技術(shù)、認(rèn)證技術(shù)以及安全審計(jì)技術(shù)等。但迄今為止,最重要的網(wǎng)絡(luò)與通信自動(dòng)化安全中工具是加密,而目前被廣泛使用的兩種加密形式是傳統(tǒng)加密和公鑰加密。那么我們今天就將兩種加密形式相結(jié)合,在Java環(huán)境下看看如何使用AES和RSA加密算法對(duì)數(shù)據(jù)進(jìn)行加密和解密。

一、數(shù)據(jù)加密技術(shù)概述

加密是從明文到密文的變換過程。計(jì)算機(jī)上數(shù)據(jù)文件加密、解密變換是由密鑰控制實(shí)現(xiàn)的。根據(jù)加、解密過程使用的密鑰是否相同,可將現(xiàn)代密碼技術(shù)分為對(duì)稱加密算法和公鑰加密算法兩類。對(duì)稱加密算法中,加、解密使用的密鑰相同,加、解密速度快,算法簡(jiǎn)便高效,密鑰簡(jiǎn)短,但其安全性完全依賴于密鑰。而密鑰管理是對(duì)稱密碼的一個(gè)嚴(yán)重瓶頸。在公鑰加密算法中,加、解密使用不同的密鑰,幾乎不可能從一個(gè)密鑰推導(dǎo)出另一個(gè)密鑰,它適應(yīng)于網(wǎng)絡(luò)開放性要求,密鑰管理簡(jiǎn)單,但算法復(fù)雜,加、解密效率低。

目前常用的對(duì)稱加密技術(shù)有DES、3DES和AES。DES是舊的加密標(biāo)準(zhǔn),它的密匙長(zhǎng)度為56位,加密強(qiáng)度較低已被認(rèn)為不是安全的加密技術(shù)。3DES是對(duì)DES的改進(jìn),對(duì)明文用一個(gè)不同的DES密匙進(jìn)行DES加密、解密和再加密,這樣可以提高加密強(qiáng)度。AES是新的加密標(biāo)準(zhǔn),它是DES的替代者,它的密鑰長(zhǎng)度有128、192和256三種,目前還沒有被人攻破。目前使用的非對(duì)稱加密技術(shù)主要有RSA和ECC,其中1024位的RSA是目前使用最為廣泛的非對(duì)稱加密技術(shù)。下面我們將在Java平臺(tái)下將AES與RSA相結(jié)合對(duì)網(wǎng)絡(luò)通信中數(shù)據(jù)進(jìn)行混合加密。

二、Java中的數(shù)據(jù)加密類

由于Java一開始就是面向網(wǎng)絡(luò)應(yīng)用的,它十分重視數(shù)據(jù)的安全性,在JDK1.1中就已支持DES加密技術(shù),在JDK1.5中支持DES、3DES、AES等對(duì)稱加密技術(shù),在非對(duì)稱加密技術(shù)方面支持RSA技術(shù),在Java還可以安裝其它公司的加密包,使用“SunJCF”所不支持的其它加密算法,因此Java在電子商務(wù)中得到了廣泛的應(yīng)用。Java中的與數(shù)據(jù)加密相關(guān)的類與方法主要有:

1)KeyGenerator類用于獲得各類對(duì)稱加密技術(shù)的密鑰,主要方法有:

getlnstance(“加密算法字符串”),用于設(shè)置要獲得的密鑰的加密算法init()化對(duì)稱加密的密匙對(duì)象;

generateKey(),從對(duì)稱加密的密鑰對(duì)象中取得密鑰;

2)KeyPairGenerator類用于獲得非對(duì)稱加密技術(shù)的密鑰。主要方法有:

getInstance(“非對(duì)稱加密算法字符串”),用于設(shè)置要獲得的密鑰的加密算法;

initialize(“密鑰長(zhǎng)度”),用于初始化非對(duì)稱加密的密鑰對(duì)象;

generateKeyPair(),返回非對(duì)稱加密密鑰對(duì);

getPublic(),從非對(duì)稱密鑰對(duì)中取得公鑰;

getPrivate(),從非對(duì)稱密鑰組中用于取得私鑰;

3)Cipher類是Java加密的主要類,用于按一定的算法對(duì)數(shù)據(jù)進(jìn)行加密、解密、包裝和返包裝。主要方法有:

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

Init(“類型”,密鑰),按提供的類型和密匙初始化加密對(duì)象;

getBLockSize(),用于返回加密算法的輸入分組長(zhǎng)度;

getOutputSize(),用于返回加密算法的輸出分組長(zhǎng)度;

update(inBytes,blockSize,outBytes),對(duì)inBytes進(jìn)行加密或解密處理,并將處理結(jié)果輸出到outBytes中;

doFinal(),對(duì)要不足分組長(zhǎng)度的數(shù)據(jù)進(jìn)行填充處理;

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

1、混合加密通信模型

我們?cè)O(shè)計(jì)的混合加密方案利用公鑰加密(RSA)傳輸對(duì)稱加密密鑰,用對(duì)稱密碼(AES)進(jìn)行數(shù)據(jù)通信,本方案綜合對(duì)稱加密的加密快和公鑰加密密鑰分發(fā)簡(jiǎn)單的優(yōu)點(diǎn),解決了通信中的效率和安全問題。本混合加密方案的通信過程可分為公鑰加密傳輸對(duì)稱密鑰和對(duì)稱加密傳輸數(shù)據(jù)兩個(gè)階段?;诨旌霞用艿陌踩ㄐ拍P腿鐖D1所示。

混合加密技術(shù)在網(wǎng)絡(luò)通信安全中的應(yīng)用

 

混合加密通信流程

1)公鑰加密傳輸對(duì)稱密鑰K。公鑰加密傳輸對(duì)稱密鑰的通信流程如下:

第一步,發(fā)送方和接收方分別在本地生成自己的密鑰對(duì)(公鑰PK和私鑰SK),安全保存SK,公開發(fā)布PK;

第二步,通過檢索公鑰目錄,發(fā)送方獲得接收方的PK;

第三步,發(fā)送方生成對(duì)稱密鑰K;

第四步,發(fā)送方用接收方的PK加密K得到C,將C發(fā)給接收方;

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

這樣,收發(fā)雙方擁有共享密鑰K,安全地完成了密鑰的分發(fā)。

2)對(duì)稱加密進(jìn)行數(shù)據(jù)通信。收發(fā)雙方利用共享密鑰K進(jìn)行數(shù)據(jù)通信的流程如下:

第一步,發(fā)送方用K加密消息P得到密文C;

第二步,發(fā)送方將C發(fā)送給接收方;

第三步,接收方用K解密C獲得消息P,即可獲得消息原文,從而實(shí)現(xiàn)數(shù)據(jù)的保密通信。

當(dāng)一個(gè)密鑰K被安全分發(fā)后,在安全期內(nèi),混合加密系統(tǒng)利用密鑰K進(jìn)行對(duì)稱密碼通信。當(dāng)由于K被泄露或過了K的有效期需要更換密鑰時(shí),才再次利用公鑰密碼分發(fā)新的密鑰K。

四、混合加密方案的Java實(shí)現(xiàn)

1、使用公鑰加密分發(fā)對(duì)稱密鑰加密的實(shí)現(xiàn)

方案中采用RSA分發(fā)對(duì)稱密鑰,公鑰密碼分發(fā)對(duì)稱密鑰的實(shí)現(xiàn)過程如下:

1)公鑰(RSA)密鑰對(duì)的生成。實(shí)現(xiàn)代碼為:

KeyPairGeneratorkeyGen=KeyPairGenerator.getlnstance(“RSA”);

//創(chuàng)建密鑰對(duì)生成器,指定RSA加密算法

SecureRandomrandom=newSecureRandom();

//生成隨機(jī)數(shù)keyGen.initialize(1024,random);

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

//生成密鑰對(duì)SecretKeyprk=keyPair.generateKey();

//獲得私鑰PublicKeypbk=keyPair.readObject();

//獲得公鑰

2)創(chuàng)建對(duì)稱密鑰。實(shí)現(xiàn)代碼為:

//讀取自己的公鑰和私鑰

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”);

//創(chuàng)建密鑰協(xié)定對(duì)象ka.init(prk);

//初始化密鑰協(xié)定對(duì)象Ka.doPhase(pbk,true);

//執(zhí)行密鑰協(xié)定byte[]b=ka.generateSecret();

//生成密鑰

3、對(duì)稱密鑰加密進(jìn)行數(shù)據(jù)通信的實(shí)現(xiàn)

利用公鑰密鑰加密傳輸?shù)膶?duì)稱密鑰就可進(jìn)行保密通信。對(duì)稱加密通信的具體流程如下:

Cipercp=Ciper.getInstance(“AES”);

//創(chuàng)建密鑰器

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

//初始化密鑰器

FileInputStreamsin=newFileInputStream(args[0]);

//獲取待加密數(shù)據(jù)

FileOutputStreamfos=newFileOutputStream(args[1]);

CiperOutputStreamcout=newCiperOutputStream(fos,cp);

//創(chuàng)建加密輸出流While(((b=in.read())!=-1){cout.write(b);

}

//寫輸出流

五、系統(tǒng)測(cè)試與分析

本加密方案使用公鑰加密來實(shí)現(xiàn)對(duì)稱密鑰的交換,使用對(duì)稱加密來加密通信數(shù)據(jù),既有對(duì)稱加密系統(tǒng)的處理速度,又解決了對(duì)稱加密系統(tǒng)中密鑰交換的難題,從而兼顧了通信中的效率和安全問題,且在Java平臺(tái)上實(shí)現(xiàn)該方案,使本加密方案具有與平臺(tái)無關(guān)性、安全、方便的特點(diǎn)。但本方案只能解決網(wǎng)絡(luò)通信中數(shù)據(jù)的保密性問題,對(duì)于數(shù)據(jù)完整性與不可否認(rèn)性,還需要采用數(shù)字簽名、數(shù)字摘要等方案來解決。

網(wǎng)絡(luò)安全是保障網(wǎng)絡(luò)應(yīng)用的基礎(chǔ),經(jīng)過對(duì)各種加密方法的分析,本文提出了一套混合數(shù)據(jù)加密方法,來保證網(wǎng)絡(luò)中通信信息的安全。事實(shí)上,網(wǎng)絡(luò)安全是一個(gè)綜合性的課題,需要各個(gè)方面的努力,以及安全技術(shù)的不斷進(jìn)步。相信在不久的將來,網(wǎng)絡(luò)信息安全的地位將更加重要,網(wǎng)絡(luò)信息安全必然隨著網(wǎng)絡(luò)應(yīng)用的發(fā)展而不斷發(fā)展。

小知識(shí)之JDK

JDK(Java Development Kit)是Sun Microsystems針對(duì)Java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的Java SDK。JDK 是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境、Java工具和Java基礎(chǔ)類庫(kù)。JDK是學(xué)好Java的第一步。而專門運(yùn)行在x86平臺(tái)的Jrocket在服務(wù)端運(yùn)行效率也要比Sun JDK好很多。從SUN的JDK5.0開始,提供了泛型等非常實(shí)用的功能,其版本也不斷更新,運(yùn)行效率得到了非常大的提高。