基于Java的DES加密算法

基于Java的DES加密算法是如何實現(xiàn)的,今天我就給大家介紹一下。

一、DES加密算法

DES( Data Encryption Standard),是一種常見的對稱加密算法,于1977年得到美國政府的正式許可,是一種用56位密鑰來加密64位數(shù)據(jù)的方法。DES加密算法已經(jīng)被應(yīng)用于許多需要安全加密的場合。(如:UNIX的加密算法就是以DES加密算法為基礎(chǔ)的)

目前在國內(nèi),隨著金卡工程的應(yīng)用,DES加密算法在POS、ATM、磁卡及智能卡(IC卡)、加油站,高速公路收費站等領(lǐng)域被廣泛應(yīng)用,以此來實現(xiàn)關(guān)鍵效據(jù)的保密,如信用卡持管人的PIN的加密傳輸,IC
卡與Pos間的雙向認(rèn)證、金融交易數(shù)據(jù)包的MAC校驗等,均用到DES加密算法。

IPSec協(xié)議組中的FSP (IP Encapsulating Security Payload,封裝安全載荷)要求強(qiáng)制實現(xiàn)的加密算法就是DES。

DES加密算法的入口參數(shù)有3個:Key,Data,Mode。其中Key為8個字節(jié)共64位,是DES加密算法的工作密鑰;Data也為8個字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加
密或解密。

DES加密算法具有極高安全性,到目前為止,除了用窮舉搜索法對DES加密算法進(jìn)行攻擊外,還沒有發(fā)現(xiàn)更有效的辦法,同時,通過定期在通信網(wǎng)絡(luò)的接收方和發(fā)送方同時改用新的Key,便能更進(jìn)一步提高
數(shù)據(jù)的保密性,這正是現(xiàn)在網(wǎng)絡(luò)中使用DES加密算法的的流行做法。

二、基于Java的DES加密算法

Java是Sun公司開發(fā)的一種面向?qū)ο蟮木幊陶Z言,并且由于它的平臺無關(guān)性被大量應(yīng)用于Internet的開發(fā),在Java中實現(xiàn)數(shù)據(jù)的加密/解密,是使用其內(nèi)置的JCE(Java加密擴(kuò)展)來實現(xiàn)的。

JCE最初是在在Java SDK 1.1中提供,現(xiàn)在已經(jīng)成為Java SDK1.4的核心組成部分。JCE基本上是一組提供加密框架的實現(xiàn)、密鑰生成以及消息認(rèn)證代碼(MAC)算法的Java包,在Java環(huán)境中使用JCE中實現(xiàn)數(shù)據(jù)傳輸過程中的加密/解密需要以下3個步驟:安裝并且正確配置Java安全供應(yīng)者(如SunjCE)、創(chuàng)建密鑰/密碼、對數(shù)據(jù)進(jìn)行加密/解密。

1、安裝并且正確配置Java安全供應(yīng)者

JDK 1.1引入了安全供應(yīng)者(簡稱為“供應(yīng)者”)的概念,它是一個(或一組)包,用于提供JDK安全API的密碼子集的具體實現(xiàn)。

要使用密碼功能的程序,可以只請求一個實現(xiàn)特殊服務(wù)(例如DES加密算法)的特殊型態(tài)對像(例如Signature對象),并從已安裝的某個供應(yīng)者那里獲得該對象的實現(xiàn)方法。

每次安裝JDK都將安裝一個或多個供應(yīng)者包,用戶可能會使用不同的供應(yīng)者配置自己的運行時環(huán)境,并為它們指定一個優(yōu)先級。

Sun版本的Java運行時環(huán)境都帶有一個名為“SUN”的預(yù)設(shè)標(biāo)準(zhǔn)供應(yīng)者(即SunjCE)。用戶可以靜態(tài)或動態(tài)地安裝供應(yīng)者。

*靜態(tài)安裝?

在使用或安裝JCE之前,要首先從Sun的網(wǎng)站獲取相關(guān)的Java庫。JCE包含了Sun的安全供應(yīng)者SunjCE,為了在默認(rèn)供應(yīng)者列表中靜態(tài)添加SunjCE,需要編輯以下安全屬性文件:

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

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

例如,在基于Windows計算機(jī)的C:\jdk文件夾下面安裝了JDK,那么需要編輯如下文件:

