摘要:JAVA通過“SunJCF”技術(shù)向開發(fā)者提供了先進的加密技術(shù),在J2EE電子商務(wù)應(yīng)用中運用這些技術(shù)可以大大提高系統(tǒng)的數(shù)據(jù)安全性。該文主要研究了“SunJCF”中提供的AES、RSA加密算法的具體實現(xiàn)方法,提出了在Java中綜合運用AES和RSA算法加密數(shù)據(jù)文件的方案,并給出了相應(yīng)的Java程序。
關(guān)鍵詞:JAVA;AES;RSA
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)14-20785-02
1 引言
由于Internet網(wǎng)絡(luò)協(xié)議本身存在著安全問題,網(wǎng)上信息傳輸存在著巨大的安全風(fēng)險,電子商務(wù)的安全問題越來越突出。加密技術(shù)是電子商務(wù)中最主要的安全技術(shù),加密方法的選取直接影響著電子商務(wù)活動中信息的安全程度。由于JAVA一開始就是面向網(wǎng)絡(luò)應(yīng)用的,它十分重視數(shù)據(jù)的安全性,在JDK1.1中就已支持DES加密技術(shù)。因此JAVA在電子商務(wù)中得到了廣泛的應(yīng)用。本文主要介紹在Java環(huán)境下使用AES和RSA加密算法對數(shù)據(jù)文件進行加密和解密。
2 JAVA中的數(shù)據(jù)加密技術(shù)
加密技術(shù)根據(jù)一般可以分為對稱加密技術(shù)和非對稱加密技術(shù)。對稱加密技術(shù)屬于傳統(tǒng)的加密技術(shù),它的加密和解密的密匙是相同的,它的優(yōu)點是:運算速度快,加密強度高,可以通過硬件方式來實現(xiàn),適合大批量數(shù)據(jù)的加密處理,它的缺點是:加密和解密由于使用相同的密匙,密匙的分發(fā)與保密比較困難,目前常用的對稱加密技術(shù)有DES、3DES和AES,DES是舊的加密標準,它的密匙長度為56位,加密強度較低,已被認為不是安全的加密技術(shù)。3DES是對DES的改進,對明文用三個不同的DES密匙進行DES加密、解密和再加密,這樣可以提高加密強度。AES是新的加密標準,它是DES的替代者,它的密匙長度有128、192和256三種,目前還沒有被人攻破。非對稱加密技術(shù)屬于現(xiàn)加密技術(shù),它的加密與解密的密匙是不相同的,一個是私匙,一個是公匙,它的特點是:加密強度比較小,加密的速度比較慢,常用于數(shù)字鑒名和加密密匙,目前使用的非對稱加密技術(shù)主要有RSA和ECC,其中1024位的RSA是目前使用最為廣泛的非對稱加密技術(shù)。
JAVA語言的安全性是十分出色的,在JAVA中通過“SunJCF”提供對各種加密技術(shù)的支持。在JAVA還可以安裝其它公司的加密包,使用“SunJCF”所不支持的其它加密算法。早在JDK1.1中就已支持DES數(shù)據(jù)加密技術(shù),在JDK1.5中支持DES、3DES、AES等對稱加密技術(shù),在非對稱加密技術(shù)方面支持RSA技術(shù)。
3 JAVA中的數(shù)據(jù)加密類
(1)KeyGenerator類用于獲得各類對稱加密技術(shù)的密匙,主要的方法有:
getInstance(\"加密算法字符串\"),用于設(shè)置要獲得的密匙的加密算法;
init(),用于初始化對稱加密的密匙對象;
generateKey(),從對稱加密的密匙對象中取得密匙。
(2)KeyPairGenerator類用于獲得非對稱加密技術(shù)的密匙,主要的方法有:
etInstance(\"非對稱加密算法字符串\"),用于設(shè)置要獲得的密匙的加密算法;
initialize(密匙長度),用于初始化非對稱加密的密匙對象;
generateKeyPair(),返回非對稱密匙組對象;
getPublic(),從非對稱密匙組中取得公匙;
getPrivate(),從非對稱密匙組中用于取得私匙。
(3)Cipher類是JAVA加密的主要類,用于按一定的算法對數(shù)據(jù)進行加密、解密、包裝和返包裝。主要的方法有:
getInstance(\"加密算法字符串\"),用于設(shè)置要使用的加密算法;
Init(\"類型\",密匙),按提供的類型和密匙初始化加密對象;
getBLockSize(),用于返回加密算法的輸入分組長度;
getOutputSize(),用于返回加密算法的輸出分組長度;
update(inBytes,blockSize,outBytes),對inBytes進行加密或解密處理,并將處理結(jié)果輸出到outBytes中;
doFinal(),對要不足分組長度的數(shù)據(jù)進行填充處理。
4 AVA中實現(xiàn)AES和RSA相結(jié)合的數(shù)據(jù)加解密
(1)根據(jù)前面有關(guān)對稱加密技術(shù)和非對稱加密技術(shù)的分析,在電子應(yīng)用于一般采用對稱加密技術(shù)和非對稱加密技術(shù)相結(jié)合的方法。在下面的例子中利用AES(對稱加密技術(shù))加密數(shù)據(jù)文件,利用RSA(非對稱加密技術(shù))加密AES加密密匙,這樣即可以提高加密的速度,又可以解決AES密匙自身的安全性。由于數(shù)據(jù)文件進行了加密因此可以通過普通的電子郵件系統(tǒng)完成加密文件的傳輸。AES和RSA相結(jié)合的數(shù)據(jù)文件加解密過程如下:
①接受方:生成1024位的RSA密匙對,然后通過電子郵件向發(fā)送方發(fā)送自己的公匙數(shù)據(jù)。
②發(fā)送方:第一步通過電子郵件取得接受方的RSA公匙數(shù)據(jù);第二步隨機生成AES密匙;第三步用獲得的RSA公匙和RSA加密算法加密AES密匙并將加密后的AES密匙寫入數(shù)據(jù)文件的頭部;第四步用AES密匙和AES加密算法加密數(shù)據(jù),并將加密后的數(shù)據(jù)寫出入數(shù)據(jù)文件的尾部;最后通過電子郵件,以附件的形式將數(shù)據(jù)文件發(fā)送給接收方。
③接收方:第一步從接受到的郵件的附件中讀取加密后的AES密匙;第二步用自己的私匙和RAS算法解密AES密匙;第三步接著從接受到的郵件的附件中讀取加密數(shù)據(jù),用解密后的AES密匙和ASE算法解密加密數(shù)據(jù),并將解密后的數(shù)據(jù)寫入數(shù)據(jù)文件。
(2)在JAVA中實現(xiàn)上述AES和RSA算法相結(jié)合的數(shù)據(jù)加解密過程是十分容易的,具體源程序如下:
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public classAes_Rsa_ Encrypt
{public static void main(String[] args)
{try
{if(args[0].equals(\"-g\")) //生成RSA密匙對
{KeyPairGenerator keyGen = KeyPairGenerator.getInstance(\"RSA\");
SecureRandom random=new SecureRandom();
keyGen.initialize(1024,random);
KeyPair keypair = keyGen.generateKeyPair();
ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream (\"pub_key\"));
out.writeObject(keypair.getPublic());
out.close();
out =new ObjectOutputStream(new FileOutputStream(\"pri_key\"));
out.writeObject(keypair.getPrivate());
out.close();}
else if(args[0].equals(\"-e\"))//對指定的數(shù)據(jù)文件進行加密處理
{KeyGenerator keyGen = KeyGenerator.getInstance(\"AES\");
keyGen.init(128);
SecretKey key=keyGen.generateKey();
ObjectInputStream keyIn =new ObjectInputStream(new FileInputStream (\"pub_key\"));
Key publicKey=(Key)keyIn.readObject();
keyIn.close();Cipher cipher=Cipher.getInstance(\"RSA\");
cipher.init(Cipher.WRAP_MODE,publicKey);
byte[] wrappedKey=cipher.wrap(key);
DataOutputStream out=new DataOutputStream(new FileOutputStream(args[2]));
out.writeInt(wrappedKey.length);
out.write(wrappedKey);
InputStream in=new FileInputStream(args[1]);
cipher=Cipher.getInstance(\"AES\");
cipher.init(Cipher.ENCRYPT_MODE,key);
crypt(in,out,cipher);
in.close();
out.close();}
else if(args[0].equals(\"-d\"))//對指定的加密文件進行解密處理
{DataInputStream in=new DataInputStream(new FileInputStream(args[1]));
int length=in.readInt();
byte[] wrappedKey=new byte[length];
in.read(wrappedKey,0,length);
ObjectInputStream keyIn =new ObjectInputStream(new FileInputStream (\"pri_key\"));
Key privateKey=(Key)keyIn.readObject();
keyIn.close();
Cipher cipher=Cipher.getInstance(\"RSA\");
cipher.init(Cipher.UNWRAP_MODE,privateKey);
Key key=cipher.unwrap(wrappedKey,\"AES\",cipher.SECRET_KEY);
OutputStream out=new FileOutputStream(args[2]);
cipher=Cipher.getInstance(\"AES\");
cipher.init(Cipher.DECRYPT_MODE,key);
crypt(in,out,cipher);
in.close();
out.close();}}
catch (IOException exception)
{exception.printStackTrace();}
catch (GeneralSecurityException exception)
{ exception.printStackTrace(); }
catch (ClassNotFoundException exception)
{exception.printStackTrace();}}
public static void crypt(InputStream in,OutputStream out,Cipher cipher) throws IOException,GeneralSecurityException//自己定義的加密函數(shù)
{int blockSize=cipher.getBlockSize();
int outputSize=cipher.getOutputSize(blockSize);
byte[] inBytes=new byte[blockSize];
byte[] outBytes=new byte[outputSize];
int inLength=0;
boolean more=true;
while(more)
{inLength=in.read(inBytes);
if(inLength==blockSize)
{int outLength=cipher.update(inBytes,0,blockSize,outBytes);
out.write(outBytes,0,outLength);}
else
{more=1;}}
if(inLength>0)
outBytes=cipher.doFinal(inBytes,0,inLength);
else
outBytes=cipher.doFinal();
out.write(outBytes);}
public static final int KEYSIZE=1024;}
本程序可以完成RSA密匙的生成、數(shù)據(jù)加密和數(shù)據(jù)解密。運行前用javac進行對Aes_Rsa_ Encrypt.java文件進行編譯,然后按如下方法執(zhí)行:
(1) 生成RSA算法的私匙文件(文件名為pri_key)和公匙文件(文件名為pub_key)
java Aes_Rsa_Encrypt -g keyfile
(2) 對指定的數(shù)據(jù)文件中的內(nèi)容進行加密,并將結(jié)果寫出入指定的加密文件
java Aes_Rsa_Encrypt -e 數(shù)據(jù)文件名 加密文件名
(3) 對指定的加密文件中的內(nèi)容進行解密,并將結(jié)果寫出入指定的解密文件
java Aes_Rsa_Encrypt -d 加密文件名 解密文件名
本程序在JDK1.5下測試通過。
參考文獻:
[1] (美)Cay S.Horstmann,王建華,等譯. Java核心技術(shù)卷Ⅱ:高級特性[M].北京:機械工業(yè)計,20059.
[2] 丁玲,等. JAVA與網(wǎng)絡(luò)安全[J].科技信息(學(xué)術(shù)研究),2007,(17):201.
[3] 徐甜. Java平臺及應(yīng)用Java技術(shù)的安全問題研究[J].微計算機信息,2007,(18):216-218.
[4] 趙航濤,等. 我國電子商務(wù)中的安全問題及對策[J].無錫職業(yè)技術(shù)學(xué)院,2006,(3):76-78.