C:\jdk\jre\lib\securit中添加以下代碼以完成Suny\java.security并在其JCE的靜態(tài)裝載:

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

例如,名為“SUN”的安全供應(yīng)者在sun.security.provider包中名為DES的類中實現(xiàn)了加密算法,其提供者的子類通過如下方法將DES類加進(jìn)去:

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

*動態(tài)安裝

在實際應(yīng)用中,更多的時候是在需要時才動態(tài)安裝JCE的,為了在運行時動態(tài)裝載供應(yīng)者,首先要保證在JVM中可以提供JCE,然后使用下面的代碼來完成JCE的動態(tài)安裝,以便使用Java安全供應(yīng)者:

import java. security. Security;

public cjass DynamicProvider

{

public static void rnain(String[]args)

{

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

}

}

2、創(chuàng)建密鑰

安裝完JCE中的Java安全供應(yīng)者之后,下一步就是要使用JCE的API來產(chǎn)生相應(yīng)加密算法的密鑰/密碼。JCE API由很多類和接口組成,它們具有若干種算法和安全特性,要在Java中使用對稱算法數(shù)據(jù)加密標(biāo)準(zhǔn)DES(Data Encryption Standard)來完成密鑰/密碼的創(chuàng)建的任務(wù)。

首先要通過調(diào)用KeyGenerator類的靜態(tài)方法getlnstance獲得KeyGenerator的一個實例,并同時在參數(shù)中指明使用DES加密算法:

KeyGenerator deskg ;

KeyGenerator.getlnstance ("DES");

獲得了KeyGenerator之后就可以調(diào)用gener-ateKey方法得到密鑰:

Key deskey -deskg. generateKey();

然后通過調(diào)用Cipher類的靜態(tài)方法getlnstance,采用和生成密鑰相同的方式生成一個密碼(該方法的參數(shù)同KeyGenerator完全一樣):

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

3、對數(shù)據(jù)進(jìn)行加密/解密

DES加密算法是在字節(jié)級別上進(jìn)行的,所以數(shù)據(jù)的各個方面一個不落全都會被加密.一旦獲得了密鑰和密碼,就可以對數(shù)據(jù)進(jìn)行安全操作了。值得注意的是密鑰和密碼必須采用同類算法,數(shù)據(jù)的加密/解密是使用Cipher對象完成的。

*加密過程

首先調(diào)用Cipher對象的init方法,在參數(shù)中指明采用加密模式并同時給出密鑰;

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

加密數(shù)據(jù)的最簡單辦法就是調(diào)用Cipher對象的doFinal方法,同時傳遞字節(jié)數(shù)組:

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

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

此時,desresult數(shù)組中包含傳遞數(shù)據(jù)的加密形式。

*解密過程

對同一數(shù)據(jù)解密也很容易,但在解密之前,我們必須重新初始化Cipher對象以便其準(zhǔn)備解密:

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

然后同樣使用doFinal方法進(jìn)行解密:

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

現(xiàn)在desoriginal應(yīng)該和desdata.完全相同。

三、程序?qū)崿F(xiàn)流程

下面的程序給出完整的數(shù)據(jù)文件加密的過程:

基于Java的DES加密算法

前面我們已經(jīng)討論了如何以靜態(tài)和動態(tài)方式安裝JCE,以及采用對稱加密算法DES對簡單消息的加密和懈密具體實現(xiàn),并給出程序?qū)崿F(xiàn)的流程圖,在實際應(yīng)用中,我們可以使用Java開發(fā)工具包(JDK)中內(nèi)置的對Socket通信的支持,通過JCE中的Java流和鏈表,加密基于Socket的網(wǎng)絡(luò)通信,我們知道,加密/解密是數(shù)據(jù)傳輸中保證數(shù)據(jù)完整性的常用方法,Java語言因其平臺無關(guān)性,在Internet上的應(yīng)用非常之廣泛,使用Java實現(xiàn)基于DES的數(shù)據(jù)加密傳輸可以在不同的平臺上實現(xiàn)并具有實現(xiàn)簡潔、安全性強(qiáng)等優(yōu)點。

小知識之DES算法

DES算法為密碼體制中的對稱密碼體制,又被稱為美國數(shù)據(jù)加密標(biāo)準(zhǔn),是1972年美國IBM公司研制的對稱密碼體制加密算法。 明文按64位進(jìn)行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位, 使得每個密鑰都有奇數(shù)個1)分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。